# Ontwerp en bouw een besturingssysteem/Werking van de PC/Bootloaders

Een bootloader is een programma dat helpt bij het opstarten van de computer. Zoals in Processormodes werd uitgelegd, start de computer altijd in 16-bits real-mode. De bootloader heeft als taak de computer in 32-bits protected-mode te krijgen, en daarna het besturingssysteem te laden.
Een besturingssysteem kan een eigen, specifiek voor dat besturingssysteem gemaakte bootloader hebben. Hoe je zoiets maakt komt aan bod in het hoofdstuk Bootloader.
We gebruiken nu eerst een kant-en-klare bootloader, en wel GRUB, de meest gebruikte open-source bootloader. GRUB kan de computer in 32-bits protected mode brengen, en daarna ons besturingssysteem laden en aanroepen. Maar voordat het weet waar de code in ons programmabestand begint, moeten we GRUB die informatie geven.

## Multiboot Specificatie

Voor kant-en-klare bootloaders zoals GRUB is er een specificatie opgesteld, de Multiboot Specificatie 0.6.95. Bootloaders die de multiboot specificatie gebruiken zijn zogenaamde multiboot compliant bootloaders, en dit gaan op zoek naar de multiboot header in de eerste 8192 bytes van het kernelbestand. In de multiboot header staat waar de uitvoerbare code in het bestand begint, en welke informatie de kernelcode van de bootloader verwacht.

### Multiboot header

De layout van de multiboot header is als volgt:
| Offset | Type | Veldnaam | Opmerkingen |
| 0 | unsigned 32-bit | Magic | Uniek nummer voor de header. Moet 0x1BADB002 zijn. Vereist. |
| 4 | unsigned 32-bit | Flags | Zie hieronder. Vereist. |
| 8 | unsigned 32-bit | Checksum | Als deze waarde bij 'Header' en 'Flags' wordt opgeteld, moet het totaal (unsigned) 0 zijn. Vereist. |
| 12 | unsigned 32-bit | Header adres | Fysiek adres van de multiboot header. Als Flags[16] is ingesteld. |
| 16 | unsigned 32-bit | Laad adres | Fysiek adres van de start van de te laden gegevens. Alleen als Flags[16] is ingesteld. |
| 20 | unsigned 32-bit | Laad eindadres | Fysiek adres van het einde van de te laden gegevens. Alleen als Flags[16] is ingesteld. |
| 24 | unsigned 32-bit | BSS eindadres | Fysiek adres van het einde van de met 0 te initialiseren gegevens. Alleen als Flags[16] is ingesteld. |
| 28 | unsigned 32-bit | Startadres | Fysiek adres van de eerste uit-te-voeren instructie. Alleen als Flags[16] is ingesteld. |
| 32 | unsigned 32-bit | Mode type | Voorkeur voor door de bootloader in te stellen grafische modus. Waarde 0 is lineair grafisch, waarde 1 EGA tekst. Alleen als Flags[2] is ingesteld. |
| 36 | unsigned 32-bit | Breedte | Voorkeur voor breedte van de grafische weergave, in pixels (lineair grafisch) of kolommen (EGA tekst). Waarde 0 betekend: geen voorkeur. Alleen als Flags[2] is ingesteld. |
| 40 | unsigned 32-bit | Hoogte | Voorkeur voor hoogte van de grafische weergave, in pixels (lineair grafisch) of rijen (EGA tekst). Waarde 0 betekend: geen voorkeur. Alleen als Flags[2] is ingesteld. |
| 44 | unsigned 32-bit | Diepte | Voorkeur voor aantal kleurbits per pixel, of 0 bij geen voorkeur of EGA tekst mode. Alleen als Flags[2] is ingesteld. |

### Flags

De volgende flags kunnen ingesteld worden:
| Bit | Naam | Waarde |
| 0 | Pagina-aligned | Wanneer ingesteld op 1 moeten alle modules op pagina-aligned adressen worden geladen. |
| 1 | Geheugen-informatie | Wanneer ingesteld op 1 moet de bootloader informatie teruggeven over het geheugen. |
| 2 | Video-mode-informatie | Wanneer ingesteld op 1 probeert de bootloader de grafische modus in te stellen, en geeft deze informatie over de grafische mode. |
| 16 | A.out formaat | Wanneer ingesteld op 1 gebruikt de bootloader de in de multiboot header opgegeven informatie om de kernel in het geheugen te plaatsen, in plaats van de informatie uit de header van het programmabestand (wanneer dit in ELF formaat is). |