Seitenleiste

Der Bootvorgang

Oder: Wie starte ich einen Kernel?

Theorie: Booten, was ist das?

Bevor wir irgendeinen Code schreiben müssen wir uns ersteinmal Gedanken darüber machen, was denn nun passiert, wenn wir auf den Knopf am Computer drücken.

Nunja: Der Computer startet.

Aber wie? Was ist zu tun? Warum ist das zu tun?

Wie Code ausführen?

Zuerst einmal sollten wir uns Gedanken machen, wie wir den Computer dazu bringen, dass zu tun, was wir möchten. Wir können unseren Code schreiben und compilieren. Was wir nicht so einfach können, ist unseren Code beim starten auszuführen. Wenn wir den Computer starten, ist ja kein Betriebssystem geladen. Und es ist Aufgabe eines Betriebssystems, dem Prozessor Code zur Ausführung bereitzustellen.

Wie bekommen wir dann unseren Code gestartet?
Dazu müssen wir unseren Code in den Speicher laden. Dazu brauchen wir aber wiederum eine Art Programm, dass das für uns macht. Dieses „Programm“ ist der Bootloader. Er lädt den Kernel in den Speicher und weist dann den Prozessor an, den Code auszuführen.

Aber wie starten wir den Bootloader?
Nunja. Wenn der Computer startet, wird je der erste Sektor (sog. Bootsektor) der einzelnen Speicher (Festplatten, CD's, je nach Computer und BIOS-Einstellungen) auf ausführbaren Code durchsucht. Wird Code gefunden, dann wird dieser ausgeführt.

Nun könnten wir unseren Kernel ja in diesen ersten Sektor schreiben. Wäre möglich. Einziges Problem hierbei: Der erste Sektor hat eine begrenzte Größe von 512 Byte. Das ist nicht viel…

Also schreiben wir einen Bootloader in diesen ersten Sektor, der uns dann den Kernel lädt.

Wie geht's dem Prozessor?

Wenn wir den Computer starten befindet sich der Prozessor vorerst in einem Startmodus. Dieser Modus ist eine Art Ur-Alt-Modus. Dieser Modus, genannt Real Mode, arbeitet nur mit 16 Bits zur Adressierung. Er unterstützt außerdem eine ganze Reihe von Funktionen nicht, die wir im weiteren Verlauf noch besprechen werden. Ältere (wirklich alte) CPUs unterstützen nur diesen Modus. Wir werden uns aber nicht lange im Real Modus aufhalten und nicht länger darauf eingehen.

Wir sollten diesen Modus also schnellst möglich verlassen. Der „über“ dem Real Modus stehende Modus ist der sogenannte Protected Mode. Der Protected Mode bietet uns einige nützliche Funktionen, die wir nicht ungenutzt lassen wollen.

Damit wir den Protected Mode nutzen können, müssen wir eine Global Descriptor Table (GDT) laden. Was das ist, werde ich später noch erklären.
Außerdem ist es sinnvoll eine Interrupt Descriptor Table (IDT) zu laden. Eine Erklärung hierzu kommt auch noch später.

Halten wir kurz einmal den gesamten Bootvorgang fest:

  • Knopf wird gedrückt
    • Prozessor befindet sich im Real Mode
  • Code wird aus einem Bootsektor geladen
  • Prozessor in den Protected Mode wechseln
    • Gültige GDT laden
  • IDT laden

Das sollte uns vorerst einmal beschäftigen.

GRUB - Hilfe naht

Damit wir nicht alles komplett selbst erledigen müssen, wäre ein netter Helfer gerne gesehen. GRUB (Grand Unified Bootloader) kann uns bei Vielem behilflich sein. So wechselt GRUB für uns schon in den Protected Mode und stellt eine „Übergangs-GDT“ auf. Außerdem ist es mit GRUB's Hilfe für uns deutlich einfacher, unseren Kernel zu laden.

Wir werden also für unseren Kernel GRUB verwenden.