| Zeile 1: | Zeile 1: | ||
Multiboot ist ein Standard um Betriebssystemen eine einheitliche Startumgebung zu gewährleisten. Ein sehr bekannter Multiboot-Bootloader ist [[Grub]]. | Multiboot ist ein Standard um Betriebssystemen eine einheitliche Startumgebung zu gewährleisten. Ein sehr bekannter Multiboot-Bootloader ist [[Grub]]. | ||
| + | |||
| + | == Ausgangsstatus == | ||
| + | Unmittelbar nachdem die Kontrolle von Grub an den Kernel übergeben wurde, sind folgende Zustände festgesetzt: | ||
| + | {| border="1" | ||
| + | | EAX || Beinhaltet magicnumber 0x1BADB002 | ||
| + | |- | ||
| + | | EBX || Pointer zur Multiboot-Structure | ||
| + | |- | ||
| + | | CS || Ein Codesegment mit der Basisadresse 0 und der Größe 0xFFFFFFFF | ||
| + | |- | ||
| + | | DS || Ein Datensegment mit der Basisaddresse 0 und der Größe 0xFFFFFFFF | ||
| + | |- | ||
| + | | ES || Ein Datensegment mit der Basisaddresse 0 und der Größe 0xFFFFFFFF | ||
| + | |- | ||
| + | | FS || Ein Datensegment mit der Basisaddresse 0 und der Größe 0xFFFFFFFF | ||
| + | |- | ||
| + | | GS || Ein Datensegment mit der Basisaddresse 0 und der Größe 0xFFFFFFFF | ||
| + | |- | ||
| + | | SS || Ein Datensegment mit der Basisaddresse 0 und der Größe 0xFFFFFFFF | ||
| + | |- | ||
| + | | A20 Gate || A20 Gate ist enabled | ||
| + | |- | ||
| + | | CR0 || Bit 31 (PG) ist zurückgesetzt. Bit 0 (PE) ist gesetzt. Alle anderen Bits sind undefiniert. | ||
| + | |- | ||
| + | | EFLAGS || Bit 17 (VM) und Bit 9 (IF) ist zurückgesetzt. Alle anderen Bits sind undefiniert. | ||
| + | |} | ||
== Multiboot-Header == | == Multiboot-Header == | ||
| Zeile 21: | Zeile 47: | ||
|- | |- | ||
| 0x1C || 4 || mbh_entry_addr || 16 | | 0x1C || 4 || mbh_entry_addr || 16 | ||
| + | |- | ||
| + | | 0x20 || 4 || mbh_mode_type || 2 | ||
| + | |- | ||
| + | | 0x24 || 4 || mbh_mode_width || 2 | ||
| + | |- | ||
| + | | 0x28 || 4 || mbh_mode_height || 2 | ||
| + | |- | ||
| + | | 0x2C || 4 || mbh_mode_depth || 2 | ||
|} | |} | ||
| Zeile 45: | Zeile 79: | ||
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. | 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. | ||
{| border="1" | {| border="1" | ||
| − | ! Offset || Größe || Inhalt | + | ! Offset || Größe || Inhalt || Anwesend wenn mbs_flags[X] gesetzt |
|- | |- | ||
| − | | 0x00 || 4 || [[#mbs_flags | mbs_flags]] | + | | 0x00 || 4 || [[#mbs_flags | mbs_flags]] || immer |
|- | |- | ||
| − | | 0x04 || 4 || [[#mbs_mem_lower | mbs_mem_lower]] | + | | 0x04 || 4 || [[#mbs_mem_lower | mbs_mem_lower]] || 0 |
|- | |- | ||
| − | | 0x08 || 4 || [[#mbs_mem_upper | mbs_mem_upper]] | + | | 0x08 || 4 || [[#mbs_mem_upper | mbs_mem_upper]] || 0 |
|- | |- | ||
| − | | 0x0C || 4 || [[#mbs_bootdevice | mbs_bootdevice]] | + | | 0x0C || 4 || [[#mbs_bootdevice | mbs_bootdevice]] || 1 |
|- | |- | ||
| − | | 0x10 || 4 || [[#mbs_cmdline | mbs_cmdline]] | + | | 0x10 || 4 || [[#mbs_cmdline | mbs_cmdline]] || 2 |
|- | |- | ||
| − | | 0x14 || 4 || [[#mbs_mods_count | mbs_mods_count]] | + | | 0x14 || 4 || [[#mbs_mods_count | mbs_mods_count]] || 3 |
|- | |- | ||
| − | | 0x18 || 4 || [[#mbs_mods_addr | mbs_mods_addr]] | + | | 0x18 || 4 || [[#mbs_mods_addr | mbs_mods_addr]] || 3 |
|- | |- | ||
| − | | 0x1C || 16 || [[#mbs_syms | mbs_syms]] | + | | 0x1C || 16 || [[#mbs_syms | mbs_syms]] || 4 oder 5 |
|- | |- | ||
| − | | 0x2C || 4 || [[#mbs_mmap_length | mbs_mmap_length]] || 6 | + | | 0x2C || 4 || [[#mbs_mmap_length | mbs_mmap_length]] || 6 |
|- | |- | ||
| − | | 0x30 || 4 || [[#mbs_mmap_addr | mbs_mmap_addr]] || | + | | 0x30 || 4 || [[#mbs_mmap_addr | mbs_mmap_addr]] || 6 |
| + | |- | ||
| + | | 0x34 || 4 || [[#mbs_drives_length | mbs_drives_length ]] || 7 | ||
| + | |- | ||
| + | | 0x38 || 4 || [[#mbs_drives_addr | mbs_drives_addr ]] || 7 | ||
| + | |- | ||
| + | | 0x3C || 4 || [[#mbs_config_table | mbs_config_table ]] || 8 | ||
| + | |- | ||
| + | | 0x40 || 4 || [[#mbs_boot_loader_name | mbs_boot_loader_name ]] || 9 | ||
| + | |- | ||
| + | | 0x44 || 4 || [[#mbs_apm_table | mbs_apm_table ]] || 10 | ||
| + | |- | ||
| + | | 0x40 || 4 || mbs_vbe_control_info || 11 | ||
| + | |- | ||
| + | | 0x40 || 4 || mbs_vbe_mode_info || 11 | ||
| + | |- | ||
| + | | 0x40 || 4 || mbs_vbe_mode || 11 | ||
| + | |- | ||
| + | | 0x40 || 4 || mbs_vbe_interface_seg || 11 | ||
| + | |- | ||
| + | | 0x40 || 4 || mbs_vbe_interface_off || 11 | ||
| + | |- | ||
| + | | 0x40 || 4 || mbs_vbe_interface_len || 11 | ||
|} | |} | ||
| Zeile 142: | Zeile 198: | ||
|- | |- | ||
| 0x10 || 4 || Type || Typ des Speicherbereichs | | 0x10 || 4 || Type || Typ des Speicherbereichs | ||
| + | |} | ||
| + | |||
| + | === mbs_drives_length === | ||
| + | Länge der Drives-Liste | ||
| + | |||
| + | === mbs_drives_addr === | ||
| + | Pointer zur ersten Drive-Struktur. Eine Drive-Struktur sieht folgendermaßen aus: | ||
| + | {| border="1" | ||
| + | ! Offset || Größe || Name || Beschreibung | ||
| + | |- | ||
| + | | 0x00 || 4 || size || Größe des dieser Drive-Struktur | ||
| + | |- | ||
| + | | 0x04 || 4 || driver_number || BIOS-Driver-Number | ||
| + | |- | ||
| + | | 0x08 || 4 || drive_mode || 0 = [[CHS]]<br /> 1 = [[LBA]] | ||
| + | |- | ||
| + | | 0x0C || 4 || drive_cylinders || Anzahl an Zylinder, die das Gerät hat | ||
| + | |- | ||
| + | | 0x0C || 4 || drive_heads || Anzahl an Köpfe, die das Gerät hat | ||
| + | |- | ||
| + | | 0x0C || 4 || drive_sectors || Anzahl an Sektoren pro Spur, die das Gerät hat | ||
| + | |- | ||
| + | | 0x10 || size-0x10 || drive_ports || [[I/O-Ports]], die von diesem Gerät benutzt werden | ||
| + | |} | ||
| + | |||
| + | === mbs_config_table === | ||
| + | Eine Tabelle, wie sie vom Get-Configuration-BIOS-Call zurück gegeben wird. | ||
| + | |||
| + | === mbs_boot_loader_name === | ||
| + | Pointer zu einem 0-terminated ASCII-String, der den Namen des Bootloades darstellt. | ||
| + | |||
| + | === mbs_apm_table === | ||
| + | Pointer zur APM-Tabelle. Die APM-Tabelle sieht so aus: | ||
| + | {| border="1" | ||
| + | ! Offset || Größe || Name || Beschreibung | ||
| + | |- | ||
| + | | 0x00 || 2 || version || Version | ||
| + | |- | ||
| + | | 0x02 || 2 || cseg || 32bit Codesegment | ||
| + | |- | ||
| + | | 0x04 || 2 || offset || Offset des Entrypoints | ||
| + | |- | ||
| + | | 0x08 || 2 || cseg_16 || 16bit Codesegment | ||
| + | |- | ||
| + | | 0x0A || 2 || dseg || 16bit Datensegment | ||
| + | |- | ||
| + | | 0x0C || 2 || flags || Flags | ||
| + | |- | ||
| + | | 0x0E || 2 || cseg_len || Länge des 32bit Codesegments | ||
| + | |- | ||
| + | | 0x10 || 2 || cseg_16_len || Länge des 16bit Codesegments | ||
| + | |- | ||
| + | | 0x12 || 2 || dseg_len || Länge des 16bit Datensegments | ||
|} | |} | ||