Multiboot

Aus Lowlevel
Version vom 21. Dezember 2007, 17:59 Uhr von Jgraef (Diskussion | Beiträge) (→‎mbs_syms: Rechtschreibfehler)
Wechseln zu:Navigation,

Multiboot ist ein Standard um Betriebssystemen eine einheitliche Startumgebung zu gewährleisten. Ein sehr bekannter Multiboot-Bootloader ist Grub.

Multiboot-Header

Der Multiboot-Header sollte in den ersten 8192 Bytes des OS-Images liegen. Der Multiboot-Header sieht folgendermaßen aus:

Offset Größe Inhalt Anwesend wenn mbh_flags[X] gesetzt
0x00 4 mbh_magic immer
0x04 4 mbh_flags immer
0x08 4 mbh_checksum immer
0x0C 4 mbh_header_addr 16
0x10 4 mbh_load_addr 16
0x14 4 mbh_load_end_addr 16
0x18 4 mbh_bss_end_addr 16
0x1C 4 mbh_entry_addr 16

mbh_magic

Dient Grub zum Finden des Multiboot-Headers. Sollte immer 0x1BADB002 sein.

mbh_flags

Bits 0-15 sind Flags die umbedingt benötigt werden. Wenn der Bootloader eines dieser Flags nicht kennt, bricht er den Bootvorgang ab. Bits 16-31 sind optionale Flags. Es gibt die folgenden Flags

Bit Auswirkung
0 Module werden 4k-aligned geladen
1 Ermittelt mbs_mem_lower und mbs_mem_upper. Wenn möglich auch mbs_mmap_length und mbs_mmap_addr
16 Informationen über das OS-Image werden aus den Feldern 0x0C-0x1C des Multiboot-Headers entnommen.

mbh_checksum

Ein u32-Wert der Zusammen mit mbh_magic und mbh_flags 0 ergeben soll. Man kann ihn so berechnen:

-(mbh_magic + mbh_flags)

Multiboot-Structure

Die Multiboot-Structure beinhaltet Informationen, die vom Bootloader verher ausgelesen wurden. Die Adresse der Multiboot-Structure ist unmittelbar nach dem Starten des Kernels in EBX gespeichert.

Offset Größe Inhalt Anwesend wenn mbs_flags[X] gesetzt
0x00 4 mbs_flags immer
0x04 4 mbs_mem_lower 0
0x08 4 mbs_mem_upper 0
0x0C 4 mbs_bootdevice 1
0x10 4 mbs_cmdline 2
0x14 4 mbs_mods_count 3
0x18 4 mbs_mods_addr 3
0x1C 16 mbs_syms 4 oder 5
0x2C 4 mbs_mmap_length 6
0x30 4 mbs_mmap_addr 6

mbs_flags

Gibt an welche Felder anwesend sind.

mbs_mem_lower

Gibt die Größe des unteren Speichers in kB an.

mbs_mem_upper

Gibt die Größe des höheren Speichers in kB an.

mbs_bootdevice

Dieses Doubleword ist in 4 Bytes unterteilt. Das 1. Byte steht für die BIOS-Laufwerknummer. Byte 2-4 gibt die Partition und Subpartition an. Wenn ein Wert 0xFF ist, wird keine Partitionierung (auf diesem Level) benutzt.

mbs_cmdline

Pointer zu einem 0-terminated ASCII-String, der die Kommandos enthält, die an den Kernel übergeben wurden.

mbs_mods_count

Gibt an wie viele Module von Grub geladen wurden

mbs_mods_addr

Pointer auf die erste Modulstruktur. Eine Modulstruktur sieht folgendermaßen aus:

Offset Größe Name Beschreibung
0x00 4 mod_start Adresse an der das Modul liegt
0x04 4 mod_end Adresse an der das Modul endet
0x08 4 string Pointer zu einem 0-term. ASCII-String, der den Namen des Moduls enthält
0x0C 4 reserved Reserviert (0)

mbs_syms

Wenn Bit 4 in mbs_flags gesetzt ist, liegt diese Struktur am Offset 0x1C und enthält Informationen zur Symboltabelle einer a.out-Datei.

Offset Größe Name Beschreibung
0x1C 4 tabsize
0x20 4 strsize
0x24 4 addr Pointer zur Symboltabelle
0x28 4 reserved Reserviert (0)

Wenn Bit 5 in mbs_flags gesetzt ist, liegt diese Struktur am Offset 0x1C und enthält Informationen zur Symboltabelle einer Elf-Datei.

Offset Größe Name Beschreibung
0x1C 4 num Anzahl an Einträgen
0x20 4 size Größe eines Eintrags
0x24 4 addr Pointer zur Symboltabelle
0x28 4 shndx

mbs_mmap_length

Gibt die Länge der Memorymap an

mbs_mmap_addr

Pointer zur Memorymap. Ein Eintrag in der Memorymap sieht folgendermaßen aus:

Offset Größe Name Beschreibung
-0x04 4 size Gibt die Größe des Eintrags an
0x00 8 BaseAddr Basisadresse des Speicherbereichs
0x08 8 Length Länge des Speicherbereichs
0x10 4 Type Typ des Speicherbereichs

Weblinks