Multiboot — Änderungen 2465 → 2473

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                                 || Anwesend wenn mbs_flags[X] gesetzt
+
! Offset || Größe || Inhalt                                             || Anwesend wenn mbs_flags[X] gesetzt
 
|-
 
|-
−
| 0x00  || 4    || [[#mbs_flags | mbs_flags]]             || immer
+
| 0x00  || 4    || [[#mbs_flags | mbs_flags]]                         || immer
 
|-
 
|-
−
| 0x04  || 4    || [[#mbs_mem_lower | mbs_mem_lower]]     || 0
+
| 0x04  || 4    || [[#mbs_mem_lower | mbs_mem_lower]]                 || 0
 
|-
 
|-
−
| 0x08  || 4    || [[#mbs_mem_upper | mbs_mem_upper]]     || 0
+
| 0x08  || 4    || [[#mbs_mem_upper | mbs_mem_upper]]                 || 0
 
|-
 
|-
−
| 0x0C  || 4    || [[#mbs_bootdevice | mbs_bootdevice]]   || 1
+
| 0x0C  || 4    || [[#mbs_bootdevice | mbs_bootdevice]]               || 1
 
|-
 
|-
−
| 0x10  || 4    || [[#mbs_cmdline | mbs_cmdline]]         || 2
+
| 0x10  || 4    || [[#mbs_cmdline | mbs_cmdline]]                     || 2
 
|-
 
|-
−
| 0x14  || 4    || [[#mbs_mods_count | mbs_mods_count]]   || 3
+
| 0x14  || 4    || [[#mbs_mods_count | mbs_mods_count]]               || 3
 
|-
 
|-
−
| 0x18  || 4    || [[#mbs_mods_addr | mbs_mods_addr]]     || 3
+
| 0x18  || 4    || [[#mbs_mods_addr | mbs_mods_addr]]                 || 3
 
|-
 
|-
−
| 0x1C  || 16    || [[#mbs_syms | mbs_syms]]               || 4 oder 5
+
| 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]]    || 6
+
| 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
 
|}
 
|}