Hallo Habr!
Mein Name ist Victor und dieses Jahr bin ich der einzige Student im Google Summer of Code-Programm für das ReactOS-Projekt. Heute werde ich Ihnen ein wenig darüber erzählen, was ich im Rahmen des Praktikums mache.
ReactOS unterstützt eine Reihe verschiedener Dateisysteme zum Lesen und Schreiben (fat32, ext2,
ReiserFS ,
BTRFS ), kann jedoch weiterhin nur von einer in fat32 formatierten Partition gestartet werden. In diesem Frühjahr entschied ich, dass es Zeit war, diese Situation zu korrigieren, und beantragte GSoC. Und so schreibe ich ein paar Monate später diesen Beitrag :)
Warum BTRFS? Die Antwort ist einfach: Der
WinBtrfs- Dateisystemtreiber
ist derzeit der stabilste und voll funktionsfähigste aller im ReactOS-Code enthaltenen. In diesem Stadium möchten wir die Kernel-Fehler beheben, die verhindern, dass andere FS zum Laden verwendet werden. Daher sind FS-Treiberfehler für uns völlig nutzlos.

Aber ich musste nicht vom Betriebssystemkernel starten, sondern vom Installationsprogramm. Glücklicherweise war fast alles für das Installationsprogramm bereit: Alles, was benötigt wurde, war, den WinBtrfs-Treiber-Download in unserem Installationsprogramm zu aktivieren (usetup) und ein paar Codezeilen hinzuzufügen, um die Formatierung im erforderlichen Dateisystem zu unterstützen. Danach konnte ich die ReactOS-Dateien (fast) einfach auf die in BTRFS formatierte Partition kopieren.
Sie haben sich schnell um den Installer gekümmert, aber die nächste Aufgabe ist viel interessanter. Der ReactOS-Loader - FreeLdr unterstützt fast nur zwei Dateisysteme - fat32 und iso (es gibt Code für ext2 und ntfs, aber seit etwa 5 Jahren versucht niemand mehr, ihn auszuführen). Da FreeLdr das Prinzip des ntldr-Bootloaders von MS wiederholt, besteht es aus zwei Teilen - dem Bootsektor am Anfang des Abschnitts, in dem der MBR auf die Festplatte übertragen wird, und dem Hauptteil, der den Prozessor in den geschützten Modus versetzt, lädt den Kernel ntoskrnl.exe in den Speicher und tut dies ein Haufen von allem.
(So sieht der ReactOS-Startvorgang aus)Um das neue Dateisystem zu unterstützen, müssen Sie den Startdatensatz der Partition (VBR) schreiben, dessen Aufgabe es ist, die ausführbare Datei des Hauptteils des Bootloaders (wir nennen sie freeldr.sys) im Stammverzeichnis der Festplatte zu finden, in den Speicher zu laden und dort die Steuerung zu übertragen. Aber das ist noch nicht alles. Freeldr.sys selbst benötigt einen fast vollständigen schreibgeschützten Dateisystemtreiber, um Konfigurationsdateien, den Kernel, Registrierungsbüsche usw. lesen zu können.
Zuerst mussten Sie sich mit dem BTRFS-Dateisystem selbst befassen. Zuvor waren die schwierigsten Dinge, die ich ausgewählt habe, fat32 und ext2, daher habe ich viel Zeit gebraucht, um den BTRFS-Harvester zu lernen. Die Dokumentation auf
wiki.kernel.org hilft dabei, es herauszufinden, aber um es vollständig zu verstehen, reichte es nicht aus - Sie mussten zu den Quellen von Grub, U-Boot und anderen Bootloadern gehen. Das Python-
Dienstprogramm , das ich geschrieben habe, um die Dateisystemstrukturen an die Konsole auszugeben, erwies sich als sehr nützlich, um die Struktur des Dateisystems zu untersuchen. Damit habe ich den ersten Prototyp des Bootsektors geschrieben, der den Bootloader aus einer Binärdatei mit einem Disk-Image mit dem BTRFS-Dateisystem abruft.
(Elemente des Stammverzeichnisses sind im Bild sichtbar)Jetzt ist es Zeit für den echten Bootsektor. Es wird durch die Tatsache erschwert, dass wir hier in einem realen Prozessormodus mit allen sich daraus ergebenden Konsequenzen arbeiten (~ 1 MB Speicher, segmentierte Adressierung und Arbeiten mit einer Festplatte über BIOS-Interrupts). Weite für Fans der alten Schule wie mich :)
In BTRFS-Strukturen sind fast alle Felder 64-Bit groß, was ein sehr "aufgeblähter" Code ist, da 32-Bit-x86-Anweisungen aktiv verwendet werden mussten. Oft muss man Konstruktionen verwenden wie:
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
Die zeitaufwändigste Aufgabe war das Schreiben der B-Tree-Traversal-Prozedur. Das Debuggen dauerte am meisten. Und nach mehreren schlaflosen Nächten gelang es mir immer noch, die begehrte Fehlermeldung aus der zweiten Download-Phase zu erhalten:

freeldr.sys konnte erfolgreich in den Speicher geladen werden und musste nicht einmal Magie wie den
unwirklichen Modus verwenden . 640kb ist genug für alle!
Der Bootsektorcode kann in meinem
Github- Repository
angezeigt werden (das Refactoring wartet noch darauf) und die gesamte Arbeit an BTRFS in
diesem Thread.
Jetzt ist der zweite Teil des Bootloaders an der Reihe - Sie müssen ihm beibringen, die Konfigurationsdatei aus dem neuen Dateisystem zu lesen. Folgen Sie den Nachrichten!