Nachdem es mir gelungen ist, einen Multiboot ELF Kernel zu programmieren, zu kompilieren und zu linken, habe ich mich damit beschäftigt, wie ich diesen Kernel zur Ausführung bringe. Das kann in einer virtuellen Maschine, z. B. QEMU geschehen oder direkt von dem Hostrechner (in meinem Fall ein Mac Book Pro Mitte 2010) übernommen werden.

Den Kernel mit QEMU direkt starten

QEMU (Version 1.5.0) kann einen Multiboot Kernel direkt starten. Jedoch hat QEMU einen Fehler. Nach einem Kommentar von Martijn van den Broek (https://bugs.launchpad.net/qemu/+bug/1208944), lädt QEMU eine ELF Datei nicht, wenn diese Datei eine leere .bss Section hat und gibt stattdessen eine Fehlermeldung aus. Eine Möglichkeit diesen Fehler zu umgehen ist, die .bss Section vollständig wegzulassen oder zu löschen (wie in meinem Fall). Dieses lässt sich z. B. direkt in der .asm Datei erledigen (wenn es nur eine einzige Datei und auch sonst keine weitere C-Codedateien gibt). Ich habe hier mit wenig Aufwand die .bss Section mit // auskommentiert.

Starten lässt sich der Kernel mit:

qemu -kernel ./kernel

Den Kernel mit QEMU und GRUB

Man kann mit QEMU auch eine Festplatte oder Floppy Disc Booten. „The All In One Boot Floppy 1.0“ ist ein Floppy Disk Image mit einem GRUB Bootloader. Download (http://rescup.winbuilder.net/bootdisk/). Um den Kernel zu erreichen sollte man das Image mounten und den Kernel in das Image kopieren. Danach kann man mit folgenden Befehlen den Kernel mit GRUB laden.

  1. qemu -fda ./allinone.img
  2. Auf Load GRUB2 (comand line mode) gehen.
  3. Mit Tab-Taste Hilfe/Befehle anzeigen lassen
  4. Mit ls (fd0)/ Image Inhalt anzeigen lassen
  5. multiboot /kernel oder multiboot (fd0)/kernel lädt den Kernel
  6. Mit boot den Kernel starten

Multiboot-Header Magic-Numbers

#define MB_MAGIC 0x1badb002 //Version 0.6.96
#define MB_MAGIC 0xe85250d6 //Version 1.6