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
Bez shrnutí editace
d robot kozmetické zmeny
Riadok 1:
Práca s diskovými jednotkami je v dnešnej dobe najdôležitejšia súčasť BIOSu. Cieľom bootloaderu je načítať ďalšie časti operačného systému v slede procesu "bootovania", a to ide bez pomoci BIOSu len zložito a hlavne neprehľadne či neprenosne (medzi rôznymi typmi diskov).
 
== Hierarchia disku ==
V minulosti nebol z praktického hľadiska v štruktúre pevného disku a diskety taký veľký rozdiel.
Disková jednotka bola rozdelená
* '''z fyzického hľadiska''' do "dosiek/tanierov" (''plates'')
* '''z logického hľadiska''' do "hláv" (''head''), "stôp/cylindrov" (''track/cylinder'') a "sektorov" (''sector'') - hierarchia (od hora), pričom počet jednotlivých prvkov v jednom nadradenom prvku bol jednotný pre jeden disk, ale rozdielny pre rôzne typy
[[Súbor:Floppy disk structure.gif|náhľad|vpravo|Logická štruktúra disku]]
Na každý "tanier" v zariadení (disketa mala jeden 1, pevné disky viac) sa dá zapisovať z dvoch strán. Každá jedna strana teda symbolizuje jednu "hlavu". Na jednotlivých "hlavách" sú zasadené stopy (alebo inak aj cylindre, kedže ''n''-tá stopa sa nachádza na ''n''-tej hlave na rovnakom mieste). Každá stopa obsahuje fixný počet sektorov z ktorých každý obsahuje fixný počet bajtov.
 
Pri čítaní z disku sa vsunul každý tanier medzi čítacie ihlice (alebo aj inak čítacie "ruky" (''arm'') či čítacie hlavy), čím sa dospelo k stavu v ktorom mala každá "hlava" svoju ihlicu. Mechanizmus na posúvanie ihlíc je spoločný pre všetky "hlavy", čo znamená že ak sa musí otočiť jedna ihlica, otočia sa všetky. Z toho dôvodu sa jednotlivé stopy nezapisujú lineárne na jednu stranu taniera, ale striedavo na obidve strany, čím sa minimalizuje potreba posúvania hlavy a celý proces je rýchlejší. Táto hierarchia sa preto niekedy označuje aj v poradí cylinder-hlava-sektor.
Riadok 35:
 
== Adresovanie LBA ==
Adresa [[w:en:Logical block addressing|LBA]] je aktuálne všeobecne používaná pre adresovanie na diskoch (vo vzorcoch vyššie uvedená ako lineárna adresa alebo <math>lin</math>). Na rozdiel od adresovania CHS sa v prípade LBA používa len jedno číslo (začínajúce od nuly, viď vzorce vyššie). Pre súborové systémy (rovnako ako aj pre disky samotné) je jednoduchšie (a úspornejšie) držať len jedno číslo.
Pre diskové jednotky sú známe dva formáty:
* '''LBA28''': (3.5 bajtu), maximálny počet sektorov <math>\textstyle 268,435,456</math> (pri veľkosti sektoru 512 bajtov je to 128GB dát)
Riadok 42:
Forma adresovania však ešte neurčuje skutočnú veľkosť disku; čipy (alebo kódy) vytvorené pre disky veľkých kapacít (vyžadujúc tak väčšie adresovanie) sa umiestňujú aj na menšie disky a tak môže aj disk o veľkosti napríklad 80GB používať adresovanie LBA48, hoci to vôbec nepotrebuje.}}
Je taktiež nutné poznamenať že veľkosť diskov sa často neudáva v mocninách čísla 2, ale v mocninách čísla 10, čím je disk na pohľad väčší. Preto môže mať USB o veľkosti 4GB (<math>\textstyle 4\times10^9 </math>) v skutočnosti len okolo 3.73GB (<math>\textstyle x \times 10^9 \over 2^{30}</math>) oproti očakávaným <math>\textstyle 2^{32}</math>B. Čím väčší disk kupujete, tým prekvapenejší môžete byť.
Množstvo bajtov v programátorskom značení pre
 
<math>\textstyle p\in \mathbb{N}</math>
 
kde bude <math>p</math> zastupovať multiplikáciu stupňa umocňovania (kB = 1, MB = 2, GB = 3, TB = 4 ...), môžeme vyjadriť ako
Riadok 90:
|}
<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 viaceré 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"
|-
Riadok 150:
|}
|-
| 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{{neoverené}}) 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" />,
 
ES:DI = adresa tabuľky parametrov diskety <ref name="floppy_or_all" />,
 
BL = typ diskety podľa tabuľky
Riadok 230:
|}
|-
| 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)
Riadok 246:
| 46 || Vysunutie konkrétneho média
 
|| DL = zariadenie, AL = 00 (rezerovované{{neoverené}})
 
|| CF = v prípade chyby 1; inak 0,
 
AH = kód stavu (ako pre funkciu 01)
|}
<references />
== Použitie funkcii ==
=== Funkcie 00 a 01 ===
Kedže je reštartovanie disku jednou z jeho funkcií (00), je možné overiť si úspech tejto operácie použitím funkcie 01. Zároveň sa odporúča overiť (reálne<ref name="real_device_vs_virtual_device">Na virtuálnych zariadeniach sa tento problém pochopiteľne veľmi nevyskytuje</ref>) zariadenie niekoľkokrát (asi 3x).
<syntaxhighlight lang="asm">
BITS 16
Riadok 276:
</syntaxhighlight>
Kódové ukážky uvedené nižšie budú funkčne zanedbávať AH ako návratovú hodnotu v prípade chyby.
=== Funkcie 02 a 03 ===
Úložné zariadenia ani BIOS neposkytujú možnosť kopírovania sektorov z jedného miesta na druhé<ref name="its_not_really_possible">Vo všeobecnosti taká operácia v oblasti pamäte nie je možná vôbec (teda ak nerátame rôzne čipy schopné podržať informácie kým sa spracujú)</ref>. Preto je nutné využiť na tento účel funkcie ktoré poskytujú (čítanie 02 a zápis 03) a dáta dočasne ukladať v pamäti RAM.
 
Riadok 319:
</syntaxhighlight>
 
=== Funkcia 04 ===
Ukážka kódu vytvorená pre túto funkciu využije štruktúru uvedenú vyššie a poslúži ako nástroj na overovanie zdroja a destinácie pred kopírovaním. Funkcia prijíma adresy štruktúr a počet sektorov na kontrolu.
<syntaxhighlight lang="asm">
Riadok 348:
</syntaxhighlight>
 
=== Funkcia 08 ===
Tento kód získa informácie o zariadení a vráti ich<ref name="sure_no_error">v prípade že sa nevyskytne chyba</ref> v štruktúre vytvorenej v ukážke pre funkcie 02 a 03.
<syntaxhighlight lang="asm">
;VSTUP: DS:DI = štruktúra pre zariadenie,
Riadok 373:
Na základe vzorcov uvedených vo vyššej časti článku a pripomienok v tabuľke môžete vypočítať veľkosť zariadenia v bajtoch.
 
=== Poznámky ===
<references />
 
= Podrobné zdroje =
Hoci je isté, že sa smer kódov BIOSu výrazne zmenil, je nutné poznamenať, že na rozdiel od iných oblastí ktorými sa BIOS zaoberá sa v tomto prípade v mnohom zmenili aj vlastnosti úložísk (pričom sa napríklad PS/2 a VGA až tak nezmenili). Nikdy nie je dobré spoliehať sa na BIOS v plnej miere, a pre zariadenia na ukladanie dát to platí dvojnásobne. Nižšie je uvedený zoznam celkom podrobných zdrojov na prácu s BIOSom s ohľadom na tento druh zariadení.
* [[w:en:INT 13H|Prerušenie 13h na anglickej Wikipédii]]
* [http://www.datadoctor.biz/author.htm Ukážkové kapitoly knihy "Data Recovery with & without Programming" (záchrana dát s a bez programovania)]