ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Prostota a primitivnost sama /
DoSfS /
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Zdravím v¹echny 'výhòáky' i náhodné ètenáøe. Tak copak se dneska
dozvíme? Asi si povíme nìco o souborovém systému DOSu - jak vlastnì
pøesnì funguje to ukládání souborù, a kde a jak je ulo¾ená FAT
tabulka, jak jsou ulo¾ené adresáøe, atakdále atakdále neboli
zkrácenì atd. A jestli budu mít náladu tak zkusím sbastlit i nìjakou
utilitku která to pøedvede v praxi. Tak se na to vrhnem!
Èást první - jak jsem rozpùlil harddisk
Ne, nezkou¹el jsem ho nijak øezat ani jinak mechanicky pùlit.
Jednodu¹e jsem editoval partition table podle mého gusta, i kdy¾
jsem mohl také být lenoch a udìlat to pomocí nìjaké utilitky - prý
se jmenuje fdisk nebo tak nìjak a dìlá pøesnì tohle - a existuje
snad na ka¾dém operaèním systému co jsem vidìl.
No jo, ale co to vlastnì je? U¾ jsem øekl, ¾e je to jakási tabulka -
ve Winèe¹tinì se tomu øíká tabulka oddílù (co¾ je kupodivu celkem
pou¾itelný výraz, narozdíl od mnoha jiných :-). A v té tabulce jsou
popsané diskové oddíly, které se chovají vìt¹inou jako samostatné
logické disky (ov¹em pokud to zrovna windows ¹patnì nepochopí - pak
místo kopírování souboru na jednu partition ho zkopíruje na zaèátek
jiné, co¾ je celkem fatální :) - moje vlastní zku¹enost ):. Ta
tabulka musí být na ka¾dém HDD a musí v ní být alespoò jedna
partition (diskový oddíl, logický disk). Celá tabulka je v úplnì
prvním sektoru harddisku a má max. 4 polo¾ky (ono jich mù¾e být i
více, viz dále). Ti kdo u¾ o harddisku nìco vìdí, urèitì si
uvìdomili, ¾e je ve stejném sektoru jako zavadìè - holt se tam
musejí nìjak vejít... :) No, u¾ toho nechám a rad¹i vám rovnou uká¾u
její formát:
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Zaèátek partition ³ AI ³ H ³ S ³ CYL ³ offset 1BEh ³
³ Konec partition ³ SI ³ H ³ S ³ CYL ³ offset 1C2h ³
³ Partition ³ Relativni zacatek³ offset 1C6h ³
³ Velikost partition ³ Pocet sektoru ³ offset 1CAh ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ÚZacatky popisovacu partition:¿
³ 1 ³ offset 1BEh ³ velikost ³
³ 2 ³ offset 1CEh ³ jedne ³
³ 3 ³ offset 1DEh ³ partition ³
³ 4 ³ offset 1EEh ³ je 10h ³
ÀÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÙ
Nakres I - partition table
Hmm... z toho asi moc moudøí nebudete - tak¾e to bude chtít
vysvìtlení.
AI = indikátor aktivnosti oblasti - to znamená ze které oblasti se zavádí
systém.
00h : oblast je neaktivní
80h : oblast je aktivní - tento flag mù¾e mít nastavena max.
jedna oblast.
SI = indikátor systému - urèuje OS, který danou oblast vlastní.
00h : nikoho to nenapadlo urèit aneb nespecifikovaný
01h : DOS 12-bit FAT
04h : DOS 16-bit FAT
05h : DOSEXT - tak toto je velice dùle¾itý typ. Slou¾í k vytváøení
tzv. rozíøených oblastí (extended partitions). Ty mají ten
význam, ¾e v nich mù¾ou být zapouzdøené dal¹í partition - tzn.
v prvním sektoru takové partition je dal¹í partition table,
obsahující záznam o jedné oblasti v této roz¹íøené oblasti
(stále s námi? ;) a pøípadnì odkaz na dal¹í roz¹íøenou oblast,
atakdále a¾ do nekoneèna... - pozor! nezapomeòte ¾e zapouzdøené
partitions mù¾ou být jenom v mezích jejich mateøské oblasti!
Název je mírnì matoucí, ponìvad¾ takováto roz¹íøená partition
lze pou¾ít i tøeba na Linux, a snad na ka¾dý OS...
06h : BIGDOS - netu¹ím rozdíl mezi 06h a 04h - poraïte mi nìkdo...
(více ne¾ 512Mb?)
82h : Linux SWAP
83h : Linux Native
DBh : CP/M :o)
samozøejmì ¾e tìch typù je daleko více - tohle byl jenom úzký výbìr.
CYL= Dolních 8 bitù èísla cylindru. Horní dva byty jsou ukradené z vr¹ku S
S = Dolních ¹est bytù obsahuje èíslo sektoru
H = èíslo hlavy
Tak¾e H+S+CYL urèuje jednoznaènì konec oblasti (ale je tu malý
problém s èísly cylindrù nad 1023 - ten problém jsem je¹tì
nerozlu¹til - jakmile to nìkdo rozkóduje, dejte mi prosím
vìdìt... Jediná záchrana aby to pochopily i Windoze 95, ne jenom
Linux, je nechat to na jejich fdisku nebo rucne snizit pocet
cylindru na 512... ;) i její zaèátek. Pole AI, H, S a CYL jsou
je¹tì k tomu organizované tak, ¾e staèí pouze dvì instrukce MOV
aby se vhodnì nastavily AX a CX pøed zavoláním INT 13h, kterým se
naète aktuální zavádìcí záznam (pozn.: moderní zavadìèe jako
LILO, BOOT MANAGER apod. pracují tro¹ku jinak, v podstatì v
souèasnosti ji¾ nemá AI tak nebetyèný význam). Jo, a ka¾dá oblast
zaèíná hlavou 0 a sektorem 1. Ov¹em¾e vyjímka potvrzuje pravidlo -
oblast na zaèátku disku, která zaèíná sektorem 2, ponìvad¾ sektor
jedna zabírá hlavní zavadìè a partition table. Nejsem si teï
jistý proto¾e to u¾ jsem nìjakou dobu nezkoumal, ale takté¾ by
to mìlo být s DOSEXT...
Relativní zaèátek je vpodstatì poèet sektorù, které pøedcházejí
danou oblast. Je veliký 4 byty, tzn. DWORD (unsigned long pro
Cèkaøe, pascalisti mají smùlu, proto¾e tpascal má jenom longint
který je znaménkový). Tak¾e u disku se 4mi hlavami, 17ti sektory na
stopì a na¹e oblast zaèíná na cylindru 3, sektoru 1 a hlavièce 0,
tak její rel. zaèátek má hodnotu 204 (3*4*17) na tøech
pøedcházejících cylindrech. A poèet sektorù které daná oblast
vlastní je v poli poèet sektorù. To je opìt 4-bytová hodnota
(DWORD). Prostì její velikost.
Ale je¹tì nesmíme zapomenout na kontrolní signaturu 55AAh, která je
na ofsetu 1FEh - ta potvrzuje platnost tabulky. Pozor! Tenhle znak
musí mít ka¾dý zavadìè OS!
Tak - to bysme snad mìli partition tabulku. Teï pøichází na øadu ona
MSDOSí ¹ílenost které se øíká Boot Record. Je to vlastnì pole
spousty podivných údajù, jejich¾ chybnost zpùsobuje pomìrnì velké
problémy a tehdy není radno zapisovati na HDD :( Ale nu¾, vrhnìme
se na to! To¾, zase by to chtìlo nìjakou tabulku, ¾e? Tedy zøete a
radujte se!
Offset ³ Velikost ³ Popis
ÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
+03h ³ 8xDB ³ OEM ID
+0Bh ³ DW (L M) ³ Pocet bytu na sektor (vetsinou 512)
+0Dh ³ DB ³ Pocet sektoru na cluster (treba 16)
+0Eh ³ DB ³ Rezervovane sektory na zacatku disku
+0Fh ³ DB ³ ???
+10h ³ DB ³ Pocet kopii FAT tabulky (vetsinou 2)
+11h ³ DW ³ Pocet polozek v korenovem adresari
+13h ³ DW ³ Pocet sektoru na disku (pokud je
³ ³ vyplnen velky pocet sektoru tak
³ ³ je toto nepouzito a musi to byt 0!)
+15h ³ DB ³ Media descriptor byte - typ media
+16h ³ DW (L M) ³ Pocet sektoru na FAT tabulku (190)
+18h ³ DW (L M) ³ Pocet sektoru na stopu
+1Ah ³ DW (L M) ³ "Stran" disku (hlav)
+1Ch ³ DD ³ Specialnich "skrytych" sektoru (??)
+20h ³ DD ³ Velky pocet sektoru na disku
+24h ³ DB ³ Fyzicke cislo disku
+25h ³ DB ³ ???
+26h ³ DB ³ Extended Boot Record Signature
+27h ³ DD ³ Seriove cislo svazku
+2Bh ³ 11xDB ³ Volume Label (vsak vy vite o co de)
+36h ³ 8xDB ³ Filesystem ID (FAT16/FAT32)
BootRecord
Tabulka hodnot pro ty ménì znalé... (bude se vám hodit i jinde)
³ Asm ³ Pascal ³ C
ÃÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
³ DD ³ longint ³ unsigned long
³ DW ³ word ³ unsigned int
³ DB ³ byte ³ char (unsigned :)
Pozn.: pascalský longint je znaménkový, tak bacha na to!!!
LSB (L) = Less Significancy (kdo ví jak se to pí¹e :) Byte
= Ménì významný byt (ni¾¹í bity)
MSB (M) = More Significancy Byte
= Více významný byt (vy¹¹í bity)
Hrmpf... To je sice hezké, asi si øíkáte, ale chtìlo by to nìjaký
popis. Budi¾, máte ho mít.
Na zaèátku je tzv. OEM ID. To obsahuje nìco jako jméno 'výrobce'
partition - napø na mém DRDOSu je to "IBM 3.1", u win95 je to
"MSWIN4.1" apod. Nevidìl jsem, ¾e by na tom nìkdy nìco zále¾elo...
Potom tu máme poèet bytù na sektor. To je doufám jasné - prostì jak
je veliký jeden sektor. Poèet sektorù na cluster u¾ je
zajímavìj¹í. Urèuje, kolik sektorù bude v jednom clusteru, pøitom
cluster je minimální jednotka, ve které se fyzicky udává velikost
soubor. Tedy pokud máme soubor velký tøeba jenom jeden znak, pøesto
zabírá (bytu na sektor)*(sektoru na cluster)! Viz také popis FAT
tabulky. Rezervované sektory na zaèátku disku? Vìt¹inou bývá
jednièka, zøejmì (asi, mo¾ná...) poèet sektorù, které se vynechají
pøi èíslování a jednièka je a¾ zaèátek partition + rezervované
sektory, nebo je to poèet sektorù po kterých zaène FAT. Sám jsem to
nikdy nepotøeboval...
Na 0Fh je nula a asi by tomu patøila popiska "rezervované" :) Poèet
kopií