X86 -basiertes Betriebssystem für Lernzwecke von Grund auf neu erstellt
int 64 wodurch Gate -Deskriptoren für die Berechtigungskalation erforderlich sindZum Bau eines Betriebssystems (unter der Annahme von GCC, NASM installiert),
makeUnter Qemu laufen
make qemuAusführen (unter der Annahme von Bochs, bochs-sdl installiert),
make runMit Debugging Support (GDB) unter QEMU zu laufen
make qemu_gdb(Anhängen von GDB, erforderliche Befehle, die bereits in der .gdbinit -Datei in der oberen Ebene angegeben sind.)
BIOS startet den Prozessor im 16-Bit-Realmodus, GRUB initiiert den 32-Bit-Modus. Das Kernel -Elf -Bild wird mit Multiboot -Header gemäß der GRUB -Spezifikation versehen. Wenn GRUB diesen Header in den ersten 512 Bytes Bild findet, lädt es ELF bei 0x100000 Ort, der niedrigere Speicher gehört zu BIOS und anderen Hardware-/IO -Mappings wie VGA. BOOTUP -Code, ausgeführt aus _start von Kernel und (Anmerkung BSS ist bereits mit GRUB initialisiert).
Einfache first-fit -Strategiespeicher-Allocator weist den Speicher aus dem Kernelraum zu free verwaltet auch die Verdichtung benachbarter freier Blöcke.
Für UserSpace Mallloc/Free werden die intern verwendeten sbrk -Systemaufrufe zur Erhöhung der Systemunterbrechung (falls erforderlich) bereitgestellt. Kernel benötigt die Setups und Renditen von Seitenstabs und Returns erhöht die Systemunterbrechungsgrenze.
Dies ist in Kernel Space Memory Mapping und Benutzerspeicherspeicherzuordnungen unterteilt. Kernel -Weltraum -Zuordnungen bleiben konstant und sind Teil jedes Prozessadressenraums, der nur nicht kloniert ist, da Änderungen von einem Prozess im Kernelraum auch andere Prozesse sichtbar sein sollten.
Die Zuordnungen für den Benutzerraum hängen vom exec -Anruf ab, und jeder Prozess verfügt über einen eigenen Kernel sowie einen Benutzerstapel.
Während des Kontextschalters wird das CR3 -Register mit der aktuellen Basisadresse für Prozess -Seiten -Verzeichnisse geladen, die auch die TLB (Übersetzungs -Lookaside -Puffer) intern ungültig machen.
Benutzerraumanwendungen werden in initramfs gespeichert, einem CPIO -Format -Archiefe im Standard -ELF -Format. Während exec -Kernels findet und Parse Elf Image, setzt seine Seitentabellen entsprechend ein. Init -Prozess startet nur shell und hängt dann für immer dort drin.
Scheduler läuft im Namen des aktuell ausführenden Prozesses, hauptsächlich in zwei Fällen.
Der Kernel -Modus -Code/Datensegmente sind separat als Benutzermodus -Code/Datensegmente, wobei die Berechtigungsstufen entsprechend programmiert sind. Bei der Rückkehr aus der Ausnahme taucht Hardware CS (Code -Segment) und SS (Stack -Segment) von Stack auf, um auf niedrigere Privilegienebene zurückzukehren.
Wir programmieren diesen Stack -Frame entsprechend und erstellen Sie neue Aufgaben.
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;X86-Hardware bietet integrierte Unterstützung für das Umschalten von Aufgaben und wechselt im Grunde genommen vom Benutzerstapel zum Kernel-Stack zusammen mit anderen Segmentierungsparametern. Dazu muss jede Aufgabe mit eigenem TSS eingerichtet werden, das während des Kontextschalts geändert wird. Wir werden nicht Hardware -Aufgabenschaltungen verwenden, sondern auch in der Software selbst. In jedem Fall müssen wir mindestens ein TSS einrichten, das einen gültigen Kernel-Modus-SS (Stack-Segment) und ESP (Stack-Zeiger) für die aktuelle Aufgabe enthält.
Zufällige FAQ
Fühlen Sie sich frei, die Anfrage für die Zusammenführung zu geben und zu senden