#: Train-Os eine Schulungssitzung zum Aufbau eines Betriebssystems. Ausgehend von Grund auf, nur Ressourcen von AMD und Intel verwenden.
Immer noch in der Alpha -Bühne
Dieses Repository ist noch nicht poliert und muss im Alpha -Stadium noch angesehen werden. Der Code sollte kompilieren und funktionieren, aber das SMS ist nur der erste Entwurf, den ich feststellte, außer als ich codierte und recherchierte.
Was unterscheidet sich von anderen Tutorials?
Es gibt viele Tutorials und ein großer Teil des von mir vorhandenen Materials ist auch dort abgedeckt. Warum also die Mühe machen? Ich mag es besonders und habe mich von diesen inspirieren lassen:
- Phil Todo: Link
- Intermezzos: Todo: Link
Was unterscheidet sich in dieser Version? Wenn ich neue Dinge lerne, habe ich oft das Gefühl, dass ich nicht weiß/lerne , wie ich das das nächste Mal alleine getan habe. Ich weiß nicht, ob ich so lerne oder nur eine typische Sache, die beim Schreiben von Tutorials leicht weggelassen werden kann. Hier sind einige Punkte, über die ich mich regelmäßig wundere und die ich ansprechen möchte (ich werde wahrscheinlich andere wesentliche Dinge verpassen, um das auszugleichen).
- Geben Sie einige Details darüber an, welche Punkte einfach Konventionen sind, auf die vereinbart wurde, was ein Standard ist, was Architekturspezifische ist. Ich erinnere mich noch , als ich anfing, als Teenager das Programmieren zu lernen. Es war nur "Magie". Diese Dinge stören mich, ich möchte uder verstehen, woher die Dinge kommen ...
- Zeigen Sie auf den Standard und arbeiten Sie von dort aus. Ich werde keine fertige Lösung präsentieren, die Sie gerade kopieren. Wir nehmen den Standard und schauen tatsächlich nach etwas nach . Genau wie wir es tun müssten, wenn wir den Code auf einen ARM -Kortex anstelle Ihrer x86_64 -Maschine ausführen möchten. Oder, anders gerahmt, was wäre, wenn wir die ersten wären, die ein Tutorial schreiben würden, wie würden wir diesen Bootloader, die konfigurierten Interrupts oder die CPU in erster Linie in den 64-Bit-Modus bringen?
- Mach Dinge zweimal. Ich werde zuerst Barebones gehen, dies hilft zu verstehen, was passiert, und dann verwenden wir Tooling, um diese Bodarbeit jedes Mal zu vermeiden.
- Zwischenschritte und "Kontrollpunkte"
- Geben Sie zuerst einen Umriss ->, um das Gesamtbild zu sehen
- Geben Sie Beispiele zu echtem Code an -> zB, dass der erste Kernel -Bin tatsächlich genau so ist
- Präsentieren Sie Alternativen/Auswahlmöglichkeiten für jede
dependency , die wir verwenden. Für mich ist es Mist, wenn ich einem Tutorial folgen möchte und viele externe Bibliotheken die Magie machen, die ich eigentlich lernen wollte.
Gliederung
Eine grobe Übersicht darüber, was ich tun möchte. Hoffentlich in einer mehr oder weniger chronologischen Reihenfolge. Der Punkt ist, dass es so viel gibt, dass wir möglicherweise tun könnten, dass es tatsächlich ziemlich schwierig ist, einen Weg zu wählen.
Erstens möchte ich den Boot -Prozess besser verstehen. Was passiert, bevor der Bootloader hineinspringt. Tatsächlich ist es für sich selbst eine große Aufgabe, Ihren eigenen Bootloader (Link zu OSDEV) zu rollen.
Mein Plan ist es, die frühe Phase im Startprozess ein wenig zu untersuchen. Das Ziel ist es, zu verstehen und zu schätzen, was ein Bootloader für uns tut. Am Ende möchte ich ein grobes Verständnis der verschiedenen Prozessormodi, dem, was sie anbieten und wie man in den 32-Bit-Schutzmodus wechselt. Das konkrete Ziel ist es, in den geschützten Modus umzusteigen und Hello World! auf den Bildschirm. Alles in der Montage und ohne den Startader implementiert.
Danach habe ich vor, GRUB als Bootloader zu wechseln und zu verwenden. Und weiter von dort.
Tl; dr
- Schreiben Sie ein minimales bootfähiges Bild.
- Bootloader, der
Hello World im 16-Bit-echten Modus druckt. - Wechseln Sie manuell in den 22-im-Bin-Schutzmodus und drucken Sie
Hello World . - Wechseln Sie manuell in den 64-Bin-Long-Modus
- Verwenden Sie Grub als Bootloader und drucken Sie
Hello World . - Wechseln Sie (wieder) in den langen Modus.
- Spring in
C , drucken Sie Hello World . - Stapel
- Implementieren Sie VGA -Videotreiber.
- Interrupts (Teil 1) - Sagen Sie CPU, wo man Handler in ASM findet
- Interrupts (Teil 2) - Code von 10. über c nach c verschieben
- Implementieren bessere Handler
- Debuggen
- Behandeln Sie Interrupts/Ausnahmen
- Speicherpaging implementieren.
- REMAP -Kernel
nicht spezifiziert:
- Refactoring?
- Dienstprogramme (Memset?)
Später...
- Dateisystem
- Prozesse
- Planung
- Systemaufrufe
- Erkunden Sie den Stapel, provoke Stack -Überläufe und Ausnahmen
- Verbinden Sie sich mit GDB über UART (zum Debuggen und eingebettete Vorschau)
- Kompilieren Sie einige (oder viele) Teile an einen Armprozessor. (Ich habe ein STM- und Infineon -Board, der ungenutzt herumliegen)
Voraussetzungen?
Keiner. Ernsthaft, haben Sie keine Angst. Der springende Punkt dieses Tutorials besteht darin, alle erforderlichen Kenntnisse von Grund auf zu entwickeln. Es gibt nur eine Bedingung, die ich annehme, und das heißt, Sie können anständig programmieren. Mit ordentlich meine ich, dass Sie zumindest von Stapel und Haufen gehört haben und in einer Sprache produktiv sein können. Ich denke, das sollte genug sein. Schließlich versuchen wir nicht, das Mainstream -OS des nächsten Gens hier zu entwickeln, sondern auf einem Hobby -Niveau.
Und eins kann ich Ihnen versichern: Auch wenn Sie diesen Code nie wieder berühren und niemals ein Betriebssystem schreiben werden. Die Erfahrung verändert Ihr Verständnis der Systeme, an denen Sie tief arbeiten. Das Wissen, das sich aus der Entwicklung auf Kernelebene entwickelt hat, spreizt sich während Ihrer gesamten Karriere wie Samen und die Erkenntnisse werden sich in den unerwartetsten Momenten als nützlich erweisen.
Scratchpad (unorganisierte Ideen von hier an)
Ideen
- Was macht die CPU, wenn Sie nach den ersten 512 Bytes Anweisungen stellen? Sind sie ausgeführt? (Die CPU befindet sich im 16-Bit-Realmodus)
Gliederung
- Bootload -> Zwei Möglichkeiten rollen Ihre eigenen oder verwenden Sie vorhanden, z. B. GRUB.
- 16 -Bit -Modus
- Eingabe des 32 -Bit -Schutzmodus
- Eingabe des 64 -Bit -Long -Modus
- Geben Sie c
- Schreiben Sie das Speicher -Manager -Modul
Zyklus 0 - Umgebung und Cross -Compilation Toolchain
- Sie können einige Schritte überspringen. Wir werden nicht die Cross -Compilation -Toolchaine benötigen, bevor wir mit dem Schreiben von C -Code beginnen.
- Bauen Sie Ihre Toolchain irgendwo unter $ Home auf
- Stellen Sie sicher, dass der Umfang der Umgebungsvariablen korrekt ist
- Fehler wie die Erstellung von Verzeichnis
/usr/lib/i686-elf geben an, dass $PREFIX nicht korrekt eingestellt ist. - Wir bekommen nicht die "echte" Barebones -CPU, es gibt immer noch das BIOS vor uns. Es initialisiert die CPU und überträgt uns im realen Modus die CPU.
Zyklus 0 - Bootloader
Ressourcen
- NASM -Dokumentation https://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- Intelhandbücher