5 Stimmen

Wie man QEMU richtig mit Multi-Boot-Headern verwendet

Ich lerne die Grundlagen der Betriebssystemerstellung. Ich habe eine mehrfache Startkopfzeilen-konforme .asm-Datei und eine .c-Datei erstellt. Der Code in der .asm-Datei ruft die Hauptfunktion der .c-Datei auf.

Das Problem ist, dass QEMU nicht in der Lage ist, von der nach der Kompilierung und Verknüpfung der .asm- und .c-Datei erstellten Datei zu booten.

Es sagt einfach, dass es kein bootfähiges Gerät finden kann.

Obwohl ich von einer einfachen .asm-Datei aus booten kann wie z.B.:

mov ax, 0x0e
mov al, 'H'
int 10h
times 510 - ($ - $$) db 0
jmp $
dw 0xaa55

Muss ich noch etwas Bestimmtes tun?

11voto

QEMU 2.0.0 unterstützt Multiboot

man qemu sagt:

-kernel bzImage

Verwenden Sie bzImage als Kernel-Abbild. Der Kernel kann entweder ein Linux-Kernel oder im Multiboot-Format sein.

Ich habe ein minimales "Hello World"-Beispiel unter folgendem Link hochgeladen: https://github.com/cirosantilli/x86-bare-metal-examples/tree/dbbed23e4753320aff59bed7d252fb98ef57832f/multiboot

Es generiert eine GAS + C Multiboot-Datei und verwendet QEMU, um sie auszuführen.

grub-mkrescue kann auch eine Multiboot-Datei in ein bootfähiges .iso-Abbild umwandeln, was ein weiterer guter Ansatz ist.

Barry erwähnt, dass Multiboot2 nicht unterstützt wird. Wie man ein Multiboot2-Abbild erzeugt, falls man es testen möchte: Wie kompiliert man den einfachen Kernel gemäß dem Multiboot2-Spezifikation korrekt?

-1voto

Drew McGowen Punkte 11186

QEMU unterstützt Multiboot nicht nativ. Stattdessen müssen Sie ein virtuelles Festplattenimage erstellen und einen Multiboot-Bootloader installieren (z. B. grub) und dann Ihr Multiboot-Image irgendwo auf der Festplatte platzieren (z. B. in einer Datei auf einer Partition).

Was die Installation von grub auf einer virtuellen Festplatte betrifft, gibt es mehrere Möglichkeiten, dies zu tun, aber hier ist der Prozess, den ich immer verwende:

  1. Verwenden Sie qemu-img oder dd if=/dev/zero, um Ihr HDD-Image zu erstellen.
  2. Laden Sie eine Linux-Installer-ISO herunter (ich verwende typischerweise Arch Linux).
  3. Starten Sie qemu mit dem leeren HDD-Image und der ISO unter Verwendung von -hda -cdrom -boot once=d. Der letzte Teil stellt sicher, dass qemu zuerst von der CD booten wird.
  4. Verwenden Sie fdisk/parted/etc, um die Festplatte zu formatieren.
  5. Hängen Sie Ihre Boot-Partition (die, auf der Sie grub installieren möchten) ein und verwenden Sie grub-install.
  6. Hängen Sie sie ab und fahren Sie den Emulator herunter.

Dann können Sie von dem HDD-Image booten und grub oder einen anderen Loader Ihrer Wahl verwenden, um Ihr Multiboot-Image zu booten.


Der Grund, warum Ihr einfaches ASM-Beispiel funktioniert, liegt darin, dass Sie effektiv den MBR emulieren, den ersten Sektor einer typischen Festplatte, damit das BIOS von QEMU davon bootet (speziell erkennt es die Signatur 0xaa55).

-1voto

n00ax Punkte 307

Nein, QEMU hat native Unterstützung für die alte Multiboot-Spezifikation, obwohl es VBE nicht unterstützt, usw.. Kompilieren Sie einfach von einem freistehenden Compiler mit dem richtigen Legacy-Multiboot-Header in eine ELF-Ausführbare Datei und führen Sie sie mit der Option -kernel aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X