home *** CD-ROM | disk | FTP | other *** search
- RENDSZERPROGRAMOZÅS
-
- A DOS ÉS SZOLGÅLTATÅSAI - III.
-
- Programozási konvenciók
-
- Kerüljük a "régi-stílusú" DOS 1.0 funkcióhívások (01h-0Ch, 26h) használatát.
- Kerüljük az "undocumented" (HIVATALOSAN nem dokumentált) funkciók használatát
- ha csak nem feltétlenül szükségesek és nem lehet kikerülni ôket (nincs
- workaround), hiszen ezek bármikor megváltozhatnak (mivel, hogy hivatalosan
- nem is léteznek) és programjaink inkompatibilisek lesznek. Ráadásul más -
- ezeket a funkciókat leszámítva - kompatibilis operációs rendszerek nem feltétlenül
- támogatják azok használatát. Verzió-specifikus (csak adott verzió(k)ban/verzió
- felett implementált) funkciók használatakor vizsgáljuk meg a futtatott DOS
- verziószámát, hogy megfelelô -e. Kerüljük a BIOS ill. hardver funkciók általi
- közvetlen lemezelérést amennyiben a DOS is biztosít szolgáltatást a kívánt
- adatok elérésére, mert a fejlettebb operációs rendszerek DOS-emulációs
- környezetei nem igazán támogatják ezt.
-
- A DOS regiszter-használata
-
- A DOS a funkcióhívásokkal kapcsolatos paraméterátadásra és azok végrehajtására
- a következô regisztereket használja: AX, BX, CX, DX (általános reg.), CS, DS,
- ES, SS (szegmens-reg.), DI, SI (index reg.), SP, BP, IP (mutatók). Ezen
- regiszterek mindegyikével rendelkezik már a 8088-8068 processzor is, így
- minden DOS verzió minimális igénye ez a processzor (gyakorlatilag - egyéb
- rendszerfeltételek (pl. memória) elégséges megléte esetén - még az elsô
- PC-ken is fut a DOS 6.22 is). A DOS nem használja az újabb processzorok
- plusz és kibôvített regisztereit még akkor sem, ha megfelelô processzoron fut.
- Funkcióhívásokkor az AX kivételével (ezt ugyanis hibakód visszaadására használja
- fel a DOS) minden regiszter értéke megôrzôdik, ha csak nem valamilyen visszatérési
- információt (pl. mutató egy sztringre) közlésére lesz felhasználva.
-
- A DOS-vermek
-
- Amikor a DOS egy funkció hívásakor megkapja a vezérlést (a regiszterek elmentése
- után) a veremszegmensregisztert és -mutatót egy belsô, 48 bájtos veremre
- állítja be. A DOS összesen 3 belsô veremmel dolgozik, melyek közül ez az
- amelyiket közvetlenül a vezérlés átvétele után használ. Azt, hogy e ill. a
- másik két verem közül melyiket használja a funkció végrehajtásakor a funkció
- kódja alapján dönti el. Ezeken kívül kiegészítô vermek is foglaltathatók a
- DOS-szal a CONFIG.SYS-beli STACKS=x y utasítással, ami x funkcióhívás számára
- egyenként y bájt méretû vermet foglal le.
-
- A DOS MEGSZAKITÅSAI
-
- A Microsoft (ajánlása) a DOS-nak a 20h és 3Fh közötti megszakításokat tartja
- fenn. Ennek ellenére valójában maga a DOS kernel csak a 20h-27h ill. a 2Fh
- megszakításokat használja. Ezek a megszakítások a következôk:
-
-
- Megszakítás Leírás
- 20h Terminate Current Task
- 21h DOS szolgáltatások
- 22h Befejezési cím
- 23h Ctrl-Break kezelô rutin
- 24h Kritikus-hiba kezelô
- 25h Abszolút lemez-olvasása
- 26h Abszolút lemez-írás
- 27h TSR (Terminate-and-Stay-Resident)
-
-
- A DOS-szolgáltatások
-
- A DOS szolgáltatások széles skáláját nyújtja a karakteres ki-/bevitel, a file-
- és memória-kezelés és egyéb területeken. Ezeket a funkciókat a 21h
- megszakításon keresztül érhetjük el. A funkciókra hívásuk során azonosító
- számukkal kell hivatkozni. A DOS funkciókódok a következôk:
-
- A 21h megszakítás a funkció számát az AH, míg az esetleges alfunkció azonosítóját
- az AL regiszterben várja. A funkciótól függôen egyéb regisztereket is lehet ill.
- kell használni paraméterek átadására. Szinte mindegyik funkció a Carry flaget
- (átvitelbit, CF) hiba jelzésére használja. Ha a DOS funkció végrehajtása során hiba
- következik be (vagy már a parancskód is eleve érvénytelen volt) a megszakítás során
- a DOS a Carry flaget bekapcsolja, míg sikeres végrehajtás esetén törli. CF=1
- mellett általában az AL ill. AX regiszter hibakódot tartalmaz. Ezen kívül
- egyes funkciók "elfelejtik" visszaállítani egyik-másik regisztert és így
- "szemetet" (gyakorlatilag használhatatlan adatot) adnak vissza rajtuk
- keresztül. Igy ezen regiszterek értékeinek esetleges mentésérôl és
- visszaállításáról magunknak kell gondoskodnunk.
-
- A DOS-szolgáltatásokat nem ismertetem részletesen, mert az egyrészt rettentôen
- hosszú, másrészt felesleges lenne, hiszen azok leírása megtalálható a hálózaton
- az INTER51 ill. TECHHELP adatbázisokban. E helyett a következôkben inkább a DOS
- elvi mûködését próbálom meg bemutatni egy-egy témát kidolgozásával.
-
-
- A DOS LEMEZ-SZERVEZÉSE
-
- A partíciós tábla
-
- Merevlemezes egységeken maximálisan négy, akár különbözô méretû logikai köteg,
- partíció kialakítására van lehetôség. Minden egyes partíció külön logikai
- egységet képez és általában külön logikai meghajtóként is jelenik meg. Ez
- kettôs elônyt hordoz magában. Egyrészt a DOS 3.3 vagy korábbi változata alatt
- is van lehetôség a 32 Mbájtnál nagyobb kapacitású merevlemezes meghajtók
- teljes kapacitásának kihasználására, másrészt a különbözô partíciókra különbözô
- operációs rendszerek telepíthetôk. A rendszerben mindig egy és csak egy partíció
- aktív, aminek mindig az elsô fizikai merevlemezes egységen kell lennie. Az aktív
- partíción elhelyezkedô operációs rendszer kerül betöltésre a rendszerindítás során.
- A rendszer indításkor a ROM-BIOS a partíciós táblát tartalmazó szektort a 0000:7C00
- logikai címre tölti be és átadja neki a vezérlést. A rutin megvizsgálja a partíciós
- táblát, majd az aktív partíció boot-rekordjának betöltése után átadja annak a
- vezérlést, ezáltal az operációs rendszert elindítva. Ha az aktív partíció boot-
- szektora nem operációs rendszert betöltô kódot tartalmaz, hanem például a jól
- ismert "Non system disk..." üzenetet megjelenítô programot, akkor a
- rendszerindítás csak külsô egységrôl (értsd floppy) lehetséges. A partíciós
- táblában elhelyezett speciális program segítségével lehetôség nyílik ún.
- multi-bootos rendszer létrehozására, melyben az aktív partíciótól függetlenül
- lehetôség nyílik bármely partíción elhelyezkedô operációs rendszer indítására.
- Ezen programok a partíciós táblában az aktív jelölést figyelmen kívül hagyják és
- a felhasználó által megadott (vagy kiválasztott) partíció boot-szektorát töltik
- be.
-
- Míg a partíciós tábla kezelése minden operációs rendszer alatt egységes módon történik,
- addig a partíción belüli logikai lemezfelépítés és -kezelés az operációs rendszertôl függ.
-
- A betöltô szektor
-
- A betöltô szektor (amit boot-szektornak is szokás hívni) minden LOGIKAI lemez elsô
- szektorában (0. oldal, 0. sávjának 1. szektor) helyezkedik el, ahova azt az
- operációs rendszer FORMAT parancsa írja fel. Ez a pozíció lemezeken a fizikailag elsô
- szektor, míg merevlemezes egységeken a partíció elsô szektora. Amennyiben a lemez
- rendszerlemez, abban az esetben ez a szektor az operációs rendszert betöltô rutint,
- míg egyéb esetekben általában egy üzenetet (pl. Non-system disk...) kiíró rutint
- tartalmaz, ami tájékoztatja a felhasználót, hogy a lemezrôl operációs rendszer
- nem indítható. Merevlemezek esetében a betöltô szektor a DOS partíció elsô
- szektorában helyezkedik el. Minden a DOS által támogatott és közvetlenül - azaz
- nem külsô eszközmeghajtón keresztül - kezelt lemezes eszköz az elsô szektort a
- betöltô-rekord számára tartja fenn. Erre azért van szükség, mert a DOS itt
- tárolja el a lemezes egységre vonatkozó logikai jellemzôket és néhány fizikai
- paramétert is. A betöltô szektor felépítése a következô:
-
- BOOTSECTOR
-
- Offset Méret Leírás
- 00h 3 közeli (8 bites) ugrás a betöltô-programra + NOP
- 03h 8 operációs rendszer azonosítója (nincs jelentôsége)
- 0Bh 2 szektorméret (2 egész hatványa)
- 0Dh 1 clusterenkénti szektorok száma
- 0Eh 2 fenntartott szektorok (szektorok száma az elsô FAT elôtt)
- 10h 1 FAT-másolatok száma
- 11h 2 maximális bejegyzések száma a gyökérkönyvtárban
- 13h 2 összes szektorok a lemezen/partíción (ha 0ffffh, akkor az 1fh offszeten)
- 14h 1 média-leíró bájt
- 15h 2 FAT mérete (szektorokban)
- 17h 2 sávonkénti szektorok száma
- 19h 2 író/olvasó fejek száma
- 1Bh 4 rejtett szektorok száma
- 1Fh 4 összes szektorok száma a lemezen/partíción (ha 13h offszeten 0ffffh van)
- 20h 1 fizikai lemez-azonosító
- 21h 1 fenntartott
- 22h 1 kibôvített boot-rekord szignatúra (29h) (a következô adatok csak
- megléte esetén érvényesek)
- 23h 4 lemez sorozatszáma (serial number)
- 27h 11 kötet-azonosító (volume label)
- 30h 8 file-rendszer (FAT) azonosítója
-
- A rendszerindítás során a boot-szektor a 0000:7C00 címre került betöltésre és
- megkapja a vezérlést. A táblázat elején található utasítás - a logikai táblázatot
- áthidalva - a boot-szektor valódi belépési pontjára ugrik. A boot-szektorban
- elhelyezkedô program feladata az operációs rendszer fájlainak megkeresése és
- betöltése. A DOS 5.0 elôtti verziókban ezeknek a fájloknak kötött helyen,
- közvetlenül a gyökérkönyvtár után kell elhelyezkedniük, e verzió felett azonban
- már nincs ez a megkötés.
-
- A FAT felépítésével folytatjuk ...
- - STING -
- eMail: STING@CRNL-GIMN.CRNL.HU
-
- (*****************************************************************************)
- Az alábbiakban található egy Pascal record, mely a bootsector-t felépítéséhez
- hasonlóan van felépítve, ha direkt lemezolvasással (INT 13h) olvasnánk be
- pl: floppy-nk bootsector-át akkor minden információ pontosan a record mezôibe
- kerülne. De ne rohanjunk a dolgok 'elibe', ugyanis errôl még késöbb lesz szó,
- s kevés ismeret birtokában az INT 13h-s megszakítással károkat okozhatnánk
- winchester-ünk - floppy-nk adataiban. Egyenlôre maradjunk a record-nál:
-
- type
- 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 ' }
- end;
-
- (*****************************************************************************)