Bonjour, Habr!
Je m'appelle Victor et cette année, je suis le seul étudiant du programme Google Summer of Code sur le projet ReactOS. Aujourd'hui, je vais vous parler un peu de ce que je fais dans le cadre du stage.
ReactOS prend en charge un tas de toutes sortes de systèmes de fichiers différents pour la lecture et l'écriture (fat32, ext2,
ReiserFS ,
BTRFS ), mais il ne peut toujours démarrer qu'à partir d'une partition formatée en fat32. Ce printemps, j'ai décidé qu'il était temps de commencer à corriger cette situation et j'ai demandé le GSoC. Et donc, quelques mois plus tard, j'écris ce post :)
Pourquoi BTRFS? La réponse est simple: le
pilote du système de fichiers
WinBtrfs est actuellement le plus stable et le plus fonctionnel de tous ceux qui sont inclus dans le code ReactOS. À ce stade, nous voulons corriger les bogues du noyau qui empêchent d'autres FS d'utiliser pour le chargement, donc les bogues du pilote FS nous sont complètement inutiles.

Mais je devais partir non pas du noyau du système d'exploitation, mais du programme d'installation. Heureusement, presque tout était prêt pour l'installateur: il suffisait d'activer le téléchargement du pilote WinBtrfs dans notre installateur (usetup) et d'ajouter quelques lignes de code pour prendre en charge le formatage dans le système de fichiers nécessaire. Après quoi j'ai pu (presque) facilement copier les fichiers ReactOS sur la partition formatée en BTRFS.
Ils ont rapidement traité l'installateur, mais la tâche suivante est beaucoup plus intéressante. Le chargeur ReactOS - FreeLdr prend en charge presque seulement deux systèmes de fichiers - fat32 et iso (il existe du code pour ext2 et ntfs, mais personne n'a essayé de l'exécuter depuis environ 5 ans maintenant). Puisque FreeLdr répète le principe du chargeur de démarrage ntldr de MS, il se compose de deux parties - le secteur de démarrage au début de la section où le MBR est transféré sur le disque, et la partie principale, qui met le processeur en mode protégé, charge le noyau ntoskrnl.exe en mémoire, et ne un tas de tout.
(voici à quoi ressemble le processus de démarrage de ReactOS)Ainsi, pour prendre en charge le nouveau système de fichiers, vous devez écrire l'enregistrement de démarrage de la partition (VBR), dont la tâche consiste à trouver le fichier exécutable de la partie principale du chargeur de démarrage (nous l'appelons freeldr.sys) dans le répertoire racine du disque, le charger en mémoire et y transférer le contrôle. Mais ce n'est pas tout, freeldr.sys lui-même a besoin d'un pilote de système de fichiers en lecture seule presque complet pour lire les fichiers de configuration, le noyau, les buissons de registre, etc.
Tout d'abord, vous deviez gérer le système de fichiers BTRFS lui-même. Avant cela, les choses les plus difficiles que j'ai choisies étaient fat32 et ext2, il m'a donc fallu beaucoup de temps pour apprendre la moissonneuse BTRFS. La documentation sur
wiki.kernel.org aide à le comprendre, mais pour bien comprendre ce n'était pas suffisant - vous deviez aller aux sources de grub, u-boot et d'autres chargeurs de démarrage. L'
utilitaire python que j'ai écrit pour sortir les structures du système de fichiers sur la console s'est avéré très utile pour étudier la structure du système de fichiers. En l'utilisant, j'ai écrit le premier prototype du secteur de démarrage, qui tire le chargeur de démarrage d'un fichier binaire avec une image disque avec le système de fichiers BTRFS.
(les éléments du répertoire racine sont visibles dans l'image)Il est maintenant temps pour le vrai secteur de démarrage. Il est compliqué par le fait que nous travaillons ici en mode processeur réel avec toutes les conséquences qui en découlent (~ 1 Mo de mémoire, adressage segmenté et travailler avec un disque via des interruptions du BIOS). Étendue pour les fans de la vieille école comme moi :)
Dans les structures BTRFS, presque tous les champs ont une taille de 64 bits, ce qui est un code très «gonflé», car les instructions x86 32 bits ont dû être activement utilisées. Souvent, vous devez utiliser des constructions comme:
mov si, SOME_OFFSET lea si, [esi+ecx*8] lea si, [esi+ecx*8] lea si, [esi+ecx*8] // one element is 24 bytes long
La tâche la plus longue a été d'écrire la procédure de traversée de l'arbre b, il a fallu le plus de temps pour la déboguer. Et après plusieurs nuits blanches, j'ai quand même réussi à obtenir le message d'erreur convoité de la deuxième étape de téléchargement:

freeldr.sys a réussi à se charger avec succès dans la mémoire et n'a même pas eu besoin d'utiliser la magie comme le
mode Unreal . 640kb est suffisant pour tout le monde!
Le code du secteur de démarrage peut être consulté dans mon référentiel
github (le refactoring est toujours en attente), et tout le travail sur BTRFS dans
ce fil.
C'est maintenant le tour de la deuxième partie du chargeur de démarrage - vous devez lui apprendre à lire le fichier de configuration à partir du nouveau système de fichiers. Suivez l'actualité!