Dies ist das erste Betriebssystem, das ich erstellt habe. Es ist in zwei Sprachen geschrieben: c Sprache und Versammlung.
Dieses Projekt wird seit dem 15. Dezember 2017 aktiviert

Arbeitsplan
Bootloader
Brauch
Bootsektor
Stufe 2
RODEN
Kernel
Speicherverwaltung
Seitenrahmen Allocator
Dynamische Speicherzuweisung
Gebäudesystem
Schreiben Sie Text an VGA
CPU Interrupt (IDT, ISRS, IRQs usw.)
Lesen Sie das Zeichen von der PS/2 -Tastatur
Lesen Sie die Zeichenfolge von der PS/2 -Tastatur
Virtueller Speicher (Paging, Frames usw.)
Seitenrahmenzuweisung und Entlastung
Dynamische Speicherzuweisung (LIBALOC)
CPU -Timer
Holen Sie sich CPU -Informationen
Echtzeituhr: Wir können also wissen, wann der Film beginnt
Kernel -Stapelspur
Multitasking
Benutzermodus Prozesse
Festplattenfahrer
Diskettenfahrer
Dateisystem
Grafische Benutzeroberfläche
Dieses Betriebssystem verwendet einen 2-betroffenen Bootloader. Falls in der zweiten Stufe der geschützte Modus eingegeben und Kernel aufgerufen hat.
Die ersten 512 Bytes meines Floppy -Bildes enthält den Startsektor, der viele Dinge erledigt, die der geschützte Modus nicht tun kann. (zB laden Sachen von der Festplatte). Dann springt es in die zweite Stufe, die bei 0x7E00 geladen ist (kurz nach dem Startsektor).
In dieser Stufe wird der GDT geladen und fährt den geschützten Modus ein. Anschließend kopiert er den Kernel, der vom Startsektor unter 0x1000 bis 0x100000 (1 MB) geladen wird. Endlich!
Die Größe des Kernels wächst immer, aber ich kann die Sektoren nicht immer erhöhen. Als Lösung. Ich entscheide mich für GRUB. Der Kernel wird als Elf -Bild ( kernel.img ) in einer CD gespeichert, die ISO 9660 als Dateisystem verwendet. GRUB unterstützt auch Multiboot, sodass mein Betriebssystem mit anderen zusammenarbeiten kann (Windows, Linux usw.).
Wir haben den geschützten Modus eingegeben, was bedeutet, dass wir keinen Zugriff auf BIOS -Funktionen haben. Dieser Kernel muss also diese Funktionen zur Steuerung der Hardware erneut implementieren.
Jetzt habe ich Standardgeräte neu implementiert: Bildschirm und Tastatur. In der weiteren Entwicklung. Ich werde Disktrinker implementieren.
Dieses Betriebssystem verwendet sowohl Segmentierung als auch Paging, um Speicherschutz zu bieten. In meiner globalen Deskriptortabelle habe ich 5 Segmentdeskriptoren eingestellt:
Nullsegment
Codesegment für Kernel : Das Segment, zu dem mein Kernelcode gehört
Datensegment für Kernel : Das Segment, zu dem meine globalen Variablen meiner Kernel gehören
Codesegment für Benutzer : Derzeit nicht verwendet
Datensegment für Benutzer : Gleich wie 4
Ich aktiviere auch Paging. Jetzt habe ich die vierte Seite in der ersten Seite absichtlich not-present und read-only , sodass Sie einen Seitenfehler generieren können, indem Sie die Eingabe von bsod in die Befehlszeile meines Betriebssystems ausführen.

Dieser Kernel bietet einen Seitenrahmen -Allocator , sodass die Speicherverwaltung bequemer ist und ich einfacher zu Multitasking angehen kann.
Wie Jamesms Tutorial schon sagt, werde ich ein Bitset verwenden, um festzustellen, ob ein Rahmen frei ist oder nicht.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
Ich habe derzeit ein MALOC für Platzierung ohne freie implementiert, da alle von Kernel verwendeten Variablen bis zum Ausschalten nie freigelassen werden müssen.
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
Da ich faul bin, posiere ich einen Memory -Allocator von Drittanbietern namens liballoc , der nur wenige Funktionen in meinem Betriebssystem erforderte.
Dieses Projekt verwendet GNU Make, um zu bauen. Der Weg zum Erstellen besteht also darin, zu make , wenn Probleme während des Builds auftreten, type make dep bevor make . Öffnen Sie ein Problem, wenn Sie noch stecken.
Wenn Sie Linux oder WSL (Windows -Subsystem für Linux) nicht verwenden, müssen Sie hier einen Cross -Compiler herunterladen. Ändern Sie dann CC und LD in config.mk .