JAK BIOSEM NA DISKY Uvod Napadlo vas nekdy, proc pri obnovovani souboru lze nektere soubory obnovit a jine nikoli? Nebo jina otazka. Jak pracuji bootovaci viry? Jak naformatovat pouze jednu stopu disku? Jak se ochranit proti bootovacim virum? Znate odpovedi na tyto otazky? Pokud ano, pak vam mini serial, ktery prave zacina, pravdepodobne nic noveho nerekne. Pokud ale odpovedi neznate, je tento serial urcen prave vam. Co vsechno se zde dozvite a naucite? Naucite se pracovat s jednotlivymi sektory, verifikovat je a formatovat. Nebude pro vas problem udelat si utility, ktere budou chranit vase disky tak, jako to delaji napr. PC Tools ci Norton Utilities. Naucite se pracovat s boot sektorem a ziskavat z nej uzitecne informace. Stejne tak se naucite pracovat s tabulkou obsazeni sektoru FAT (File Allocation Table). Budete umet vytvorit program, ktery bude obnovovat smazane soubory. Poznate take, proc v nekterych pripadech soubor obnovit nelze. Uvidite, jak pracuji viry, ktere si oznacuji casti disku jako vadne a v nich se potom ukryvaji. Naucite se, jak se proti takovymto virum chranit. Uvidite i dalsi slaba mista disku. Podivate se do nejzazsi casti disku, na tabulku logickeho rozdeleni hard disku (Disk Partition Table). To je opet velmi prihodne misto pro vir a proto je vhodne umet si tuto oblast ohlidat. Pro vyklad jsem zvolil nasledujici postup. Nejprve si osvojite nezbytne vedomosti o fyzicke strukture disku. Naucite se, jak s diskem pracuje DOS a jak BIOS. Po zvladnuti techto nejnutnejsich zakladu se uz muzete "podivat" na disk. Po tomto nutnem uvodu jiz budou popisovany struktury na disku a nasledne pak reseni konkretnich problemu. Bude take uvedeno mnozstvi prikladu. Vsechny priklady budou zpracovany v jazyce Turbo Pascal 6.0. Fyzicka struktura disku Nejprve vam povim neco o tom, jak disky vypadaji z fyzickeho hlediska. Informace zde uvedene vam pomohou pri praci s prerusenimi, ktera pracuji s disky na nizke urovni (v pripade, ze pristupujete k portum, je znalost fyzicke struktury disku naprosto nezbytna). Fyzicka struktura pevneho disku i disket je prakticky stejna. Povrch media je rozdelen do soustrednych kruhu - stop (track). Kazda stopa je rozdelena na sektory (vysece z kruhu). Vsechny stopy na disku obsahuji stejny pocet sektoru a vsechny sektory maji stejnou velikost. Velikost sektoru je u disket i u pevnych disku vetsinou 512B. Dale je mozne vyuzivat vice povrchu media. Anglicky ekvivalent pro povrchy je head a odtud se take povrchy nekdy nazyvaji hlavami. U disket maximalne dva, u pevnych disk u to byva 4-15 pripadne i vice. Pro zjisteni informace o poctu sektoru, povrchu a stop se pouziva preruseni BIOSu 13H, jehoz sluzba 08H vraci vsechny potrebne parametry disku. Tato sluzba bude popsana dale. Kapacitu diskety vypoctete: pocet povrchu (head) * pocet stop(track) * pocet sektoru/stopu * 512 (kapacita jednoho sektoru) = kapacita disku v bajtech. Pocet vyuzivanych povrchu se u disket muze lisit (je vyuzivan bud jeden nebo oba dva povrchy). Stejne tak je mozne u disket volit pocet sektoru (8, 9, 15) a pocet stop (40, 80). U pevnych disku jsou tyto hodnoty stanoveny vyrobcem a nelze je menit. V nize uvedene tabulce jsou uvedeny skutecne hodnoty povrchu, stop a sektoru u disket 5.25 palce s ruznymi kapacitami. ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³Kapacita ³ pocet stran ³ pocet stop ³ pocet sektoru ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³160KB ³ 1 ³ 40 ³ 8 ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³360KB ³ 2 ³ 40 ³ 9 ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³1200KB ³ 2 ³ 80 ³ 15 ³ ÀÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Jak je z tabulky videt, vysokokapacitni diskety pouzivaji 80 stop (track). Na diskete je tedy 80 soustrednych kruznic. Jak znamo, na zapisovani a cteni vysokokapacitnich disket musite pouzit vysokokapacitni diskovou mechaniku. Cim se lisi vysokokapacitni disketova mechanika od nizkokapacitni? Nejdulezitejsi rozdil je sirka hlavicky. Na diskete 1.2MB je dvojnasobne mnozstvi stop nez na diskete 360KB. Proto musi byt hlavicka ve vysokokapacitni mechanice uzsi. Z toho take vyplyva, proc nejdou diskety 1 .2MB cist v mechanice 360KB. To je znama vec, ALE: pokud na vysokokapacitni disketove jednotce naformatujete disketu na 360 KB (coz je bez problemu uskutecnitelne), muze (ale nemusi) se vam stat, ze vam tato disketa nepujde mechanikou urcenou pro 360KB precist. Proc? Podivejte se jeste jednou do tabulky. Disketa s kapacitou 1.2MB pracuje s 80 stopami. Mezi stopami na diskete jsou tedy velike mezery, jejichz obsah "neni definovan". Vlozite-li pak tuto disketu do mechaniky 360KB, kde je hlavicka sirsi, snadno vam nedefinovana mis ta mohou natolik odstinit vlastni zaznam, ze se disketa stane necitelnou. To je ovsem pouze cast pravdy. To, zda disketa bude nebo nebude citelna zavisi take na hardwarove konstrukci mechaniky. Pevne disky Pevne disky se lisi od disket tim, ze jejich fyzicke rozdeleni je stanoveno vyrobcem a nelze ho menit. Proto take kdyz si pri spusteni pocitace zavolate SETUP (press DEL to run SETUP) a pokusite se zmenit cislo pevneho disku, dostane se vam varovani, ze spatne cislo muze zapricinit chybny pristup k disku (cislo disku totiz jednoznacne urcuje pocet povrchu, a valcu). Pevne disky se mohou lisit poctem povrchu, poctem stop na jednom povrchu i poctem sektoru na stope. Pevny disk si lze predstavit jako nekolik disket nad sebou. Vsechny stopy, ktere se nachazeji pod sebou tvori valec (cylinder) (jsou to stopy, ktere maji stejnou vzdalenost od kraje). Kazda stopa na pevnem disku je rozdelena na 17 nebo 35 sektoru (pripadne i vice). Zde je nekolik prikladu (vice si muzete prohlednout v SETUPu): ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄ¿ ³Kapacita ³ povrchu ³ valcu ³ typ ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄ´ ³ 133 MB ³ 15 ³ 1024 ³ 32 ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄ´ ³ 21 MB ³ 4 ³ 615 ³ 2 ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄ´ ³ 31 MB ³ 5 ³ 733 ³ 22 ³ ÀÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÙ Spravnost tabulky lze opet snadno zkontrolovat. Napr. prvni radek: 1024*15*17(pocet sektoru)*512(velikost sektoru) = 133 MB. Je treba, abyste si uvedomili jednu velmi dulezitou vec. Je naprosto lhostejne, zda se mluvi o valcich nebo o stopach. Valec je pouze jiny nazev stopy, ktery se pouziva pro pevne disky. Shrnuti: 1.Disky maji ruzny pocet povrchu. Povrchy se cisluji od nuly! 2.Povrch je rozdelen do soustrednych kruhu, jimz se u disket rika stopy (track), u hard disku valce (cylinder). V podstate je to ale totez a proto mohou byt tyto dva nazvy zamenovany. Valce se cisluji od nuly. 3.Kazda stopa je rozdelena na vysece, jimz se rika sektory. Do jednoho sektoru se vejde 512 bajtu (tato hodnota muze byt vyjimecne i jina). Sektory se cisluji od jedne! Disky maji ruzny pocet povrchu (head), sektoru a stop (track). Podle techto tri hodnot se da urcit celkova kapacita disku. Jak se na disky diva DOS a jak BIOS Protoze pri praci s diskem na urovni BIOSu je logicke cislovani jine nez na urovni DOSu, je treba si rozdil objasnit. BIOS: Operace s disky provadene na urovni BIOSu pracuji s cisly povrchu, stopy a sektoru. Po zadani techto tri parametru muzete cist data z disku, zapisovat, verifikovat apod. Je ale nutne vedet, ze: 1.cislovani sektoru zacina cislem 1 (to co je pro DOS nulty sektor je pro BIOS sektor prvni). Prvni sektor ma tedy cislo 1. 2.prvni povrch ma cislo 0. 3.prvni stopa ma cislo 0. Jak sami vidite, BIOS pracuje s diskem podle jeho fyzicke struktury. Chcete-li napriklad precist jeden sektor z disku, je nutne BIOSu zadat povrch, stopu a cislo sektoru. DOS: Operace s disky provadene pres preruseni DOSu vyhledavaji fyzicky sektor podle tzv. logickeho cisla sektoru. DOS kazdemu sektoru na disku prirazuje logicke cislo a to je jedinym parametrem pro praci s diskem (o cislo stopy a povrchu se DOS nezajima). DOS cisluje sektory od 0. To znamena, ze prvni logicky sektor ma cislo 0. Zacina se od nulteho povrchu a nulte stopy (to ale plati pouze pro diskety, protoze pevne disky maji na povrchu 0, stope 0 a sektoru 1 tabulku logickeho rozdeleni disku). Prehledn ejsi snad bude tabulka (zobrazuje situaci diskete, kde je 17 sektoru na stopu - s timto poctem sektoru se u diskety nikdy nesetkate): ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄ¿ ³logicke cislo sektoru ³ 0 ³ 1 ³ 16 ³ 18 ³ 19 ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´ ³fyzicky sektor ³ 1 ³ 2 ³ 17 ³ 1 ³ 2 ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´ ³fyzicky povrch ³ 0 ³ 0 ³ 0 ³ 1 ³ 1 ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´ ³fyzicka stopa ³ 0 ³ 0 ³ 0 ³ 0 ³ 0 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÙ Z tabulky je videt, jak se postupuje pri zvetsovani logickeho cisla sektoru. Logicke cislo sektoru roste: sektor - povrch - stopa(valec). Logicky sektor c. 15 se nachazi na stope c. 0, povrchu c.0 Logicky sektor c. 20 se nachazi na stope c. 0, povrchu c.1 Az se dosahne maximalniho cisla povrchu, pak teprve se zvetsi cislo stopy. Dulezite: Logicke cislovani DOSu zacina boot sektorem (viz dale). Boot sektor je prvni sektor na diskete z cehoz vyplyva, ze u disket muzete pomoci preruseni DOSu 25H a 26H (jedna se o sluzby pro cteni a zapis sektoru, viz dale) pristupovat ke vsem sektorum. Toto vsak neplati u hard disku, kde BOOT sektor NENl prvnim sektorem na disku. To znamena, ze DOS formou sveho logickeho cislovani neumoznuje pristup ke vsem castem hard disku. Toto omezeni se da samozrejme obejit, a to tak, ze pouzijete sluzeb preruseni BIOSu 13H (viz dale). Priklad: Mate disketu s nasledujicimi parametry: pocet povrchu 2 pocet sektoru stopu 9 pocet stop 40 Schematicke znazorneni diskety: (s1=sektor c.1, s2=sektor c.2 atd.) ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ stopa c.0 ³s1³s2³s3³s4³s5³s6³s7³s8³s9³ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ stopa c.1 ³s1³s2³s3³s4³s5³s6³s7³s8³s9³ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ stopa c.2 ³s1³s2³s3³s4³s5³s6³s7³s8³s9³ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ . . ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ stopa c.40 ³s1³s2³s3³s4³s5³s6³s7³s8³s9³ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ 1. Urcete logicke cislo sektoru c. 8, ktery je na stope c. 1, na povrchu c. 1 (pozor povrchy se cisluji od 0, sektory od 1 a obrazek zobrazuje pouze povrch c. 0) Logicke cislo sektoru = 3 * 9 + 8 - 1 = 34 3 = pocet stop pred stopou, na ktere se nachazi dany sektor. (1. stopa c. 0, povrch c. 0, 2. stopa c. 0, povrch c. 1, 3. stopa c. 1, povrch c. 0) 9 = pocet sektoru na stopu 8 = osmy sektor na stope -1 = logicke cislovani sektoru zacina sektorem cislo 0 2. Urcete kde se fyzicky na disku nachazi sektor s logickym cislem 15. 15/9 = 1.6666 - je tedy jasne, ze sektoru predchazi 1 stopa 15-9 = 6 - sektor je sedmy na stope (logicke cislovani DOSu zacina cislem 0, zatimco BIOS prirazuje prvnimu sektoru cislo 1) Protoze se jedna o disketu se dvema povrchy, je fyzicke umisteni sektoru: povrch c. 1 stopa c. 0 sektor c. 7 Shrnuti: 1. DOS prirazuje kazdemu sektoru na disku logicke cislo. Logicka cisla se zvetsuji sektor - povrch - stopa (valec). Prvni sektor ma logicke cislo 0. 2. BIOS adresuje mista na disku pomoci cisla sektoru (1..s), stopy (0..t), a povrchu (0..t). Cteni a zapis sektoru pomoci preruseni DOSu DOS poskytuje pouze dve sluzby pro praci se sektory. Preruseni 25H slouzi pro cteni sektoru, preruseni 26H pro zapis. INT 25H: Cteni sektoru z disku Vstup:AL = cislo diskoveho zarizeni (0=A, 1=B ... atd.) CX = pocet sektoru ktere se maji precist DX = logicke cislo prvniho cteneho sektoru DS:BX = Segment:Offset - adresa pameti, kam se ulozi nactena data Vystup:CF = 0 - cteni probehlo bez chyb CF = 1 - pri cteni doslo k chybe Preruseni 25H zajisti precteni pozadovaneho poctu sektoru (CX) od zadaneho prvniho sektoru (DX). Preruseni DOSu INT 25H a INT 26H jsou jedina, ktera na urovni DOSu dovoluji pracovat primo se sektory. Pokud pri obsluze preruseni 25H doslo k chybe, je po navratu nastaven priznak CF (CF=1). Tzn. ze registr priznaku obsahuje liche cislo. Pokud je CF=0, znamena to, ze vse probehlo spravne a na adrese DS:BX se nachazeji nactena data. V pripade, ze doslo k chybe (CF=1), je v registru AX ulozen chybovy kod. V registru AL se nachazi chybovy kod DOSu a v registru AH je chybovy kod BIOSu. Dulezite: Nepozadujte nacteni vice sektoru, nez kolik se jich vejde do oblasti zacinajici ofsetem v registru BX a koncici danym segmentem: ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ Oblast pro nacitana data ³ ÃÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄkonec segmentu ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄBX ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄzacatek segmentu Bude-li napr. BX=f000H pak CX by melo byt mensi nez 1000H/200H = 8Dec (200H je velikost sektoru, 200H = 512Dec). INT 26H: Zapis sektoru na disk Vstup:AL = cislo diskoveho zarizeni (0=A, 1=B ... atd.) CX = pocet sektoru ktere se maji zapsat DX = logicke cislo prvniho zapisovaneho sektoru DS:BX = Segment:Offset - adresa pameti, kde jsou ulozena data, ktera se budou zapisovat Vystup:CF = 0 - cteni probehlo bez chyb CF = 1 - pri cteni doslo k chybe Preruseni 26H zajisti zapis pozadovaneho poctu sektoru (CX) od zadaneho prvniho sektoru (DX). Pokud pri obsluze preruseni 26H doslo k chybe, je po navratu nastaven priznak CF=1. Pokud je CF=0, vse probehlo spravne a data na adrese DS:BX byla zapsana na prislusne misto na disku. V pripade, ze doslo k chybe (CF=1), je v registru AX ulozen chybovy kod. V registru AL se nachazi chybovy kod DOSu a v registru AH je chybovy kod BIOSu. Chybove kody DOSu pro praci s disky 00H Zapis na disketu chranenou proti zapisu 01H Neplatne cislo zarizeni 02H Zarizeni neni pripraveno 03H Chyba parity (CRC) 06H Chyba pri vystavovani hlavicek 07H Neznamy format disku 08H Sektor nenalezen 0aH Chyba pri zapisu 0bH Chyba pri cteni 0cH Jina chyba Chybove kody BIOSu pro praci s disky 00H Chyba, kterou nelze blize specifikovat 02H Nenalezena znacka sektoru 03H Disketa je chranena proti zapisu 04H Chybne cislo sektoru 05H Chyba pri resetovani radice 20H Chyba radice 40H Chyba pri vystavovani hlavicek 80H Zarizeni neni pripraveno Sluzby BIOSu pro praci s disky Preruseni BIOSu 13H poskytuje sluzby pro praci s disky na nizke urovni. Funkce tohoto preruseni poskytuji pristup ke vsem castem disku, dovoluji formatovat jednotlive stopy apod. Na teto urovni se da snadno zjistit i to, zda nekdo otevrel nebo neotevrel dvirka disketove jednotky. Popis sluzeb, ktere nabizi preruseni BIOSu 13H: 00H Resetovani radice 01H Ziskani stavu posledni diskove operace (chybovy kod) 02H Cteni sektoru 03H Zapis sektoru 04H Verifikace sektoru 05H Formatovani stopy 08H Ziskani parametru disku 0aH Cteni dlouheho sektoru z pevneho disku 0bH Zapis dlouheho sektoru z pevneho disku 0cH Vystaveni hlavicek pevneho disku 11H Rekalibrace pevneho disku (tzn. vystaveni hlavicek na pocatecni pozice) 15H Typ disku 16H Zjisteni, zda byla otevrena dvirka disketove jednotky 17H Nastaveni typu disku Zjisteni parametru disku K tomu, abyste mohli s diskem pracovat pomoci sluzeb BIOSu potrebujete znat maximalni hodnoty valcu (stop), povrchu a sektoru. Tyto hodnoty potom pouzijete napr. pri cteni sektoru, formatovani stop apod. INT 13H/Fn. 08H: Parametry disku Vstup:AH = 08H DL = cislo jednotky (0=A, 80H=pevny disk) Vystup:CF = 1 - chyba. Zadali jste spatne cislo zarizeni, chybovy kod je v registru AH. DL = pocet FYZICKYCH zarizeni na prvnim radici (controller) DH = maximalni pocet povrchu (head) CH = maximalni pocet valcu (cylinder), u diskety stop (track) CL = pocet sektoru (bity 6 a 7 jsou horni bity valce, viz INT 13H/Fn. 02H) BL = typ disketove jednotky. Tato hodnota se nevraci, zadate-li informaci o pevnem disku (pouze u pocitacu AT) BL =1 - mechanika 360 KB 2 - mechanika 1.2 MB 3 - mechanika 720 KB 4 - mechanika 1.44 MB Pokud zadate informaci o pevnem disku, jsou vysledne hodnoty (pocet povrchu apod.) zavisle na typu pevneho disku. Typ pevneho disku je ulozen v pameti CMOS (pamet napajena baterii i po vypnuti pocitace). Proto v pripade, ze byste menili tyto hodnoty (coz je nepravdepodobne), je treba dat o tom BIOSu vedet. Jedna ze sluzeb BIOSu nabizi moznost aktualizace typu disku. Popisovat tuto sluzbu se mi ale zda zbytecne, protoze pokud budete napr. menit disketovou mechaniku 360KB za mechaniku 1.2 MB, zmenite prislusne informace v SETUPu. Dulezite: Rekneme, ze jste si "hrali" se SETUPem, a zmenili jste typ disku. Puvodni cislo jste zapomneli a proto budete chtit pouzit sluzbu INT 13/Fn. 08H. Tato sluzba ale NEVRCTl SKUTECNE PARAMETRY HARD DISKU. Vrati vam hodnoty, odpovidajici typu hard disku, ktery jste nastavili v programu SETUP. Proto je tak dulezite si typ hard disku nekam zapsat. V nejhorsim pripade sundejte kryt pocitace a prohlednete si hard disk. Na horni strane byva vetsinou cislo urcujici typ hard disku. Pozn.: Pokud budete zjistovat parametry diskety, bude v registru CH maximalni pocet stop a v registru CL maximalni pocet sektoru. U pevnych disku je situace ponekud komplikovanejsi. Maximalni hodnota valce (cylinder) je totiz vetsi nez 255 - jeden bajt (napr. pevny disk typu 32 s kapacitou 133MB ma 1024 valcu). Pokud tedy budete zjistovat parametry pevneho disku, nezkoumejte zbytecne registry CH a CL, ale prevedte si obsah registru CX do binarni soustavy a pak provedte nasledujici: Rekneme, ze po navratu je CX=13009Dec = 0 1 0 1 0 1 0 1 0 0 0 1 Bin V registru CX je pro sektor vyhrazeno 6 nejnizsich bitu registru CL. Pro valec je vyhrazeno 8 bitu registru CH plus bit 6 a 7 registru CL, ktere tvori nejvyssi bity valce: Ú#7Ú#6Ú#5Ú#4Ú#3Ú#2Ú#1Ú#0##9Ú#8Ú#5Ú#4Ú#3Ú#2Ú#1Ú#0# ³ c³ c³ c³ c³ c³ c³ c³ c# C³ c³ S³ s³ s³ s³ s³ s³ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄ#ÂÄÁÄÂÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ ÀÄÄÄÁÄÄÄÄÄtoto jsou nejvyssi bity valce c... cylinder (valec) C... nejvyssi bit valce s... sektor S... nevyssi bit sektoru Tento zpusob vyuziti registru CX vede k tomu, ze BIOS sam o sobe dovede pracovat s disky, ktere maji maximalne 1024 stop. Proto nektere radice novejsich disku (SCSI) pouzivaji cast registru DH a hodnoty stop prepocitavaji. Tak se napriklad disk, ktery ma 2048 stop a 8 stran chova jako disk, ktery ma 1024 stop a 16 stran. Priklad: Volate INT 13H a jako vstupni parametry vlozite: AH=08(cislo funkce) DL=80H(pevny disk) Na vystupu dostanete: DL=1, pocet pevnych disku pripojenych na radic je 1. Timto zpusobem lze zjistit, kolik mate fyzickych disku. V dalsich kapitolach uvidite, kde jsou uchovavany zaznamy o logickem deleni disku. Logicke deleni disku znamena, ze jeden fyzicky disk si rozdelite na vice casti (dokonce je mozne, aby tyto casti obhospodarovali ruzne operacni systemy) a ty se pak z hlediska uzivatele jevi jako samostatne disky. DH=5, maximalni cislo povrchu. POZOR, disk ma tedy 6 povrchu, 0-5. Na to nesmite zapomenout, kdyz pomoci techto udaju budete pocitat kapacitu disku. (Pocitat kapacitu timto zpusobem je vsak zbytecne, existuji na to funkce nabizene prerusenim DOSu 21H). CX = 13009Dec = 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 1 Bin. Pri zjistovani poctu sektoru a valcu budete tedy postupovat podle vyse uvedeneho navodu: Cislo sektoru je ulozeno v bitech 0 az 5 registru CL. Prevedete si tedy cislo 0 1 0 0 0 1 Bin do desitkove soustavy. Vyjde vam, ze pocet sektoru je 17. Dale vezmete registr CH v nemz je 0 0 1 1 0 0 1 0 Bin a k tomuto cislu priradite na pozice nejvyssich bitu posledni dva bity registru CL. Vyjde vam tedy 1 1 0 0 1 1 0 0 1 0 Bin coz je 818Dec. Opet nesmite zapomenout, ze valce se cisluji od 0, disk ma tedy 819 valcu. Nyni si muzete kontrolne vypocitat kapacitu disku: 6 (pocet povrchu) * 819 (pocet valcu) * 17 (pocet sektoru) * 512 (pocet bajtu v sektoru) = 42 MB. Pozn.: Jak zjistit velikost sektoru se naucite pozdeji, ale pokud se setkate s velikosti jinou nez 512B, bude to velka nahoda. (vyjma ovsem RAM disky, u nichz si velikost sektoru volite sami, a to bud 128, 256, 512 nebo 1024B). Cteni a zapis sektoru Cteni a zapis sektoru na urovni BIOSu pozaduje jako vstupni parametry cislo stopy, povrchu a sektoru. V predchozi kapitole jste se naucili, jak ziskat informace o maximalnich hodnotach techto parametru. Nyni tedy muzete pristoupit k vlastnimu cteni a zapisu. Slouzi k tomu sluzby INT 13H/Fn. 02H, a INT 13H/Fn. 03H. INT 13H/Fn. 02H: Cteni sektoru Vstup:AH = 02H DL = cislo jednotky (0=A, 1=B, 80H=prvni hard disk, 81H=druhy hard disk) DH = cislo povrchu (head), povrchy se cisluji od nuly CH = cislo stopy (track) / valce (cylinder), (0..n) CL = cislo sektoru, (1..n) AL = pocet sektoru (nesmi byt vetsi nez pocet sektoru na stopu) ES:BX = Segment:Ofset pameti pro nactena data Vystup:CF = 0 - vse probehlo v poradku, na adrese urcene registry ES:BX jsou nactena data CF = 1 - pri cteni doslo k chybe, v AH se nachazeji chybovy kod INT 13H/Fn. 03H: Zapis sektoru Vstup:AH = 03H DL = cislo jednotky (0=A, 1=B, 80H=prvni hard disk, 81H=druhy hard disk) DH = cislo povrchu (head), povrchy se cisluji od nuly CH = cislo stopy (track) / valce (cylinder), (0..n) CL = cislo sektoru, (1..n) AL = pocet sektoru (nesmi byt vetsi nez pocet sektoru na stopu, viz INT 13H/08H) ES:BX = Segment:Ofset pameti, kde se nachazi data Vystup:CF = 0 - vse probehlo v poradku, na urcenych sektorech jsou data z adresy ES:BX CF = 1 - pri cteni doslo k chybe, v registru AH se nachazi chybovy kod Pro sluzbu cteni i zapisu plati u cisla sektoru a valce stejna pravidla, jako pri zjistovani parametru disku. Chcete-li tedy cist nebo zapisovat valec vyssi nez 255, pouzijete bit 6 a 7 registru CL jako nejvyssi bity valce. V pripade chyby nahlednete do kapitoly, kde jsou popsany chybove kody BIOSu. Tyto dve sluzby zpristupnuji cely disk (coz sluzby DOSu neumoznuji), a vyborne se proto hodi ke cteni zavadeciho zaznamu pevneho disku. V pripade, ze se vyskytne chyba, doporucuje se danou operaci az trikrat zopakovat. Chyba pri praci s disketami na urovni BIOSu se muze vyskytovat, napr. pri prvnim pokusu o cteni. Pokud si vyrobite malou utilitu, ktera bude cist sektory, zjistite, ze chyby se vyskytuji pomerne casto. Jednou z nich je i chyba AH = 06H, ke ktere, dojde otevrete-li dvirka disketove mechaniky (nemam na mysli otevirani za chodu). Kdykoli dvirka otevrete a zase zavrete, dojde pri prvnim pokusu o praci s disketou k chybe 0 6H. Pozadovana operace bude provedena az na druhy pokus. Chcete-li zjistit, zda nekdo dvirka oteviral, pouzijte sluzbu INT 13H/Fn. 16H. Novejsi verze BIOSu nastesti na otevreni dvirek disketove jednotky tak "zle" nereaguji a proto je "mezistupen" s chybou 06H pri praci s disketovou jednotkou vynechan. INT 13H/Fn. 16H: Zjisteni, zda byla otevirana disketova jednotka Vstup:AH = 16H Vystup:AH =0 - k otevreni dvirek nedoslo AH=6 - k otevreni dvirek doslo, DL = cislo jednotky, ktera byla otevrena Pokud na vystupu z teto funkce dostanete AH=6, je predem jasne, ze cteni nebo zapis budete muset dvakrat opakovat. Poprve vam vrati chybu, a teprve napodruhe skutecne probehne (nedojde-li k jine chybe). 11. INT 13H/Fn. 04H: Kontrola sektoru (Verify) Vstup:AH = 04H DL = cislo jednotky (0=A, 1=B, 80H=prvni hard disk, 81H=druhy hard disk) DH = cislo povrchu (head), povrchy se cisluji od nuly CH = cislo stopy (track) / valce (cylinder), (0..n) CL = cislo sektoru, (1..n) AL = pocet sektoru (nesmi byt vetsi nez pocet sektoru na stopu, viz INT 13H/08H) Vystup:CF = 0 - vse je poradku CF = 1 - pri kontrole doslo k chybe, v AH se nachazi chybovy kod Kdyz pracujete s disketami, obcas se, zvlaste u neznackovych disket, na nich vyskytuji vadne sektory. Pokud si chcete sektor nebo sektory, kam budete ukladat dulezite udaje, zkontrolovat, pouzijete sluzbu INT 13H/Fn. 04. Funkce zkontroluje kontrolni soucet sektoru (CRC). Formatovani stop disku Jedna ze sluzeb preruseni 13H dava moznost formatovat jednotlive stopy na disku. Jak pracuji formatovaci programy ? 1.Mohou postupovat tak, ze je mozne "naformatovanou" disketu "odformatovat", tzn. obnovit jeji obsah (to umeji napr. PC Tools 7.0). 2.Formatuji tak, ze vsechna data jsou nenavratne znicena. Tento druhy zpusob nastane, budete-li k formatovani pouzivat nize popsane sluzby BIOSu (jedna se o destruktivni formatovani). Pri popisu teto sluzby se budu z bezpecnostnich duvodu zabyvat pouze formatovanim disket. Jelikoz se skutecne jedna o formatovani na nizke urovni, je treba pred vlastnim pouzitim formatovaci funkce pouzit sluzbu INT 13H/Fn 17H, ktera nastavi typ diskety a mechaniky. Tyto informace potom pouzije obsluha formatovaci procedury. INT 13H/Fn. 17H: Nastaveni typu diskety a disketove mechaniky Vstup:AH = 17H DL = cislo disketove jednotky (0=A, 1=B) AL = typ diskety:1 = disketa 360KB v mechanice 360KB 2 = disketa 360KB v mechanice 1.2MB 3 = disketa 1.2MB v mechanice 1.2MB 4 = disketa 720KB v mechanice 720KB Vystup:CF = 1 - chyba, chybovy kod v AH Tato sluzba je pouzitelna pouze na pocitacich AT. V pripade, ze mate XT, ci neco podobneho, vynechte ji a formatovaci proceduru volejte primo. INT 13H/Fn. 05H: Formatovani stopy Vstup:AH = 05H DL = cislo jednotky (0=A, 1=B, 80H=prvni hard disk, 81H=druhy hard disk) DH = cislo povrchu (head), povrchy se cisluji od nuly CH = cislo stopy (track) / valce (cylinder), (0..n) ES:BX = Segment:Ofset adresy, na ktere se nachazi tabulka popisu sektoru. Pro kazdy sektor, ktery budete formatovat, zde musi byt prislusne 4 bajty. Obsahem techto ctyr bajtu je: 1. bajt = cislo stopy 2. bajt = cislo povrchu 3. bajt = cislo sektoru ve stope 4. bajt = velikost sektoru (0=128B, 1=256B, 2=512B, 3=1024B) Pokud byste si chteli zvolit velikost sektoru jinou, nez je u ostatnich sektoru na dane diskete (napr. na diskete, kde jsou sektory o velikosti 512 B si budete chtit zvolit velikost sektoru 128 B), pak byste si museli timto zpusobem naformatovat celou disketu, protoze jinak budou vase sektory necitelne. I kdyz si naformatujete celou disketu tak, ze velikost sektoru bude 128 B, budete si muset pripravit systemovou oblast (boot, FAT, Root). Protoze se jedna o pomerne slozitou zalezitost, doporucuji va m pri experimentech pouzivat standardni velikosti 512 B. Vystup:CF = 0 - formatovani probehlo v poradku CF = 1 - doslo k chybe, v registru AH se nachazi chybovy kod. Nyni podrobneji k obsahu bloku pameti na adrese ES:BX. Pro kazdy formatovany sektor zde musi byt k dispozici ctyri bajty jejichz obsah je uveden vyse. Formatujete-li napr. disketu 360KB s deviti sektory na stope, musite mit v pameti pripravenych 36 bajtu. Nejedna se pouze o nejakou formalitu! Pokud budou pri formatovani prislusne udaje dostupne, nebo nebudou-li se pripravene udaje shodovat s fyzicky formatovanym mistem na disku, pak dany sektor (nebo skupina sektoru) nepujde precist. Zmylite-li si n apr. povrch pak nepujde precist cela stopa. Priklad: Chcete naformatovat stopu cislo 1 (druha stopa) na povrchu 0 v mechanice A. Predpokladejme, ze se jedna o disketu 360KB s deviti sektory na stope. Vstup : AH = 05H - funkce DL = 00H - mechanika DH = 00H - povrch CH = 01H - stopa Obsah adresy ES:BX: 01 00 01 02 01 00 02 02 01 00 03 02 01 00 04 02 01 00 05 02 01 00 06 02 01 00 07 02 01 00 08 02 01 00 09 02 # # # # ³ ³ ³ ÀÄÄÄ#velikost sektoru ³ ³ ³ (2=512B) ³ ³ ÀÄÄÄÄÄÄ#cislo sektoru ³ ÀÄÄÄÄÄÄÄÄÄ#cislo povrchu ÀÄÄÄÄÄÄÄÄÄÄÄÄ#cislo stopy Protoze se jedna o pomerne narocnou zalezitost, uvadim priklad programu, ktery prislusnou oblast v pameti naplni potrebnymi daty, zavola INT 13H/Fn. 17H - nastaveni typu disketu a diskove mechaniky, a naformatuje jednu stopu. program Naformatuj; uses dos; var b:array [1..36] of byte absolute $8000:0000;{* Nastaveni adresy buferu pro formatovani. Pri pouziti ABSOLUTE si sami urcujeme, ktere misto v pameti se pro pole vyhradi. Zde je to tedy 8000:0000Hex. *} i:word; s:byte; r:registers; begin i:=1; s:=1; {* Nyni se naplnime bufer pro formatovani *} repeat b[i]:=01;{* cislo stopy *} inc(i); b[i]:=00;{* cislo povrchu *} inc(i); b[i]:=s;{* cislo sektoru *} inc(s); if s>9 then s:=1;{* tato devitka koresponduje s poctem sektoru na stope, pokud budete formatovat disketu 1.2MB s 15 sektory na stope - je treba toto cislo zmenit *} inc(i); b[i]:=02;{* velikost sektoru 2=512B *} inc(i); until i=37; {* Zde se nastavi,jakou mechaniku a jakou disketu pouzivame *} r.ah:=$17; r.dl:=0; r.al:=2;{* disketa 360 KB v mechanice 1.2 MB *} intr($13,r); {* Nyni probehne vlasni formatovani *} r.ah:=5;{* Sluzba 05 *} r.dl:=0;{* dl = drive, 0-disketova jednotka A *} r.dh:=0;{* dh = povrch *} r.ch:=1;{* ch = stopa *} r.es:=$8000;{* es:bx - adresa buferu, ktery jsme predtim naplnily *} r.bx:=0; intr($13,r); end. Pokud mate program PCShell, ktery je soucasti baliku PC Tools nebo pokud vlastnite Norton Utilities, muzete se na naformatovanou stopu podivat primo. Pokud tento, pripadne jiny program, ktery by umoznoval editaci, ci alespon prohlizeni disku nemate, budete si muset napsat program vlastni. Doporucuji pouzit sluzeb BIOSu, INT 13H/Fn. 02H, jejichz popis byl uveden drive. pokracovani priste