Zavaděč operačního systému
2 Popis použitých služeb BIOSu
2.1 Služby BIOSu pro přímý přístup k disku
2.2 CHS formát (Cylinder Head Sector)
2.3 LBA formát (Linear Block Address)
2.6 Chybové kódy diskových operací
2.7 Chybové kódy rozšířené paměti
3 Popis Master Boot Recordu (MBR)
5 Popis startu počítače architektury INTEL86
6 Úloha Boot Manažeru v zaváděcím procesu
7 Mapa paměti pro zavedení jádra OS GNU/LINUX
7.2 Historie verzí boot protokolu
|
Úvod Mnoho uživatelů používá různé na sobě nezávislé operační systémy. Avšak existuje i mnoho firem, které vlastní starší programy vyžadující jiný operační systém, než mají nainstalován. V tomto případě by mohly připadnout v potaz dvě možnosti. Buď se vzdát svého zastaralého programu ve prospěch operačního systému, nebo využít služeb boot manažeru pro zavedení různých operačních systémů. Tvorba boot managerů je ojedinělou záležitostí vzhledem k nízké úrovni programovacího jazyka assembler, ve kterém se zavaděče programují. Většina boot managerů pochází od firem zabývajících se přímo tvorbou operačních systémů, např. Windows NT, OS/2 a mnohá další. |
1 Popis geometrie disku1.1
Základní pojmy
· pevný disk (harddisk) – tvořen několika plotnami neboli talíři disku, které jsou umístěny nad sebou a jsou uloženy ve vzduchotěsné a prachotěsné schránce. · povrch, strana (surface, side) – vrchní nebo spodní strana plotny harddisku. · hlava (head) – čtecí a zapisovací zařízení. Počet hlav pevného disku většinou souhlasí s počtem povrchů harddisku. · stopa (track) – jeden soustředný kruh na jednom povrchu, je číslována od nuly. Čím více stop se na pevném disku dá naformátovat, tím větší je jeho hustota. · válec (cylinder) – stopa promítnutá na všech površích. Označení „válec“ se používá častěji u disku. · sektor (sector) – na každé stopě je pevný počet úseků (sektorů) o neměnné velikosti, obvykle 512 bajtů. Celková kapacita disku v bajtech = počet povrchů * počet stop * počet sektorů * velikost sektoru Celá první stopa za tabulkou rozdělení disku (obvykle první stopa na disku) je vyhrazena pro systém. Většinou jsou v ní uloženy boot zavaděče, boot managery nebo bootovací viry. |

Obrázek 1.1.1: Popisující geometrii disku
1.2 Prokládání datRychlost otáčení ploten je poměrně vysoká, může se stát, že poté, co je přečten (zapsán) jeden sektor a data jsou předána dále, dojde k pootočení disků, takže čtecí (zapisovací) hlavy se nenacházejí nad následujícím sektorem, ale až nad některým z dalších sektorů. Bylo by tedy nutné čekat další otáčku, než čtecí (zapisovací) hlavy budou nad požadovaným sektorem, a pak by se situace znovu opakovala. Protože tento způsob by velmi zpomaloval práci pevného disku, zavádí se tzv. faktor prokládání pevného disku. Jedná se o techniku, při které nejsou data zapisována (a posléze čtena) do za sebou následujících sektorů, ale jsou během jedné otáčky disku zapisována vždy do každého n-tého sektoru (faktor prokládání 1:n). Číslo n je voleno tak, aby po přečtení a zpracování dat z jednoho sektoru byla čtecí (zapisovací) hlava nad dalším požadovaným sektorem. Vzhledem k tomu, že se pohybují současně všechny (čtecí/zapisovací) hlavičky, je rychlejší zapisovat do stejné stopy na více plotnách, než zaplňovat nejdříve jedenu plotnu a pak postupně další. |


Obrázek 1.3.1: Směr magnetizace
|
Cívka, kterou prochází proud, vytváří magnetické pole, které je vedeno přes jádro zapisovací hlavy k magnetické vrstvě. V místě štěrbiny působí magnetické pole na materiál. Směr magnetizace závisí na směru zápisového proudu. Velikost zmagnetování závisí na šířce štěrbiny. |

Obrázek 1.3.2: Zápis dat přes cívku
1.4 Čtení datJe založeno na principu elektromagnetické indukce.
Na vývodech cívky, která se nachází v magnetickém poli, lze naměřit napětí
vždy ve chvíli, kdy se toto pole mění. tzn. při přechodu 0 na |

Obrázek 1.4.1: Čtení zapsané informace
2 Popis použitých služeb BIOSuSlužeb BIOSu je možné využít hned po startu počítače. Přes tyto služby se přistupuje ke grafické kartě, seznamu zařízení, velikosti volné paměti, diskovým operacím, portům, klávesnici, tiskárně atd. 2.1 Služby BIOSu pro přímý přístup k diskuPřes přerušení (interrupt - INT) 13H lze přistupovat přímo k řadiči diskety nebo harddisku. V mnoha případech bezpečnostních systémů se tato služba „zastřešuje“, to znamená, že vývojář je donucen přistupovat k disku v rámci poskytnutých služeb operačního systému. Jakoukoliv jinou cestu k disku systém zamítne. Pro adresaci jednoho sektoru v rámci disku se nejčastěji používají formáty CHS a LBA. 2.2 CHS formát (Cylinder Head Sector)U CHS formátu je sektor definován Cylindrem/Hlavou/Sektorem což znamená, že jde o fyzické umístění sektoru na médiu (třírozměrná adresa). U fyzického číslování začíná sektor od hodnoty jedna. CHS formát je používán všemi BIOSy, ale je omezený velikostí disku (viz tabulka 2.3.3). 2.3 LBA formát (Linear Block Address)LBA znamená sekvenční přístup k sektorům disku. Ty mají jedinečné číslo a jsou číslovány od nuly. Na celé médium je pohlíženo jako na jednorozměrné pole sektorů. LBA formát je podporován pouze BIOSy, které nejsou příliš staré. |

|
registr AH |
popis |
|
00H |
reset disku – také rekalibrace kontroléru |
|
02H |
čti sektory do paměti |
|
42H |
čti sektory do paměti - ROZŠÍŘENÁ SLUŽBA BIOSu |
|
AH=00H |
registr |
popis |
|
vstup |
DL |
číslo diskové jednotky (7 bit je pro hard disk) |
|
výstup |
- |
- |
|
Jak už název funkce
napovídá, jedná se o rekalibraci diskových hlav a posun na |
|
AH=02H |
registr |
popis |
|
vstup |
AL |
počet sektorů ke čtení (nesmí být nula) |
|
|
CH |
číslo cylindru 0-1023 (bity 0-9) |
|
|
CL |
číslo sektoru 1-63 (bity 0-5) viz obrázek 3.2.1 |
|
|
DH |
číslo hlavy |
|
|
DL |
číslo diskové jednotky (7 bit je pro hard disk) |
Tabulka 2.3.3: pokračování
|
vstup |
ES:BX |
adresa buferu |
|
výstup |
AH |
kód chyby disku, je-li CF nastaven na CY (viz tabulka 2.6.1) |
|
|
ES:BX |
adresa buferu obsahující přečtená data |
|
|
AL |
počet přečtených sektorů |
|
V dnešní době je tato funkce zastaralá. Problém spočívá v možnosti přistupovat k maximální kapacitě disku 8 455 716 864 bytů (8 GiB). Ve formátu CHS, který je uložen v Partition table (viz PT 3.2). Při volání BIOSových funkcí, je možné použít maximálně 24 bitů. S 24-bitovou hodnotou a sektorem o velikosti 512 bajtů, lze přistupovat ke všem sektorům na disku do již zmíněné hranice 8 GiB. Kvůli zachování funkčnosti starších operačních systémů, zůstala služba AH=02H nezměněna. Registry ES:BX musí ukazovat na adresu alokované paměti, kde budou data po přečtení z disku uložena. |
|
cylindr |
hlava |
sektor |
|
0..1023 (10 bitů) |
0..255 (8 bitů) |
1..63 (6 bitů) |
Příklad 2.3.1:
Výpočet maximální velikosti disku u služby AH=02H
(C * H * S) * 512 = (1024 * 63 * 256) * 512 = 8 455 716 864 bajtů
Příklad 2.3.2:
|
Je předpokládáno, že je již alokovaná paměť o velikosti nejméně 512 bajtů a registry BX:ES jsou nastaveny na tuto paměť. Připravené hodnoty pro čtení dat jsou: hlava = 0, cylindr = 550, sektor =1. |
|
|
;ES:BX - adresa alokované paměti MOV DL,80H ; disk hda MOV DH,BYTE PTR [Param] ; číslo hlavy MOV CX,WORD PTR [Param+01H] ; číslo sektoru + cylindru MOV AH,02H ; funkce pro čtení dat MOV AL,01H ; počet sektorů k přečtení INT 13H ; volání služby BIOSu NOP ; prázdná instrukce Param DB 00H,81H,26H ; uložené parametry C/H/S |
|
|
|
AH=42H |
registr |
popis |
|
vstup |
DL |
číslo diskové jednotky (7 bit je pro hard disk) |
|
|
DS:SI |
adresa struktury LBA (viz tabulka 2.3.6) |
|
výstup |
AH |
kód chyby disku, je-li CF nastaven na CY (viz tabulka 2.6.1) |
|
Problém přístupu k větším diskům, něž je 8 GiB, řeší služba AH=42H, která umí pracovat s diskem o velikosti 2^64 sektorů, tedy 8 biliónů TB. V dnešní době je pro LBA adresování rezervována 32-bitová hodnota v partition table o velikosti 2048 GB tedy 2^32. Toto adresování se nazývá LBA32. Registry DS:SI ukazují na adresu struktury (viz níže). |
|
relativní adresa |
délka |
popis |
|
00H |
BYTE |
velikost paketu (10H nebo 18H) |
|
01H |
BYTE |
rezervováno (0) |
|
WORD |
velikost bloku k přenosu (maximálně 007Fh pro Phoenix) |
|
|
04H |
DWORD |
cílová adresa buferu |
|
08H |
QWORD |
začátek absolutního bloku (LBA zařízení) |
|
10H |
QWORD |
64-bitová cílová adresa buferu; použije se jestliže pole 04h je rovno FFFFH:FFFFH |
Příklad 2.3.3:
|
Přepočet hodnoty z C/H/S do LBA. Geometrie disku: cylindr = 609, hlav = 32, sektor = 63. Blok o velikosti 512 bajtů, který se má přečíst z disku je uložen v cylindru = 319, hlav = 22, sektor = 54. početSektorůNaStopu = sektor = 63 ; CelkemHlav = hlav = 32 (VybranýCylindr * CelkemHlav + VybranáHlava) * početSektorůNaStopu + VybranýSector - 1 = (319 * 32 + 22) * 63 + 54 – 1 = 644 543 LBA32 |
Příklad 2.3.4:
|
Výpočet hodnoty z LBA do C/H/S. Geometrie disku je stejná jako u příkladu 2.3.3 sektor = (LBA32 MOD CelkemSektorůNaStopu)+1 = 644 543 % 63 + 1 = 54 temp = ( LBA32 / CelkemSektorůNaStopu) = 644 543 / 63 = 10 230 hlav = temp MOD CelkemHlavNaCylinder = 10230 % 32 = 22 cylindr = temp / CelkemHlavNaCylinder = 10230 / 32 = 319 MOD – dělení modulo (tj. zbytek po dělení) / - celočíselné dělení |
Příklad 2.3.5:
|
Segment a ofset alokované paměti o velikosti 512 bajtů se uloží do položky Adr struktury LBA. Jestliže bude tato položka obsahovat adresu 0FFFFH:0FFFFH je nutné změnit velikost paketu v položce VelPack na hodnotu 18H a zároveň vyplnit i položku AdrEMS, která bude obsahovat adresu zabrané paměti v EMS. |
|
;ES:BX - adresa alokované paměti MOV AH,42H ; funkce pro čtení dat LBA MOV DL,80H ; disk MOV SI,OFFSET(LBA) ; ofsetová část struktury MOV WORD PTR [Adr][2],ES ; segmentová cílová adresa MOV WORD PTR [Adr][0],BX ; ofsetová cílová adresa INT 13H ; volání služby BIOSu NOP ; prázdná instrukce LBA: ; struktura LBA paketu VelPack DB 10H ; velikost paketu Rez DB 00H ; rezervováno VelBlk DW 0001H ; velikost bloku k přenosu Adr DD 00000000H ; cílová adresa buferu Pozice DQ 000000000009D5BFH ; hodnota LBA32 AdrEMS DB 08H DUP(0) ; adresa rozšířené paměti |
|
Přerušení 15H poskytuje různé služby pro zařízení AT (služby OS, EMS, kazetopásková jednotka). |
|
registr AH |
popis |
|
87H |
přesuň blok z/do přídavné paměti |
|
88H |
vrať velikost přídavné (extended) paměti |
|
AH=87H |
registr |
popis |
|
vstup |
CX |
počet přesunovaných 16ti bytových slov (max. 8000H=32K) |
|
|
ES:SI |
Globální Tabulka Deskriptorů (GDT) (viz tabulka 2.4.3) |
|
výstup |
AH |
kód chyby disku, je-li CF nastaven na CY (viz tabulka 2.7.1) |
|
Funkce AH=87H přesouvá
blok dat z/do přídavné paměti mezi 1 Megabajtem a 16MB na počítačích |
|
relativní adresa |
délka |
popis |
|
00H |
16BYTEs |
využito BIOSem (nastavené hodnoty 0) |
|
10H |
WORD |
délka přenášených dat v bytech (2*CX-1 nebo větší) |
|
12H |
3BYTEs |
24-bitová lineární zdrojová adresa, první bajt je nižší |
|
15H |
BYTE |
bajt přístupových práv (93H) |
|
16H |
WORD |
využito BIOSem (nastavené hodnoty 0) |
|
18H |
WORD |
délka přenášených dat v bajtech (2*CX-1 nebo větší) |
|
1AH |
3BYTEs |
24-bitová lineární cílová adresa, první bajt je nižší |
|
1DH |
BYTE |
bajt přístupových práv (93H) |
|
1EH |
WORD |
využito BIOSem (nastavené hodnoty 0) |
|
20H |
16BYTEs |
využito BIOSem (nastavená hodnota 0) |
|
AH=87H |
registr |
popis |
|
vstup |
- |
- |
|
výstup |
AX |
velikost rozšířené paměti v KB |
Obrázek 2.4.1: Rozvržení základní paměti v reálném módu a EMS paměti v chráněném mód

|
Výsledná hodnota této funkce je uložena do registru AX, která určuje počet navazujících 1K bloků nad 1M (1024K). Maximální hodnota v registru AX může být 16MB. I zde má tato funkce svou rozšířenou podobu AH=0C7H a registry DS:SI musí ukazovat na strukturu o velikosti 42 bajtů. Maximální výsledná hodnota paměti u této funkce je 4GB. |
Příklad. 2.4.1:
|
Přenos jednoho bloku dat o velikosti 512 bajtů ze základní paměti do rozšířené[1]. Předpoklad: Zdrojová adresa je již alokována a obsahuje přečtená data ze souboru nebo výsledky výpočtu, které jsou nutné k pozdějšímu zpracování. Nejsou zde ošetřeny případné chybové stavy. |
|
;ES:BX - 5000H:8400H (alokovaná zdrojová adresa) MOV AH,88H ; Vrať velikost rozšířené paměti INT 15H ; volání služby BIOSu MOV BYTE PTR [OFFSET(SRC_LO)],00H MOV WORD PTR [OFFSET(SRC_HI)],0584H ; do GDT tabulky uloží zdrojovou adresu MOV BYTE PTR [OFFSET(DEST_LO)],00H MOV WORD PTR [OFFSET(DEST_HI)],1000H ; do GDT tabulky uloží cílovou adresu MOV AH,87H ; funkce pro přesun bloku do EMS paměti MOV CX,100H ; počet přenášených dat (WORD) MOV SI,OFFSET(GDT) ; získání ofsetové adresy GDT tabulky INT 15H ; volání služby BIOSu NOP ; prázdná instrukce GDT: ; Globální Tabulka Deskriptorů DB 10H DUP(0) ; využito BIOSem (nastavené hodnoty 0) DW 0FFFFH ; délka přenášených dat v bytech SRC_LO: DB 00H ; lineární zdrojová adresa SRC_LO SRC_HI: DW 0000H ; lineární zdrojová adresa SRC_HI DB 93H ; byte přístupových prav DW 0000H ; využito BIOSem (nastavené hodnoty 0) DW 0FFFFH ; délka přenášených dat v bytech DEST_LO: DB 00H ; lineární cílová adresa DEST_LO DEST_HI: DW 0000H ; lineární cílová adresa DEST_HI DB 93H ; byte přístupových prav DW 0000H ; Využito BIOSem (nastavené hodnoty 0) DB 10H DUP(0) ; Využito BIOSem (nastavené hodnoty 0) |
|
Video služby (INT 10H) slouží k zobrazení údajů na monitor v grafickém i v textovém režimu. |
|
registr AH |
popis |
|
02H |
nastav pozici kurzoru |
|
06H |
roluj okno nahoru |
|
0EH |
zapiš znak (emulace TTY) |
|
AH = 02H |
registr |
popis |
|
vstup |
BH |
video stránka (0..) |
|
|
DH |
řádka (0..) |
|
|
DL |
sloupec (0..) |
|
výstup |
- |
- |
|
Nastaví kurzor na určenou pozici. Při nastavení kurzoru pod poslední řádku obrazovky. Pak bude neviditelný, ale klasické procedury výstupu (používající funkci 0EH - TTY) nemusí pracovat korektně. |
|
AH=06H |
registr |
popis |
|
vstup |
CH |
řádka levého horního rohu okna (0..) |
|
|
CL |
sloupec levého horního rohu okna (0..) |
|
|
DH |
řádka pravého dolního rohu okna (0..) |
|
|
DL |
sloupec pravého dolního rohu okna (0..) |
|
|
AL |
počet řádek, které mají být odrolovány (0 = smaže celé okno) |
|
|
BH |
video atribut, kterým mají být vyplněny nové řádky |
|
výstup |
- |
- |
|
Tato funkce může odrolovat nebo smazat okno na obrazovce. Roluje obdélník o 1 či více řádcích. Obdoba této funkce je „roluj okno dolu“ registr AH=07H. |
|
AH=0EH |
registr |
popis |
|
vstup |
AL |
ASCII znak |
|
|
BL |
barva popředí (pro grafický mód) |
|
výstup |
- |
- |
|
Funkce zapíše znak na stávající pozici kurzoru, aktivní video stránku a posune kurzor o znak doprava. Na konci řádku bude kurzor přemístěn na začátek nového řádku. Na posledním řádku se obraz odroluje. Znaky 0DH (CR), 0AH (LF) a 07H (BELL) jsou interpretovány jako řídící znaky. |
|
Každá volaná služba BIOSu pro práci
s diskem vrací chybové kódy disku. Jestliže byla operace úspěšně
dokončena, je nastaven příznak přenosu CF (carry flag) na hodnotu 0.
V opačném případě se CF rovná hodnotě |
|
registr AH |
význam číselné hodnoty |
|
00H |
úspěch |
|
01H |
neznámá volaná funkce v AH nebo špatný parametr |
|
02H |
cíl adresy nenalezen |
|
04H |
sektor nenalezen/chyba při čtení |
|
05H |
restart neproveden (jen u harddisku) |
|
07H |
diskový parametr selhal v činnosti (jen u harddisku) |
|
09H |
datové rozhraní selhalo (upozornění DMA přesáhlo hranici 64K nebo >80h sektorů) |
|
0AH |
nalezen chybný sektor (jen u harddisku) |
|
0BH |
nalezena špatná stopa (jen u harddisku) |
|
0CH |
neznámé číslo stopy nebo chybné zařízení |
|
0DH |
špatné číslo sektoru ve formátu (PS/2 harddisk) |
|
0EH |
kontrolér datové adresy označil chybu (jen u harddisku) |
|
20H |
selhal kontrolér |
|
32H |
nesprávný typ zařízení uložený v CMOS (BIOS Compaq) |
|
40H |
selhal odskok na jiné místo (seek) |
|
80H |
nedostatek času (zařízení neodpovídá) |
|
AAH |
zařízení není připraveno (jen u harddisku) |
|
B1H |
jednotka je uzamčena (u INT 13 rozšířené) |
|
B3H |
jednotka je používána (u INT 13 rozšířené) |
|
B4H |
zámek překročil počet (u INT 13 rozšířené) |
|
B6H |
jednotka je zapojená, ale chráněná proti čtení (u INT 13 rozšířené) |
|
BBH |
nedefinovaná chyba (jen u harddisku) |
|
E0H |
chyba stavu registru (jen u harddisku) |
|
FFH |
operace selhala (jen u harddisku) |
|
Jestliže při ukončení volané funkce AH=87H nebo 88H (INT 15H) je nastaven příznak přenosu CF (carry flag) na hodnotu 1, pak registr AH obsahuje následující chybové kódy. |
|
registr AH |
význam číselné hodnoty |
|
01H |
chyba parity |
|
02H |
chyba přerušení |
|
03H |
chyba adresové linky A20 |
|
80H |
neznámý příkaz (PC,PCjr) |
|
86H |
funkce není podporována |
|
Master boot record je označení sektoru, který se nalézá na disku (válec 0, hlava 0, sektor 1) a je načten BIOSem při startu počítače do operační paměti. MBR lze vytvořit např. programem FDISK nebo jinými operačními systémy, které musí zhotovit funkční MBR strukturu, která obsahuje master boot (hlavní zavaděč operačního systému) a partitions table (tabulku oblastí). |
|
Má za úkol zjistit, zda je nějaká oblast označená jako aktivní, načíst z ní boot rekord (viz 4 BR) do paměti a předat řízení. V opačném případě master boot zobrazí chybovou zprávu ve smyslu „Operační systém nenalezen“ nebo „System not found“, poté následuje volání přerušení 18H (ROM BIOSu). |
|
Též tabulka rozdělení disku. Je uložena na konci MBR od adresy 1BEH a skládá ze čtyř položek, z nichž každá je dlouhá 16 bajtů, plus závěrečná identifikace přítomnosti partition table. Každý logický disk, na který ukazuje PT, musí být zformátován a přistupuje se k němu stejně jako např. k disketě. Typy diskových oblastí z hlediska funkčnosti: · primární (primary) – není možné další rozdělení a na jednom disku mohou být dohromady nejvýše čtyři primární oblasti. · rozšířený (extended) – při vytváření více jak čtyř diskových oblastí je možné vytvořit rozšířenou oblast, kterou lze dále členit na oblast logickou. · logický (logical) – je součástí oddílu rozšířeného, dále jej nelze dělit. |
|
adresa |
délka |
obsah |
|
1BEH |
16 B |
údaje o oblasti 1 |
|
1CEH |
16 B |
údaje o oblasti 2 |
|
1DEH |
16 B |
údaje o oblasti 3 |
|
1EEH |
16 B |
údaje o oblasti 4 |
|
1FEH |
1 W |
identifikační slovo 55AAH |
|
relativní adresa |
délka |
význam |
|
00H |
1 B |
příznak aktivní oblasti – aktivní = 80H, neaktivní = 00H; Aktivní oblast smí bít pouze jedna a musí obsahovat zaváděcí kód v Boot sektoru |
|
01H |
1 B |
číslo povrchu počátku oblasti, by měla být vždy 0 – výjimku tvoří pouze první oblast |
|
02H |
2 B |
číslo cylindru a sektoru počátku oblasti; Sektor by měl být vždy 1; Způsob uložení (viz obrázek 3.2.1) |
|
04H |
1 B |
příznak typu operačního systému (viz tabulka 3.2.3) |
|
05H |
1 B |
číslo povrchu konce oblasti; Mělo by být vždy nejvyšší číslo povrchu |
|
06H |
2 B |
číslo cylindru a sektoru konce oblasti; Mělo by být vždy číslo posledního sektoru na stopě; Způsob uložení (viz obrázek 3.2.1) |
|
08H |
2 W |
relativní posun prvního sektoru oblasti; O kolik sektorů je oblast posunuta oproti Master Boot sektoru |
|
0CH |
2 W |
velikost oblasti v sektorech |
Obrázek 3.2.1: Způsob uložení cylindru a
sektoru

Obrázek 3.2.2: Výpis PT a dekódování jednotlivých položek
|
adresa |
obsah |
|
|
|
|
01BEH |
00 01 01 00 |
83 1F BF 25 |
3F 00 00 00 |
01 EB 10 00 |
|
01CEH |
80 00 81 26 |
06 1F BF 60 |
40 EB 10 00 |
A0 D0 01 00 |
|
01DEH |
00 00 00 00 |
00 00 00 00 |
00 00 00 00 |
00 00 00 00 |
|
01EEH |
00 00 00 00 |
00 00 00 00 |
00 00 00 00 |
00 00 00 00 |
|
01EFH |
55 AA |
|
|
|
Obrázek 3.2.3: Dekódování výpisu
|
1BE-1CD |
disk EXT3: (Primary Linux Partition) |
|
00 |
- neaktivní oblast |
|
01 |
- počáteční povrch |
|
0100 |
- cylindr 0, sektor 1; bitově 000 0001 0000 0000 |
|
83 |
- linux (viz tabulka. 3.2.3) |
|
1F |
- koncový povrch 31 |
|
BF25 |
- cylindr 549, sektor 63; bitově 1011 1111 0010 0101 |
|
0000003F |
- relativní posun 63 sektorů |
|
0010EB01 |
- počet sektorů v oblasti 1108737 |
|
1CE-1DD |
disk C: (Primary DOS Partition) |
|
80 |
- aktivní oblast |
|
00 |
- počáteční povrch |
|
8126 |
- cylindr 550, sektor 1; bitově 1000 0001 0010 0110 |
|
06 |
- FAT 16 (viz tabulka. 3.2.3) |
|
1F |
- koncový povrch 31 |
|
BF60 |
- cylindr 608, sektor 63; bitově 1011 1111 0110 0000 |
|
0010EB40 |
- relativní posun 1108800 sektorů; (tj. 1108737 + 63) |
|
0001D0A0 |
- počet sektorů v oblasti 118944 |
|
|
|
|
hodnota |
typ systému souborů |
|
00H |
prázdná partitions table |
|
04H |
DOS 16-bit FAT (více než 32M) |
|
06H |
DOS 3.31+ Large File System (16-bit FAT, větší něž 32M) |
|
07H |
OS/2 HPFS; Windows NT NTFS |
|
0BH |
Windows95 s 32-bit FAT |
|
0CH |
Windows95 s 32-bit FAT (LBA-mód) |
|
0FH |
logický disk 32-bit FAT (LBA-mód) |
|
17H |
NTFS partition (skrytá) |
|
1BH |
Windows95 s 32-bit FAT (skrytá) |
|
1CH |
Windows95 s 32-bit FAT (LBA-mód - skrytá) |
|
82H |
Solaris (Unix); Linux swap |
|
83H |
Linux native file system (ext2fs/xiafs) |
|
85H |
Linux EXT |
|
A5H |
FreeBSD, BSD/386 |
|
B3H-B4H |
rezervováno |
|
Též Boot sektor, musí být uložen v nultém sektoru oblasti pevného disku, kde je nahrán operační systém. Každý operační systém má svůj vlastní boot record. Úkolem kódu v boot recordu je zavést a nastartovat jádro daného systému. |
|
Po přivedení napětí a startu hodinového taktu se na sběrnici ustálí signál POWERGOOD. Provede se reset CPU a nastartování 8086 reálného režimu. Všechny segmentové registry jsou vynulovány, kromě registrů CS:IP, které jsou nastaveny na adresu FFFFH: FFF0H, kde je v ROM uložen programový kód BIOS Power On Self Testu (POST). Provádění programového kódu BIOS POST, probíhá víceméně v okamžiku, kdy počítač „počítá“ paměť. Přerušení jsou zakázána a tabulka adres přerušení (IVT) je inicializována na 0. U víceprocesorového systému pracuje při testu jen jeden procesor „boot procesor“. Podle zjištěného hardwaru a hodnot zadaných uživatelem se nastaví celá řada parametrů pro chipset (čipovou logiku) základní desky - tyto parametry ovlivňují jak rychlost, tak spolehlivost a funkčnost systému. Dále se inicializuje zařízení Plug and Play (PnP). Do registru DL je BIOSem nastaveno číslo zařízení (80H = fyz. disk, 00H = disketa, atd), ze kterého se zavede systém. Volání služby INT 19H provede nahrání MBR (sektor jedna, hlava nula, cylindr nula) bootovacího zařízení na adresu 0000H:7C00H, kde je předáno řízení. Na začátku MBR je uložen sled instrukcí, které musí přesunout vlastní kód (MBR) na volnou adresu (viz tabulka 5.1.1). Následuje skok na adresu kopie obsahující MBR. Poté se vykoná zbytek kódu, který najde a nahraje BR z aktivní oblasti disku na adresu 0000H:7C00H a dojde opět k předání řízení. Boot rekord obsahuje zaváděcí kód, který při instalaci operačního systému implementuje instalátor, např. DOS, WINDOWS a LINUX. Vybraný zavaděč nahraje jádro na příslušné adresy a spustí jej. |
|
od |
do |
popis |
|
0000H:0400H |
0000H:0463H |
rezervováno (BIOS) |
|
0000H:0465H |
0000H:048EH |
rezervováno (BIOS) |
|
0000H:048FH |
F000H:FFFEH |
volné místo pro zavaděč |
|
Účelem boot manažeru je poskytnout uživateli zavedení různých operačních systémů z téhož počítače. Různé operační systémy obsahují vlastní boot manažer, např. ntdldr ve Windows NT nebo LILO a GRUB v Linuxu. Konfigurace boot manažerů je dosti obtížná a vyžaduje detailní systémové znalosti. Boot manažery používají grafické rozhraní, odpočítávání času pro spuštění přednastaveného systému. |
|
Vlastní jádro, např. soubor pod názvem „vmlinuz-2.4.18-3“, se skládá ze tří částí. Každý díl musí být zaveden na příslušné adresy. Začátek souboru vmlinuz obsahuje boot sektor o velikosti 512 bajtů. Jde o zkompilovaný soubor bootsect.S, který zavede OS Linux z diskety/disku, za předpokladu, že jádro je uloženo na disketě/disku od nulté stopy. Zavaděč se přesune z fyzické adresy 0x07C00 (0000:7C00) na adresu 0x90000 (9000:0000). Odtud načte další část souboru vmlinuz na adresu 0x90200 (9020:0000). Tato část kódu se nazývá „setup“ a obsahuje zkompilovaný kód ze souboru setup.S. Jeho délka je uložena na konci boot zavaděče v proměnné setup_sects (viz tabulka 7.2.1). Třetí částí souboru vmlinuz, která se načítá, je samotné jádro. Adresa, kde bude jádro uloženo, se řídí hodnotou v proměnné loadflags a verzí protokolu. |
|
is_bzImage = (protocol >= 0x0200) && (loadflags & 0x01); |
|
load_address = is_bzImage ? 0x100000 : 0x10000; |
|
Pro komunikaci mezi zavaděčem a jádrem slouží příkazová řádka o délce 255 znaků plus finální nula. Nyní stačí nastavit root zařízení, video mód a předat řízení části setup kódu na adresu 0x90200. Důležité! Aby došlo ke spuštění části setup kódu, musí se použít adresa ve tvaru 9020:0000. |

Obrázek 7.1.1: Paměťová mapa pro zavaděč jádra Image/zImage/bzImage
|
Je robustní, vzhledem k tomu, že zjišťuje celkovou kapacitu paměti, následně provede standardní nastavení klávesnice, detekci textových a grafických režimů, inicializuje diskový řadič, kontroluje PS/2, testuje, zda je přítomna zdokonalená podpora úspory energie (APM), provede kontrolu pozice jádra načteného do paměti, které se může nacházet v: · základní paměti - jádro bylo zkompilováno příkazem make jako Image/zImage. Rozsah volné základní paměti je od 0x10000 do 0x90000. Celé jádro nesmí přesáhnout délku 8x64KB = 512KB. · rozšířené paměti – jádro je typu bzImage a jeho délka je omezena pouze velikostí rozšířené paměti. Začátek adresy jádra v rozšířené paměti je od 1 MB (0x100000). Jestliže se nachází jádro v EMS paměti, je zde ponecháno. V opačném případě dojde k přesunu jádra ze základní paměti do rozšířené. Další části testů prováděných setupem jsou: nastavení tabulky přerušení (Interrupt Descriptor Table - IDT a Global Descriptor Table – GDT), test přítomnosti floating point unit (fpu), případně jeho restart a přepnutí procesoru z reálného režimu do chráněného. Nyní dochází k dekompresi jádra do volné paměti a zobrazení textu „Uncompressing Linux . ..“ na obrazovku. Rozpakované jádro se pak přesouvá zpět na adresu 0x100000. V tuto chvíli je vše připraveno ke spuštění jádra odskokem na adresu, která je uložena v hodnotě code32_start (viz tabulka 7.2.1). |
|
V současné době existují čtyři verze LINUX boot protokolů. · Protokol 2.00 - (Jádro 1.3.73) Přidána podpora bzImage a initrd Dále upřesněn způsob komunikaci mezi boot zavaděčem a jádrem. · Protokol 2.01 - (Kernel 1.3.76) Přidáno upozornění přetečení heapu · Protokol 2.02 - (Kernel 2.4.0-test3-pre3) Přidán nový protokol příkazové řádky. Snížení horní meze základní paměti. Tradiční oblast setupu se již nepřepisuje. Uvažuje se o vypuštění zImage, ale zatím je podporován. · Protokol 2.03 - (Kernel 2.4.18-pre1) Umožňuje boot zavaděči použít nejvyšší možné dosažitelné adresy pro initrd. |
|
adresa |
délka [byte] |
verze jádra |
název |
popis |
|
1F1H |
1 |
všechny |
setup_sects |
délka setupu v sektorech |
|
1F2H |
2 |
všechny |
root_flags |
jestli nastaven na hodnotu 1, připojuje se kořenový adresář pro čtení |
|
1F4H |
2 |
všechny |
Syssize |
použito pro bootsect.S |
|
1F6H |
2 |
všechny |
swap_dev |
zastaralý |
|
1F8H |
2 |
všechny |
ram_size |
použito pro bootsect.S |
|
1FAH |
2 |
všechny |
vid_mode |
nastavení video módu 0xFFFFH |
|
1FCH |
2 |
všechny |
root_dev |
číslo přípojného bodu root zařízení |
|
1FEH |
2 |
všechny |
boot_flag |
identifikační slovo 55AAH |
|
200H |
2 |
2.00+ |
Jump |
instrukce odskoku |
|
202H |
4 |
2.00+ |
header |
identifikační signatura "HdrS" |
|
206H |
2 |
2.00+ |
version |
podporovaná verze boot protokolu |
|
208H |
4 |
2.00+ |
realmode_ swtch |
adresa 16-bitového reálného módu, (použito zavaděčem LoadLin) |
|
20CH |
2 |
2.00+ |
start_sys |
adresa segmentu pro načtení jádra do základní paměti 0x1000 (zastaralé) |
|
20EH |
2 |
2.00+ |
kernel_ version |
ukazatel na řetězec verze jádra |
|
210H |
1 |
2.00+ |
type_of_ loader |
identifikace zavaděče 0-LILO; 1-LoadLin; 2-bootsect-loader; 4-EtherBoot |
|
211H |
1 |
2.00+ |
loadflags |
hodnota 1 – EMS; 0 – základní paměť |
|
212H |
2 |
2.00+ |
setup_ move_size |
délka setupu k přesunu do EMS paměti (použito LoadLin) |
|
214H |
4 |
2.00+ |
code32_ start |
ukazatel na adresu jádra pro předání řízení (použito LoadLin) |
|
218H |
4 |
2.00+ |
ramdisk_ image |
načítací adresa initrd (nastaveno zavaděčem) |
|
21CH |
4 |
2.00+ |
ramdisk_ size |
délka initrd (nastaveno zavaděčem) |
|
220H |
4 |
2.00+ |
bootsect_ kludge |
použito pro bootsect.S |
|
224H |
2 |
2.01+ |
heap_end_ptr |
ofsetová část adresy volné paměti za koncem setupu |
|
226H |
2 |
N/A |
pad1 |
rezervováno |
|
228H |
4 |
2.02+ |
cmd_line_ ptr |
32-bitový ukazatel na příkazovou řádku jádra |
|
22CH |
4 |
2.03+ |
initrd_ addr_max |
největší povolená adresa pro initrd |
|
Celý projekt se skládá z několika částí, které jsou mezi sebou úzce spjaty. Hlavní instalační program LINX je napsán v jazyku C pro OS Linux. Jeho náplní je přidat boot manager (viz 8.1 mbr.bin) do MBR a modifikovat soubory mbr.bin a linx.bin (viz 8.2 linx.bin). Dále vytváří mapy pro zavaděč Linx, které ukládá do souboru a do nulté stopy disku. Při ukládání dat do prostoru MBR dochází i k záloze přepisovaných dat. Pomocí této zálohy je možné vrátit data zpět o jeden krok. V příkazovém řádku jde o parametr „-u“ a ukládací soubor je permanentně nastaven do /boot/savembr.bin. Avšak před spuštěním tohoto programu je nutné vytvořit nebo editovat konfigurační soubor „linx.cfg“ v adresáři /etc. V konfiguračním souboru „linx.cfg“ si uživatel určí, které operační systémy chce mít v nabídce při startu počítače. Struktura souboru „linx.cfg“ |
Nastavení bootování LINUXu
|
[Název] ROOT = “/dev/hda1” VMLINUZ = “/boot/vmlinuz” MAP = “/boot/vmlinuz.map” CMD
= “single” |
Nastavení
bootování WINDOWSu
|
[Název] ROOT = ”/dev/hda2” |
|
Do
položky „název”
napíše uživatel jméno operačního systému, který se zobrazí v bootovací
nabídce (viz obrázek 8.1.1). Následuje vyhrazené slovo ROOT = /dev/hda2”, kde označení
/dev/hda2 určuje v případě LINUXu přípojný bod kořenového adresáře a ve
Windows oddíl, který obsahuje BR. Další položky jsou závislé jen na OS Linux.
Za vyhrazeným slovem VMLINUZ se uvádí cesta k souboru jádra. Řádka s
vyhrazeným slovem MAP určuje jméno a cestu souboru, jenž bude
obsahovat mapu sektorů jádra v LBA32 formátu. Posledním vyhrazeným slovem je CMD,
jde o příkazovou řádku pro komunikaci mezi zavaděčem a jádrem. Při
běhu programu LINX, se
upraví soubor mbr.bin. Ten
bude obsahovat informace o tom, kde se
nachází jednotlivé části
operačních systémů. Pokud bude ve struktuře linx.cfg nutné zavedení systému
Linux, vytvoří se mapa (map= …). Následně je nutné poznamenat pozice sektorů,
kde se nachází soubor za vyhrazeným slovem MAP a ty uložit do n-tého
sektoru v nulté stopě. Díky těmto
mapám dokáže linx.bin zavést jádro na příslušné paměťové adresy bez větších
obtíží (viz obrázek 7.1.1). Parametry příkazového řádku se ukládají též do
n-tého sektoru, hned za pozici posledního LBA32 záznamu mapy (viz obrázek
8.1). Důvodem, proč program LINX vytváří dvě mapy, je ten, že jádro je
robustní (přes 1 MB) a uložení jeho mapy by zabralo v nulté stopě cca. 12
sektorů, ale s využitím druhé mapy je to jen 1 sektor v nulté stopě. |

Obrázek
8.1: Struktůra uložených map a Linx zavaděčů v nulté stopě disku
|
Slouží
jako boot manažer. Obsahuje textové menu, které dává uživateli na výběr, jaký
operační systém chce zavést (viz obrázek 8.1.1). |
Struktura menu v
jazyku Assembler
|
OS_Menu_Str: OS1 DB '1. ',00H,00H CHS1 DB 00H,00H,00H ; C.S/H -> C/H/S OS2 DB '2. ',00H,00H CHS2 DB 00H,00H,00H ; C.S/H -> C/H/S OS3 DB '3. ',00H,00H CHS3 DB 00H,00H,00H ; C.S/H -> C/H/S OS4 DB '4. ',00H,00H CHS4 DB 00H,00H,00H ; C.S/H -> C/H/S |
Struktura jedné
položky menu v jazyku C
|
struct
POLOZKA { byte pozice[0x3]; byte text[15]; byte set; byte lin; CHS
chs; }; |

Obrázek 8.1.1: Menu boot manažeru
Po spuštění se boot manager přesune z 0x007C00 na adresu 0x000600.
Kód přesunu z 0x007C00 na adresu 0x000600
|
MOV SI,SP ; registr SI=0000h MOV DS,AX LES
DI,[Adr_presunu]-100H+7C00H ; přečte
hodnoty z adresy ; DS:[Adr_presunu] do registrů ; ES:DI PUSH
ES ; uloží
registr ES do zásobníku MOV
CX,OFFSET(Konec)-100H ; počet
bajtů k přesunu STI ; nastavení
příznaku povolení ; přerušení do stavu 1 (set ; interrupt
enable flag) CLD ; nulování
příznaku směru ; zpracování
řetězce REP MOVSB ; přesun do adresy 0000:0600
= ; ES:DI o
velikosti CX MOV DI,OFFSET(Copy)-100H+0600H PUSH DI ; ukládá register DI do
zásobníku RETF ; odskok na
adresu 0000:0600 ; hodnoty jsou brány ze zásobníku |
|
·
Pro systémy Windows slouží jako tzv. chainloader (na svoje bývalé
místo v paměti nahraje zavaděč Windows z boot recordu). ·
V případě Linuxu dojde k načtení linx.bin z n-tého sektoru nulté stopy
na svoje bývalé místo v paměti. Před spuštěním systému dojde ke
kontrole signatury načtených dat. Poté může být předáno řízení. |
Načtení a
kontrola signatury Linx.bin nebo boot recordu
|
MOV DL,80H ; disk hda MOV DH,ES:[SI+02] ; číslo hlavy MOV CX,ES:[SI] ; cylindry+stopy MOV BX,7C00H ; ofsetová adresa CALL Rekalibrace ; rekalibrace zařízení CALL Cti_Sektor ; přečte zvolený sektor
na ; adresu ES:BX MOV DI,7DFEH CMP ES:BYTE PTR [SI-01H],01H ; test zda jde o Linux JE Cti_Linux Cti_Dos: CMP WORD PTR [DI],0AA55H ; test zda přečtená data ; obsahují značku 0xAA55 ;
boot sektoru JNZ Sign_Error JMP Predej_rizeni Cti_Linux: CMP WORD PTR [DI-0AH],0584CH ; test zda přečtená data ; obsahují
značku 0x584C ;
boot sektoru JNZ
Sign_Error |
Instrukce
pro předání řízení Linx.bin nebo boot recordu
|
Predej_rizeni: PUSH ES ; ulož adresu
na zásobník PUSH BX ; adresa je 0000:7C00H XOR SI,SI ; nuluj register
SI CALL Roluj_Okno_Nahoru ; odroluj okno MOV DH,24 XOR BH,BH CALL Nastav_Radku ; nastavi pozici kurzoru
k ;
levenu dolnim ; u
okraji obrazovky RETF ; skok na
adresu ; 0000:7C00H |
|
Pracuje se mapami, zavádí jádro a setup.S na správné paměťové místo a předává parametry z příkazového řádku, které jsou uloženy v n-tém sektoru nulté stopy (viz obrázek 8.1). Poté předá řízení setup.S. Adresy jádra vmlinuz (viz obrázek 7.1.1). |

Obrázek 8.2.1: Použité adresy zavaděčem LINX.BIN
Načítání jádra a práce s mapou
|
LES BX,[Adr_LBA_Map]-100H+7C00H ; nastaví adresu pro mapu ; „map“ 0000:8000H MOV AX,WORD PTR [MapLBA]-100H+7C00H MOV CX,WORD PTR [MapLBA+02H]-100H+7C00H CALL Cti_Sektor ; přečte mapu „map.bin“ Map: MOV AX,0E2EH ; zobrazí tečku INT 10H XOR DI,DI CMP BYTE PTR [CountMap]-100H+7C00H,00H ; test přečtených všech ; LBA z mapy „map.bin“ JE Predej_Rizeni ; předává řízení „setup.S“ CALL Cti_Map ; načte mapu vmlinuz na ; adresu 0000:8200 ;Přečte LBA (VmLinuz) ze souboru map.bin Vmlinuz: MOV BX,8200H DEC WORD PTR [BX+1FEH] ; dekrementuje počet ; načtených LBA dat z mapy ; vmlinuz CMP BYTE PTR [CountSetup]-100H+7C00H,00H ; test počtu načtených ; „setup.S“ JE WriteToEMS ; čtení jádra do EMS DEC [CountSetup]-100H+7C00H ; dekrementuje zbývající ; délku „setup.S“ MOV AX,WORD PTR [BX+DI] ; hodnota LBA32.[HI] ; vmlinuz MOV CX,WORD PTR [BX+DI+02H] ; hodnota LBA32.[LO] ; vmlinuz PUSH ES LES BX,DWORD PTR [AdrSetup]-100H+7C00H ; získání adresy pozice ; „setup.S“ v paměti CALL Cti_Sektor ; načte sektor na adresu ; 9000:0000+200 ADD DI,04H POP ES ADD WORD PTR [OFFSET(AdrSetup)+02H]-100H+7C00H,20H ; zvýšení adresy „setup.S“ JMP Vmlinuz WriteToEMS: MOV AX,WORD PTR [BX+DI] ; hodnota LBA32.[HI] ; vmlinuz MOV CX,WORD PTR [BX+DI+02H] ; hodnota LBA32.[LO] ; vmlinuz MOV BX,8400H CALL Cti_Sektor ; načte sektor na adresu ; 0000:8400 CALL SaveToEMS ; ukládá přečtený sektor ; do EMS ADD DI,04H CMP WORD PTR [BX-200H+1FEH],00H ; test zda byly přečteny ; všechny sektory z mapy ; vmlinuz JE Map JMP Vmlinuz |
[1] Černý Vladislav: MS-DOS 6.2, 6.22 prakticky, Kopp, 1995 [1] URL=http://www.linuxgazette.com [2] URL=http://www.pcguide.com [3] URL=http://www.nondot.org [4] URL=http://www.fi.muni.cz [5] URL=http://home.att.net/~rayknights [6] URL=http://tldp.org/LDP/sag Použita dokumentace OS Linux (/usr/src/linux/Documentation/i386/boot.txt, /usr/src/linux/Documentation/devices.txt) |