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

Uit Wikibooks
Naar navigatie springen Naar zoeken springen

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[bewerken]

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[bewerken]

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[bewerken]

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).
Informatie afkomstig van http://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.