Vývoj operačného systému/Bootloader po druhé - práca s diskovými jednotkami: Rozdiel medzi revíziami

Smazaný obsah Přidaný obsah
Riadok 64:
 
== Funkcie BIOSu ==
Na prácu s diskovými jednotkami sa používa prerušenie 19 (0x13) patriace BIOSu. Toto prerušenie poskytuje nízkoúrovňový prístup k disku využitím funkcií jednotných pre viacero druhov zariadení. Pôvodné verzie BIOSu podporovali len okolo 504MB pamäte (adresovanie v tejto veľkosti sa zvykne označovať aj ako fyzické CHS). Samotné pôvodné (štandardné) adresovanie CHS poskytuje má tieto obmedzenia:
{| class="wikitable"
|-
! Časť adresy !! Bitová šírka !! Max. hodnota !! Max. reálny počet prvkov
|-
| Hlavy || 8 || 255 || 256
|-
| Cylindre || 10 || 1023 || 1024
|-
| Sektory || 6 || 63 || 63 <ref name="stupid-floppy-sectors" />Kým pri ostatných častiach adresy sa označujú prvky od 0 (ako je to zvykom), pri sektoroch začína 1. Preto je maximálne hodnota zároveň limitom počtu prvkov.
 
Pri práci so zariadeniami ATA(IDE) je možné vybrať limity vo formáte CHS rovnako ako v LBA. Môže sa však stať, že zariadenie bude rátať s existenciou nultého sektoru. Preto sa viac oplatí používať adresovanie LBA, kde taktiež netreba zabudnúť na nultý sektor.</ref>
|-
| Veľkosť jedného sektoru || - || - || 512
|-
| Spolu || 24 bitov || ~8024.6557MB || 8064MB
|}
<references />
Tieto hodnoty pre adresovanie samozrejme nestačili pokryť rýchly vývoj v oblasti úložných zariadení, a tak sa do BIOSu pridali nové funkcie (známe aj ako rozšírenia prerušenia 19 - ''INT 13h Extensions''). Rozšírené funkcie používajú adresovanie LBA, čím sa značne navýšili limity zariadení.
 
Úložné zariadenia majú v celom BIOSe jednoduché (a zároveň momentálne ťažko prakticky využiteľné) označenie, ktoré sa ukladá do jedného 8-bitového čísla (ktoré sa často/zvyčajne nachádza v registri DL). V dnešnej dobe je ťažké doplniť doň nové druhy zariadení, a preto sa tento formát v dnešných operačných systémoch nepoužíva.
{| class="wikitable"
|-
! Hodnota !! Zariadenie
|-
| 0x00 || Prvé disketové zariadenie ('A:')
|-
| 0x02 || Druhé disketové zariadenie ('B:')
|-
| 0x80 || Prvý pevný disk
|-
| 0x81 || Druhý pevný disk
|}
'''Poznámka:''' Označenia prvý a druhý pevný disk nemajú pevné prepojenie so zariadeniami ATA. Môže sa jednať o CD-ROM, prvý a druhý pevný disk, alebo ich podzariadenia (''slaves'').
 
Základné funkcie prerušenia 19 sú usporiadané logicky.
{| class="wikitable"
|-
! Hodnota (hex) !! Funkcia !! Vstup !! Výstup
|-
| 00 || Reštartuje konkrétne zariadenie (zo zariadení známych pre BIOS) || DL = BIOSové označenie zariadenia || CF = v prípade chyby 1; inak 0
|-
| 01 || Získa stav poslednej operácie vykonanej na zariadení || DL=zariadenie || CF = v prípade chyby 1; inak 0, AL = kód chyby
{| class="wikitable"
|-
! Hodnota (hex) !! Stav
|-
| 00 || Úspech
|-
| 01 || Neprávny (nepovolený) príkaz
|-
| 03 || Pokus o zápis na disk chránený proti zápisu
|-
| 04 || Sektor nenájdený
|-
| 05 || Reštartovanie zlyhalo
|-
| 0A || Zistený (nájdený) chybný sektor (''bad sector'')
|-
| 0B || Zistený (nájdený) chybný cylinder/stopa (''bad cylinder'')
|-
| 0D || Nesprávny (nedovolený) počet sektorov
|-
| 20 || Chyba radiča
|-
| 40 || Chyba pri presúvaní kurzoru (ihlice, ''seek failure'')
|-
| 80 alebo AA || Zariadenie nepripravené
|-
| BB || Neznáma chyba
|-
| CC || Chyba pri zápise
|-
| E0 || Chyba stavu (''status error'')
|}
|-
| 02 || Čítanie sektorov zo zariadenia || AL = počet sektorov na čítanie, DL = zariadenie, DH = číslo "hlavy", ES:BX = adresa uloženia prečítaných dát v pamäti, CX[0-5] = sektor, CX[6-15] = stopa/cylinder || CF = v prípade chyby 1; inak 0, AH = kód stavu (ako pre funkciu 01), AL = počet prečítaných sektorov
|-
| 03 || Zápis sektorov na zariadenie || AL = počet sektorov na zápis, DL = zariadenie, DH = číslo "hlavy", ES:BX = adresa dát na zápis, CX[0:5] = sektor, CX[6:15] = stopa/cylinder || CF = v prípade chyby 1; inak 0, AH = kód stavu (ako pre funkciu 01), AL = počet zapísaných sektorov
|-
| 04 || Overenie sektorov na disku (hľadanie chýb). S dátami v pamäti sa nepracuje. Pri výskyte chyby by mal program niekoľkokrát overiť (a reštartovať), či sa disketa nachádza v zariadení. || AL = počet sektorov na overenie, DL = zariadenie, DH = číslo "hlavy", ES:BX, CX[0:5] = sektor, CX[6:15] = stopa/cylinder || CF = v prípade chyby 1; inak 0, AH = kód stavu (ako pre funkciu 01), AL = počet (úspešne{{Citation needed}}) overených sektorov
|-
| 08 || Získa parametre zariadenia || DL = zariadenie, [ES:DI = niekedy vyžadovaná hodnota 0 na niektorých BIOSoch] || CF = v prípade chyby 1; inak 0, AH = kód stavu (ako pre funkciu 01), DL = počet (pevných?<ref name="floppy_or_all">Rôzne zdroje uvádzajú rôzne informácie, nemusí sa jednať len o diskety.</ref>) diskov, DH = posledná (maximálna) "hlava" <ref name="last_head_lol">Z dôvodu číslovania "hláv" od 0 je nutné pripočítať 1 na zistenie počtu hláv</ref>, CX[0:5] = počet sektorov na stope, CX[6:15] = posledná maximálna) stopa/cylinder<ref name="last_head_lol">Z dôvodu číslovania cylindrov/stôp od 0 je nutné pripočítať 1 na zistenie celkového počtu</ref>, ES:DI = adresa tabuľky parametrov <ref name="floppy_or_all" />, BL = typ diskety podľa tabuľky
{| class="wikitable"
|-
! Hodnota !! Typ
|-
| 01 || 5.25 palcová disketa, 360KB a 40 stôp/cylindrov
|-
| 02 || 5.25 palcová disketa, 1.2MB a 80 stôp/cylindrov
|-
| 03 || 3.5 palcová disketa, 720KB a 80 stôp/cylindrov
|-
| 04 || 3.5 palcová disketa, 1440KB a 80 stôp/cylindrov
|}
|-
| 42 || Rozšírené čítanie sektorov zo zariadenia, funguje na princípe paketov a používa adresovanie LBA || DL = zariadenie, DS:SI = adresa na DAP ''(Disk Address Packet'' - paket diskovej addresy) || CF = v prípade chyby 1; inak 0, AH = kód stavu (ako pre funkciu 01)
|-
| 43 || Rozšírený zápis sektorov zo zariadenia, funguje na princípe paketov a používa adresovanie LBA || DL = zariadenie, DS:SI = adresa na DAP, AL = nastavenia zápisu || CF = v prípade chyby 1; inak 0, AH = kód stavu (ako pre funkciu 01)
|-
| 46 || Vysunúť konkrétne médium. || DL = zariadenie, AL = 00 (rezerovované{{Citation needed}}) || CF = v prípade chyby 1; inak 0, AH = kód stavu (ako pre funkciu 01)
|}
<references />
 
[[Kategória:Operačné systémy]]