Errôl a témáról már volt szó virtuális
hasábjanik között, a Rendszerprogramozás rovat keretein belűl. Akkor csak
elméleti síkon tárgyaltuk, hogy az MS-DOS (általában helytálló a DOS
megnevezés is) hogyan is kezeli a háttértárolókat. Most kezdődő rovatunk
célja egy olyan program megírása mely MS-DOS 6.22 (és alatta MS-DOS
4.0-ig) alatt képes a floppy olvasási műveleteket akár 10-30-50 %-kal
is meggyorsítani.
Ugyanis ki ne BOSSZANKODOTT volna, hogy
LASSÚ a DOS hajlékony-lemez olvasása ?
Ennek gyorsítása felettébb komplex probléma,
így elôreláthatólag sok számon keresztül foglalkozunk ezzel.
Természetesen elôször az elméleti hátterét
vizsgáljuk meg egyáltalán a file-kezelésnek, rajzos algoritmusokat készítek
annak megértésére. Majd egy lassú programmal mutatjuk meg, hogy hogyan
is dolgozik a lemezekkel a DOS. Végül jóegynéhány menô cache-elési technikát
mutatok be ami ténylegesen meggyorsítja az olvasást floppy-ról. De kezdjük
az alapoknál:
A BOOT szektor
A Rendszerprogramozás rovat 3. számában
már szóltunk róla, de most újra elmondjuk a ránk vonatkozó részeket. FIGYELEM:
közlöm, hogy CSAK FLOPPY-val foglalkozunk, s a cikkek is teljesen e felé
orientálódnak, hisz eredeti célkitűzésünk, hogy a floppy-lemez olvasást
gyorsítsuk. (Hisz a winchester-en nincs, ill. nem lehet észrevehetôen
gyorsítani az MS-DOS & SmartDrive-hoz képest.) Nehogy valaki abba
a tévedésbe essen, hogy cache programot írunk floppy-kra. Ez túl snassz
lenne a PC-X User-tôl ... Hmmm találjunk ki valami jót ÍRJUK ÚJRA A DOS
FILE-KEZELÉSÉT !!!
A boot-sector neve elôször is még a
szép ôsidôkbôl származik mikor az OP rendszer betöltôdése addig tartott
míg egy kisgyerek nagy nehezen felhúzott egy csizmát ... A boot , mint
angol szó csizmát hivatott jelenteni s a hasonlat azt jeleni, hogy az operációs-rendszert
úgy, mint csizmát az ember húzza be a gép a memóriába. A boot-sector floppy-k
esetén mindig a 0. oldal 0. sáv és 1-ô szektorában helyezkedik el. A boot-sector-nak
több jelentôs feladata van:
-
ha a floppy rendszer-lemez, akkor a boot-sector
mikro-programja fogja beolvasni a 2. cluster-bôl az IO.SYS-t (megfelelôen
frekventált helyeken az OpenDOS IBMIO.SYS álományát is beolvashatja. Ezt
csak azért mondom nehogy valaki azt higyje, hogy csak MS-DOS létezik.(nem
szeretném a kedves olvasót megtéveszteni) Megjegyzem az OpenDOS saját secutiry
és multi-task rendszerrel rendelkezik, természetesen hálózati támogatással.)
-
Amennyiben nem rendszerlemez akkor egy
olyan programocska indul el mely kiírja, hogy sorry ne strapáld magad de
ez a lemez nem boot-lemez, az-az: Non-system disk ...
-
Ezeket a programokat általában a FORMAT
vagy SYS parancs rakja a boot-sector-ba.
-
Természetesen a boot-sector-programján
kívül még más egyéb felettébb hasznos és szükséges információt tartalmaz
a boot-sector. Ezek az informácók a hordozóra magára (esetünkben) a floppy-lemezre
vonatkoznak úgy, mint:
- ugró kód, lásd alább.
- A boot-sector-t létrehozó OP rendszer
OEM neve (max 8 karakter), pl.: NWDOS7.0
- Az egy sector-ban található byte-ok
számát word-ben: az esetek 99 %-ban ez 512 byte.
- A szektorok számát adja meg egy cluster-en
belűl byte-ban: floppy-lemezek esetében általában a FORMAT 1-re állítja,
de működik 2, 4, 8, stb-vel is.
- A lefoglalt (esetleg nem használt)
szektorok számát a FAT elôtt word-ben. A lefoglalás oka lehet, hogy a lemez
eleje fizikailag teljesen sérült, így azokat nem használjuk. Ez szerencsés
- normális esetben 0.
- A FAT (file helyfoglalási tábla)
másolatok száma byte-ban: általában 2.
- A gyökérkönyvtárban (ha nem tetszik
ez a megnevezés akkor legyen fôkönyvtár) elhelyehetô bejegyzések (file-ok,
könyvtárak, lemeznév) maximális száma word-ben. Ez általában: 224 db.
- A lemezen található összes fizikai
szektor száma word-ben, ha ez word-ön ábrázolható (az-az kisebb, mint
65535). Ha nem ábrázolható egy word-ön akkor ezen információ nem kitöltött.
Ez egy 3.5" HD-s lemez esetén 2880 sector/disk.
- A lemez hordozó-típusát leíró byte
(szépen magyarul: media descriptor), ez a mai standard lemezekre már $F0
érték. (De a régi 360KB-os stb-re, $FC-$FF érték. HDD-re: $F8 !)
- Egy FAT (File Allotation Table =
file helyfoglalási tábla) másolat által lefoglalt szektorok száma word-ben.
Ez egy 3.5" 1.44MB-s lemez esetében: 9.
- Egy sávban található szektorok száma
word-ben floppy-k esetében ez 2. (sector/track)
- A lemez oldalainak (lehet fejek)
száma word-ben. Ez floppy-k esetében 2. (Természetesen 0-1 számozzuk. Megjegyezném,
hogy ha egy HDD-ra az az adat van, hogy 16 iró | olvasó feje van akkor
azt persze nem kell elhinni. Az csak egy dolog, hogy hogyan kezeli le a
BIOS. Mostanában 2-3 lemezbôl állnak a HDD-k, s ez 4 ill. 6 olvasható |
írhaó oldalt jelent.)
- Rejtett szektorok száma word-ben.
Általában 0. (Ez az alsó word, ha 32MB-nál nagyobb partícióról van szó.)
- Rejtett szektorok száma, felsô word.
Ez csak 32MB-nál nagyobb partíciókra vonatkozik, tehán nem a floppy-kra
!
- Ha a lemezen több, mint 65535 sáv
van akkor itt tárolódik le egy longint-en. (Ez általában együtt jár a 32MB-nál
nagyobb partíciókkal.)
- Fizikai lemezesegység szám byte-ban.
- Információs word, általában 0.
- A lemez szériaszáma longint-ben.
A kiiratást hexába alakítva kell elvégezni.
- A lemez neve 11 karakter (Array[1..11]
of Char). Ha nincs megadva a FORMAT parancsnál, akkor: 'NO NAME ' lesz
az értéke.
- A file rendszer azonosítója pontosabban
a file-tárolásának elve. Lehet: FAT12, FAT16, HPFS, NTFS ...
Errôl még késôbb ...
-
Minden DOS kompatibilis és emulált lemeznek
ilyennek kell lennie a rá jellemzô információk felépítésének. Nos hogy
ennyit tudunk már a boot-sector-ról, akkor nézzük meg egy kicsit, hogy
mi is történik a boot-sector mikro-programjával:
A boot folyamat során betöltôdik a memória
0000:7C00 címére, s innen az elsô byte-tól kezdve lefuttatódik. Tudjuk,
hogy a boot-sector programja adatotkat információkat is hordoz magában
az 512 byte hosszú programban. Hogyan is épül fel ez a program ? Lássuk
assembly-ben:
asm
jmp @BootEntry {jump short, hisz 128 byte-on belül van a kód}
db 90h {Ez egy nem használt byte, arra tartogatják, ha far jmp lenne szükség ...}
OEMName db 'NWDOS7.0'
Byte_Sector dw 512
{stb ... a többi adat}
@BootEntry:
{és itt jön az a mikro-program amely beolvassa az
IO.SYS-t INT 13h-al, s RETF-el elindítja !}
end;
Lássunk az elmondottakra egy Pascal típusú
rekordot, mely leírja a boot-sector felépítését:
PBootSecInforms = ^TBootSecInforms;
TBootSecInforms = record
JMP : Array[1..3] of Byte;
OEMName : Array[1..8] of Char;
Byte_Sector : Word;
Sector_Cluster : Byte;
ReservedSecs : Word;
FATCount : Byte; {FATCount * SectorInOneFAT }
MaxRootEntries, {(MaxRootEntries * 32) / Byte_Sector}
Total_Sector : Word; {DataStart = ReservedSecs + FATSize + RootSize}
MediaDescriptor: Byte;
SectorInOneFAT,
Sector_Track,
Head_Number,
Hidden_Sector : Word; {if partitions > 32M then It's the Lo Word }
Hidden_SectorHi: Word; {if partitions > 32M then used else not used }
BIGTotal_Sector: Longint; {if (partitions > 32M) And (Total_Sector = 0) }
PhisicalDriveNo: Byte; { then used else not used }
InfoLevel : Word; {Must be 0 ???}
SerialNumber : Longint; {In Hex (bin) }
VolumeLabel : Array[1..11] of Char; {'NO NAME ' if none present}
FileSystemType : Array[1..8] of Char; {'FAT12 ' or 'FAT16 ')
TempArray : Array[1..1024-62] of Byte; {biztonsági tömb}
end;
A boot-sector-ról már eleget tudunk nézzük,
a boot-sector után elhelyezkedô egységet a lemezen, ez:
A FAT
A DOS jellegű (pontosabban vele kompatibilis)
operációs rendszerek mindíg FAT-ot használnak, míg más jelentôsen fejlettebb
OP rendszerek is megadják a lehetôségét annak, hogy ne saját (pl.: OS/2
HPFS, vagy WinNT NTFS) file-rendszerüket, hanem a régi FAT-ot használhassuk
a másik, pl. DOS OP rendszerrel való kompatibilitás megôrzése véget. (Ez
akkor áll fent, pl. ha egy WinNT és egy DOS (tehát kettô) OP rendszer van
a gépen.) A FAT az egyik legegyszerűbb - s ez által sok hátránnyal
rendelkezô - file-tárolási módszer. Ahogy régen azt hitték, hogy 640KB-a
minden bele fér úgy, arra sem gondoltak, hogy lehet, hogy több, mint 65535
cluster-e lesz valamikor egy winchester-nek, hisz még a 32 MB-os partíciók
is gondot okoztak régen. Ennek szellemiségében megkülönböztetünk FAT12,
FAT16 és FAT32-t. A FAT után álló szám jelenti, hogy a FAT-ban milyen módon
tárolja az indexeket. 12 bit-en (3/2 byte-on), vagy 16 bit-en (egy word-ön),
vagy újabban egy longint-en 32 bit-en. Mi a FAT16 és leginkább a FAT12-vel
foglalkozunk, hisz a floppy-k FAT-ja 12 bit-es.
A winchester szektorokból áll. A HDD-t
nem szektor szinten kezeli, a DOS hisz akkor a legnagyobb kezelhető egység
512 byte lenne. Így rengeteg helyet kellene arra áldozni, hogy beazonosítsuk
a XY file melyik szektorban található. Így a DOS és minden hasonló OP rendszer
(nem UNIX alapú !) több szektort nevez ki egy alapegységnek melyet cluster-nek
nevezünk. Egy cluster állhat egy szektorból (pl. a floppy-k esetében) de
2, 4, 8, 16, 32, vagy esetleg 64 szektorból is (64-nél több szektorból
nem állhat egy cluster MS-DOS 6.22-alatt). Tehát az egés winchester fel
van osztva cluster-ekre valahogy így:
Azt tehát látjuk, hogy a cluster-ek
(melyek itt 4 szektorból állnak) 2-től kezdôdnek.
A FAT nem más, mint egy táblázat mely
megmutatja, hogy a file (tegyük fel, hogy egy sok KB-os, nagy file-ról
van szó) egyes részei hol melyik clusterben helyezkednek el a HDD-n.
Tegyük fel, hogy van egy 23 KB-os file-unk.
A FAT megmutatja, hogy a 12. cluster üres. Akkor a file elsô 512 byte *
4 = 2048 byte hosszát a 12. cluster-be írja. (512 byte egy szektor hossza,
s 4 szektorból áll a példán egy cluster-ünk.) Tehát a 12. cluster-ben
van az elsô 2 KB-t. De a 13. cluster már foglalt más file által, így oda
nem írhatunk. A DOS megnézi a 14., 15. ... stb. clustert, míg nem talál
üreset. S ooops a 54. cluster üres: akkor ide írja a második 2 KB-ot. Azután
megnézi, hogy a következô az 55. üres -e ? Ha igen folytatja az 55-be a
3. 2BK-os darab írását, tegyük fel az 55, 56, 57, 58 - 62. clusterek üresek.
De még hátramaradt 3 * 2 KB leírása, s akkor keres még 3 üres cluster-t,
legyen a 94. cluster-tôl 101-ig szabad így ide bôven el tudja menteni a
3 cluster-nyi adatot. Így a file, igaz több darabban de a HDD-n van.
Tehát így néz ki az XY file-unk elhelyezkedése
a HDD-n: (Egy négyzet egy cluster-t jelent. Ahol piros a négyzet ott más
file által foglalt a HDD, ahol fehér ott üres, s ahol fekete ott az XY
file darabjai találhatóak.)
Látjuk, hogy az elsô cluster a 2-es
sorszámot kapja. Azt is, hogy file-unk elsô 2KB-ja a 12. cluster-en található,
majd a következô része a file-nak az 54.-tôl a 62. cluster-ig. Az file
utolsó darabja, az utolsó 3 cluster a 94-97 cluster-eken található. A leírtak
szerint az is látszik, hogy 97-101-ig találhatóak üres cluster-ek, és utaána
is elszórva.
Tehát, még a példa elôtt ott tartottunk,
hogy mire jó a FAT ? Nos a kérdés megválaszolása most már halogathatatlan
számomra ... Tegyük fel azt a kérdést, hogy honnét tudja a DOS, hogy az
XY file egyes darabjai mely clustereken helyezkednek el ? Utolsó kérdésemre
a válasz: hát a FAT-ból !
Lássuk szép sorjában az XY file beolvasását
a memóriába:
-
Eljutunk a C:\VALAMI\ERRE\ könyvtárba a
CD paranccsal, vagy NC-vel
-
majd NC-ben F3-at (view-ot) nyomunk, ekkor
az alábbiak történnek:
-
A DOS minden könyvtárat hasonlóan tárol
a lemezen, mintha DIR parancsot nyomnánk ...
Tehát tárolva van a FILENÉV, kiterjesztés,
file-hossz, dátum-idô, attribútum, s az:
-
ELSÔ CLUSTER, hogy hol kezdôdik a file,
lássuk egy példával az olvasási folyamatot:
-
Látjuk, hogy a file elsô cluster-e a könyvtár-struktúrával
együtt van eltárolva, így a 12. cluster-t kell elôször kiolvasni.
-
A FAT-ban (tehát a helyfoglalási táblázatban)
a 12. elem helyén egy olyan érték van ami megmutatja, hogy hol található
a file következô darabja. Ez az érték a fent elmondottak szerint 54-nek
kell lennie, hisz az 54. cluster-ben van a második darab. És nézzük a FAT-ot
a 12. elem értéke tényleg 54, tehát az 54 cluster-t kell másodiknak kiolvasni.
-
A FAT 54. bejegyzésének értéke 55, az-az
az 55-dik cluster a következô darab.
-
Ez egészen a 62. cluster-ig megy ahol a
FAT-ban a 62. bejegyzés értéke a 94.
-
Így a 94-dik cluster-t kell beolvasni,
s a 94. bejegyzés a 95 cluster-re mutat, míg a 95. bejegyzés a 96-dik cluster-ra.
-
Így beolvassuk a 96. cluster-t, s megnézzük
a FAT 96-dik bejegyzése hova mutat. Ez 'end'-et mutat, tehát a 96-dik
cluster volt az utolsó beolvasandó cluster. A 96. cluster $(F)FFF-re mutatott
ami azt teszi, hogy vége a file-na. Azért van zárójelben az (F), mert 12
bit-es FAT-nál a file-vége jel a FAT bejegyzésben: $FFF, míg a 16 bit-esnél
$FFFF.
-
Továbbá láthatjuk, hogy 97-101-ig üres
cluster-ek vannak, hisz a hozzájuk tartozó FAT bejegyzéseknek 0 az értéke
ami azt jelenti, hogy ezekbe a cluster-ekbe lehet írni.
Tehát összefoglalhatjuk általánosan érvényes
pontokban a tapasztaltakat:
-
A könyvtár struktúrában a file jellemzôivel
együtt megtalálható a file elsô cluster-ére mutató szám legyen X.
-
A FAT-ban az X-dik bejegyzés értéke megadja
( Y:=(X) ), hogy az X értéke Y -adik cluster a következô darab.
Tehát a Y-dik cluster-t kell bolvasni. Ha a FAT Y-dik bejegyzése nem file
vége jel akkor az Y-adik bejegyzések ugyanúgy van egy értéke amit Z-nek
nevezzünk. A Z-dik cluster-t beolvassuk, s megnézzük a FAT Z-edik bejegyzését.
-
Mivel itt $(F)FFF érték található vége
a file-nak, s nincs további cluster mit be kellene olvasni.
Ha valaki nem érti a FAT file-kezelését
az olvassa türelmesen akár még 3-4-szer át mert nem bonyolult, csak egy
kicsit kell odafigyelni.
Nos (remélhetôleg) tudjuk már
a file kezelés módját, de ezeregy dolog van amit mág át kell nézni.
-
Azt már tudjuk, hogy 0,0,1 szektoron van
a boot-sector de hol található a FAT hányadik szektoron ?
-
Tévedés, nem feltétlenül biztos, hogy a
0,0,2 szektoron lenne, hisz a fentiekben létrehozott TBootSecInforms
rekordban a ReservedSecs word-ben található a FAT elôtt lefoglalt
szektorok száma, bele értve a boot-sector-t is. Így általános esetben ennek
a változónak (inkább mezônek) az értéke 1 így tényleg a 0,0,2-es
szektor a FAT elsô szektora. Ha a boot-sector után bizonyos hosszon belül
hibás szektor van akkor a ReservedSecs értéke megnôhet. Így:
FATStart:=ReservedSecs;
-
Hány szektor hosszú a FAT ? Ugyanígy ennek
a rekordnak a van egy FATCount mezôje mely megadja, hogy hány másolat
van a lemezen a FAT-ból. Általában kettô van, ha az elsô példány meghibásodik,
hogy a másodikból ki lehessen javítani. Igaz ez általában nem feltétlenül
e mehanizmus szerint szerint működik - szerencsére. Nos eddig azt tudjuk,
hogy hány másolat van a FAT-ból, így azt meg kell szorozni az egy FAT-ban
található szektorok számával, melyet a SectorInOneFAT mezô ír le.
Így a FAT hossza szektorokban: FATSize:=FATCount * SectorInOneFAT;
A FAT-ból mára ennyi elég is volt - hisz
már nem sok újat lehet mondani - így inkább nézzük a FAT után következô
elemet.
A könyvtár struktúra felépítése és
a root-directory
A FAT után helyezkedik el a következô lemez-kezelési
egység a fôkönyvtár. A fôkönyvtárban létrehozható file-ok - könyvtárak
száma fix, a lemez formázásakor határozza meg a FORMAT program. Azért került
fix helyre a FAT után, mert részint a kompatibilitást akarták a DOS 1.0-val
megôrizni, és részint így még egy kicsit is ésszerűnek mondható.
-
Hol kezdôdik a fôkönyvtár bejegyzései ?
Ha a FAT után akkor a FAT kezdete +
a FAT hossza után ez:
RootStart:=FATStart + FATSize;
-
Milyen hosszú szektorban a fôkönyvtár ?
Azt tudjuk, hogy egy bejegyzés akár
file akár könyvtár információi 32 byte hosszúak. A magyarázata alább.
A TBootSecInforms rekordban található egy mezô mely megadja, hogy
mennyi a bejegyzések maximális hossza, ez a mezô: MaxRootEntries.
Ha ezt 32-vel megszorozzuk, akkor byte-ban megkapjuk, hogy mennyi a szükséges
tárolási mértet, s ha ezt még elosztjuk az egy szektorban tárolható byte-ok
számával (alt.: 512) akkor megkapjuk, hogy mennyi szektort kell - illetve
kellet a DOS-nak - a fôkönyvtárra lefoglalni:
RootSize:=(MaxRootEntries * 32)
div Byte_Sector;
-
Itt mondom el, hogy a file-ok tényleges
adatai hányadik szektoron kezdôdnek:
DataStart:=RootStart + RootSize;
Nézzük, meg hogy egy általános könyvtár
hogyan épül fel. Ez természetesen mind a fôkönyvtárakra, s mind az alább
tárgyalt alkönyvtárakra igaz.
-
Kell, hogy tároljuk a file vagy könyvtár
nevét ez a régi (6.22) DOS szerint 8 karakter lehet. Array[1..8] of Char
erre vezessük be a TChar8 típust.
-
A kiterjesztést is el kell tárolni ez 3
karakter, s erre hasonló analógia alapján a TChar3 típust.
-
Egy byte-ban tároljuk le a file attribútumát
mely lehet: archive | read-only | system | hidden | volume | directory.
Logikus, ha directory az attribútum akkor könyvtárról - s nem file-ról
van szó.
-
Itt egy 10 byte-nyi fentartott hely.
-
Az utolsó módosítás idejét, dátumát egy
word-ben. Ennek visszaalakítását lásd alább.
-
ÉS ITT JÖN: a file (vagy könyvtár) elsô
cluster-ének száma melyet már fönt annyit ragoztunk. A cluster száma word-ben
van letárolva FAT12 és FAT16 esetén.
-
És végül, de nem utolsó sorban a file hossza
egy longint-ben.
Lássuk az erre felépített Pascal rekordot:
PDirectoryEntry = ^TDirectoryEntry;
TDirectoryEntry = record
FileName : TChar8;
Extension: TChar3;
Attribute: Byte;
Reserved : Array[1..10] of Byte;
Time,
Date,
ClusterNumber: Word;
FileSize : Longint;
end;
Valahogy így néz ki a fôkönyvtár elsô pár bejegyzése:
Név
|
Kit
|
Attr
|
Üres
|
Idô
|
Dát.
|
Cluster
|
Hossz
|
AUTOEXEC
|
BAT
|
archive
|
|
$8B7B
|
$7C23
|
22
|
953
|
CONFIG
|
SYS
|
archive
|
|
$8B7B
|
$7C23
|
23
|
993
|
Tudjuk a főkönytárból ered minden könyvtár, nézzünk egy példát lemezre:
Az A:\TXTS nevű könyvtár, mely
rengeteg kis rövid text file-t tartalmaz. Ekkor a fôkönyvtárban a TXTS
könyvtárhoz az alábbi könyvtárbejegyzés tartozik:
Név
|
Kit
|
Attr
|
Üres
|
Idô
|
Dát.
|
Cluster
|
Hossz
|
TXTS
|
|
directory
|
|
$8B7B
|
$7C23
|
8
|
0
|
Tehát látjuk, hogy a 8. cluster-en kezdôdnek
a TXTS alkönyvtár bejegyzései, mely a fentiakhez hasonlóan épülnek fel.
HA valakinek eddíg nem esett volna le a KÖNYVTÁRAK FILE-ként vannak tárolva
! Tehát a könyvtárbejegyzések egy olyan file-ban vannak tárolva melyek
TDirectoryEntry rekord alapján épülnek fel. Sôt aki a magyar nyelvet
már szakbarbárságában abszolút nem 'bírja' művelni azoknak mondom, hogy
az alkönyvtárak bejegyzései egy File of TDirectoryEntry típusos
file-ban vannak eltárolva. Mivel a könyvtár struktúra file-ként van eltárolva,
gondolom nem okoz meglepetést, hogy egy alkönyvtár ha több cluster-bôl
áll nem csak folytonosan hanem töredezve is elhelyezkedhet a winchester-en.
Csak az a ciki, hogy a file-ként eltárolt file-okat nem lehet csak úgy
beolvasni, mint egy file-t mert access denied-ot kapunk. (Persze vannak
belsô DOS rutinok melyeket meghívhatunk, hogy felettébb rejtelmes dolgokat
tudjunk meg, de ezek használata nem vág témába, s szerintem megfeküdné
a t. Olvasó gyomrát ...)
Tehát tegyük fel, hogy a fôkönyvtár
TXTS alkönytárának bejegyzésébôl kiderült, hogy a 8. cluster-en kezdôdik
a TXTS alkönyvtár struktúrája. Beolvassa a DOS a 8. cluster-t, és sorra
pl. DIR parancsra írja ki a benne lévô text file-ok nevét, s esetleg a
benne lévô egyéb alkönyvtárak nevét. Mivel tudjuk, hogy 123 text file van
a könyvtárban és egy sector a floppy-kon általában egy cluster ekkor rádöbbenünk,
hogy nem fog egy cluster-ben elférni mind a 123 file bejegyzése, így több
cluster kell, s a TXTS alkönyvtár struktúrája - akár egy file - töredezve
lehet a floppy-n. 512 egy sector és most egy cluster is. 32 byte egy bejegyzés
így ebbôl az adódik, hogy most egy cluster-en 512/32 bejegyzés tárolható
egy = 16 bejegyzéssel. Így kiszámoljuk, hogy 8 cluster kell, hogy mind
a 123 bejegyzést a TXTS alkönyvtár eltárolhassa. Hogy történik egy teljes
DIR parancs a TXT könyvtárra ?
-
aktuális könyvtár: A:\TXTS\. Ez után DIR
parancsot írunk, s a DOS bent ezt csinálja:
-
A TXTS alkönyvtár struktúrája a 8. cluster-en
kezdôdik, ez a fôkönyvtár TXTS bejegyzésének cluster mezôjébôl állapítható
meg.
-
A 8. cluster-t a DOS beolvassa, s az ott
található bejegyzéseket feldolgozza, s kiírja a képernyôre, hisz a DIR
parancs ezt kérte.
-
Kiírta mind a 16 bejegyzést amit a 8. cluster-ban
talált, így megnézi a FAT-ot, hogy a FAT 8. index-e mutat e valahova az-az
nincs e végjel, hisz ekkor max. 16 bejegyzés lenne.
-
Esetünkben a FAT 8. eleme a 15. cluster-ra
mutat így ott, a 15. cluster-bôl folytatódik a könyvtár file-jainak képernyôre
írása.
-
Ha ez kész akkor a 15. FAT elemet nézi
meg, hogy mutat -e valahova mert ott kell akkor folytatni.
-
...
-
Ez addíg ismétlôdik, míg a FAT x. elemén
$(F)FFF, az-az vég jel nincs, vagy:
-
Ugye egy cluster-ben TDirectoryEntry-ként
van eltárolva egy file ill. könyvtár bejegyzés, ha a következô file bejegyzés
nevének elsô karaktere #0 akkor nincs további file bejegyzés.
-
Az-az a DIR parancs nem 123 file bejegyzést
és 5 #0#0#0#0 ... nevű sort fog kiírni, csak azért mert 8 cluster kell
a 123 file bejegyzés letárolásához, hanem addig van következô file bejegyzés
míg a filenév elsô karaktere nem #0. (Ugyanis 8 * 16 = 128. 128 -ból
123 valós bejegyzés van, és 128-123= 5 #0 kezdetű filenév van amit logIQsan
nem kell kiírni, hisz az nem file.)
Most már azt is tudjuk hogyan kezeli a
DOS a file-okat - könyvtáraket (Melyek persze töredezettek is lehetnek,
nem úgy mint a Linux-ban. Wow az egyetlen dolog mely a DOS javára írható.
Cikkírói magán vélemény.)
Ezt a cikket a téma kicsit bonyolultabb
volta miatt lehet, hogy több átolvasás után lehet csak megérteni. A cikk
megértését felettébb segítheti a Norton Utilities DiskEditor-a. FIGYELEM
a NU DiskEdit-t programot, csak Read-Only konfigurációban használjuk, nehágy
átírja valamit s aztán ciki legyen. (Ezt beállítani a NU DE program. Tool\Configuration\Read-Only
ponton lehet beállítani !)
Figyelem, ha valaki nem ért meg sehogy
sem a cikkbôl bizonyos részleteket akkor az eMail-ezzen. (Bonyolultabb
problémák több embernek való elmagyarázására esetén IRC lehetôség is kínálkozik
... Csak eMail-ezzetek, s megbeszéljük !)
Következô cikkünk a fizikai lemezkezelés
megszakításos módjáról, ill. a saját file-kezelés objetum - ill. még nem
definiált rekordi alapjairól szólunk.
FIGYELEM: Feltettük a T&T könyvtárba
az R4sQFlp.exe programot, mely megmutatja, hogy bizonyos körülmények között
a floppy-ról való olvasás sebessége akár 10-30-50%-kal is megnövelhetô.
