home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 March / pcx08_9703.iso / melyviz / pcx-user / rprog / rprog2.txt < prev   
Encoding:
Text File  |  1997-02-11  |  10.8 KB  |  204 lines

  1.                              RENDSZERPROGRAMOZÅS
  2.  
  3. A DOS ÉS SZOLGÅLTATÅSAI - III.
  4.  
  5. Programozási konvenciók
  6.  
  7. Kerüljük a "régi-stílusú" DOS 1.0 funkcióhívások (01h-0Ch, 26h) használatát.
  8. Kerüljük az "undocumented" (HIVATALOSAN nem dokumentált) funkciók használatát 
  9. ha csak nem feltétlenül szükségesek és nem lehet kikerülni ôket (nincs 
  10. workaround), hiszen ezek bármikor megváltozhatnak (mivel, hogy hivatalosan 
  11. nem is léteznek) és programjaink inkompatibilisek lesznek. Ráadásul más - 
  12. ezeket a funkciókat leszámítva - kompatibilis operációs rendszerek nem feltétlenül 
  13. támogatják azok használatát. Verzió-specifikus (csak adott verzió(k)ban/verzió 
  14. felett implementált) funkciók használatakor vizsgáljuk meg a futtatott DOS 
  15. verziószámát, hogy megfelelô -e. Kerüljük a BIOS ill. hardver funkciók általi 
  16. közvetlen lemezelérést amennyiben a DOS is biztosít szolgáltatást a kívánt 
  17. adatok elérésére, mert a fejlettebb operációs rendszerek DOS-emulációs 
  18. környezetei nem igazán támogatják ezt.
  19.  
  20. A DOS regiszter-használata
  21.  
  22. A DOS a funkcióhívásokkal kapcsolatos paraméterátadásra és azok végrehajtására 
  23. a következô regisztereket használja: AX, BX, CX, DX (általános reg.), CS, DS, 
  24. ES, SS (szegmens-reg.), DI, SI (index reg.), SP, BP, IP (mutatók). Ezen 
  25. regiszterek mindegyikével rendelkezik már a 8088-8068 processzor is, így
  26. minden DOS verzió minimális igénye ez a processzor (gyakorlatilag - egyéb 
  27. rendszerfeltételek (pl. memória) elégséges megléte esetén - még az elsô 
  28. PC-ken is fut a DOS 6.22 is). A DOS nem használja az újabb processzorok 
  29. plusz és kibôvített regisztereit még akkor sem, ha megfelelô processzoron fut.
  30. Funkcióhívásokkor az AX kivételével (ezt ugyanis hibakód visszaadására használja 
  31. fel a DOS) minden regiszter értéke megôrzôdik, ha csak nem valamilyen visszatérési
  32. információt (pl. mutató egy sztringre) közlésére lesz felhasználva.
  33.  
  34. A DOS-vermek
  35.  
  36. Amikor a DOS egy funkció hívásakor megkapja a vezérlést (a regiszterek elmentése 
  37. után) a veremszegmensregisztert és -mutatót egy belsô, 48 bájtos veremre 
  38. állítja be. A DOS összesen 3 belsô veremmel dolgozik, melyek közül ez az 
  39. amelyiket közvetlenül a vezérlés átvétele után használ. Azt, hogy e ill. a 
  40. másik két verem közül melyiket használja a funkció végrehajtásakor a funkció 
  41. kódja alapján dönti el. Ezeken kívül kiegészítô vermek is foglaltathatók a 
  42. DOS-szal a CONFIG.SYS-beli STACKS=x y utasítással, ami x funkcióhívás számára 
  43. egyenként y bájt méretû vermet foglal le.
  44.  
  45. A DOS MEGSZAKITÅSAI 
  46.  
  47. A Microsoft (ajánlása) a DOS-nak a 20h és 3Fh közötti megszakításokat tartja 
  48. fenn. Ennek ellenére valójában maga a DOS kernel csak a 20h-27h ill. a 2Fh 
  49. megszakításokat használja. Ezek a megszakítások a következôk:
  50.  
  51.  
  52. Megszakítás Leírás 
  53.  20h         Terminate Current Task
  54.  21h         DOS szolgáltatások 
  55.  22h         Befejezési cím
  56.  23h         Ctrl-Break kezelô rutin
  57.  24h         Kritikus-hiba kezelô
  58.  25h         Abszolút lemez-olvasása
  59.  26h         Abszolút lemez-írás
  60.  27h         TSR (Terminate-and-Stay-Resident)
  61.  
  62.  
  63. A DOS-szolgáltatások
  64.  
  65. A DOS szolgáltatások széles skáláját nyújtja a karakteres ki-/bevitel, a file- 
  66. és memória-kezelés és egyéb területeken. Ezeket a funkciókat a 21h 
  67. megszakításon keresztül érhetjük el. A funkciókra hívásuk során azonosító
  68. számukkal kell hivatkozni. A DOS funkciókódok a következôk:
  69.  
  70. A 21h megszakítás a funkció számát az AH, míg az esetleges alfunkció azonosítóját 
  71. az AL regiszterben várja. A funkciótól függôen egyéb regisztereket is lehet ill. 
  72. kell használni paraméterek átadására. Szinte mindegyik funkció a Carry flaget 
  73. (átvitelbit, CF) hiba jelzésére használja. Ha a DOS funkció végrehajtása során hiba
  74. következik be (vagy már a parancskód is eleve érvénytelen volt) a megszakítás során 
  75. a DOS a Carry flaget bekapcsolja, míg sikeres végrehajtás esetén törli. CF=1 
  76. mellett általában az AL ill. AX regiszter hibakódot tartalmaz. Ezen kívül 
  77. egyes funkciók "elfelejtik" visszaállítani egyik-másik regisztert és így 
  78. "szemetet" (gyakorlatilag használhatatlan adatot) adnak vissza rajtuk 
  79. keresztül. Igy ezen regiszterek értékeinek esetleges mentésérôl és 
  80. visszaállításáról magunknak kell gondoskodnunk.
  81.  
  82. A DOS-szolgáltatásokat nem ismertetem részletesen, mert az egyrészt rettentôen 
  83. hosszú, másrészt felesleges lenne, hiszen azok leírása megtalálható a hálózaton 
  84. az INTER51 ill. TECHHELP adatbázisokban. E helyett a következôkben inkább a DOS
  85. elvi mûködését próbálom meg bemutatni egy-egy témát kidolgozásával.
  86.  
  87.  
  88. A DOS LEMEZ-SZERVEZÉSE
  89.  
  90. A partíciós tábla
  91.  
  92. Merevlemezes egységeken maximálisan négy, akár különbözô méretû logikai köteg, 
  93. partíció kialakítására van lehetôség. Minden egyes partíció külön logikai 
  94. egységet képez és általában külön logikai meghajtóként is jelenik meg. Ez 
  95. kettôs elônyt hordoz magában. Egyrészt a DOS 3.3 vagy korábbi változata alatt 
  96. is van lehetôség a 32 Mbájtnál nagyobb kapacitású merevlemezes meghajtók 
  97. teljes kapacitásának kihasználására, másrészt a különbözô partíciókra különbözô 
  98. operációs rendszerek telepíthetôk. A rendszerben mindig egy és csak egy partíció 
  99. aktív, aminek mindig az elsô fizikai merevlemezes egységen kell lennie. Az aktív 
  100. partíción elhelyezkedô operációs rendszer kerül betöltésre a rendszerindítás során.
  101. A rendszer indításkor a ROM-BIOS a partíciós táblát tartalmazó szektort a 0000:7C00 
  102. logikai címre tölti be és átadja neki a vezérlést. A rutin megvizsgálja a partíciós 
  103. táblát, majd az aktív partíció boot-rekordjának betöltése után átadja annak a 
  104. vezérlést, ezáltal az operációs rendszert elindítva. Ha az aktív partíció boot-
  105. szektora nem operációs rendszert betöltô kódot tartalmaz, hanem például a jól 
  106. ismert "Non system disk..." üzenetet megjelenítô programot, akkor a 
  107. rendszerindítás csak külsô egységrôl (értsd floppy) lehetséges. A partíciós 
  108. táblában elhelyezett speciális program segítségével lehetôség nyílik ún. 
  109. multi-bootos rendszer létrehozására, melyben az aktív partíciótól függetlenül
  110. lehetôség nyílik bármely partíción elhelyezkedô operációs rendszer indítására.
  111. Ezen programok a partíciós táblában az aktív jelölést figyelmen kívül hagyják és
  112. a felhasználó által megadott (vagy kiválasztott) partíció boot-szektorát töltik 
  113. be.
  114.  
  115. Míg a partíciós tábla kezelése minden operációs rendszer alatt egységes módon történik, 
  116. addig a partíción belüli logikai lemezfelépítés és -kezelés az operációs rendszertôl függ.
  117.  
  118. A betöltô szektor
  119.  
  120. A betöltô szektor (amit boot-szektornak is szokás hívni) minden LOGIKAI lemez elsô
  121. szektorában (0. oldal, 0. sávjának 1. szektor) helyezkedik el, ahova azt az 
  122. operációs rendszer FORMAT parancsa írja fel. Ez a pozíció lemezeken a fizikailag elsô
  123. szektor, míg merevlemezes egységeken a partíció elsô szektora. Amennyiben a lemez
  124. rendszerlemez, abban az esetben ez a szektor az operációs rendszert betöltô rutint,
  125. míg egyéb esetekben általában egy üzenetet (pl. Non-system disk...) kiíró rutint
  126. tartalmaz, ami tájékoztatja a felhasználót, hogy a lemezrôl operációs rendszer 
  127. nem indítható. Merevlemezek esetében a betöltô szektor a DOS partíció elsô 
  128. szektorában helyezkedik el. Minden a DOS által támogatott és közvetlenül - azaz 
  129. nem külsô eszközmeghajtón keresztül - kezelt lemezes eszköz az elsô szektort a 
  130. betöltô-rekord számára tartja fenn. Erre azért van szükség, mert a DOS itt 
  131. tárolja el a lemezes egységre vonatkozó logikai jellemzôket és néhány fizikai 
  132. paramétert is. A betöltô szektor felépítése a következô:
  133.  
  134. BOOTSECTOR 
  135.  
  136. Offset Méret Leírás
  137. 00h    3     közeli (8 bites) ugrás a betöltô-programra + NOP
  138. 03h    8     operációs rendszer azonosítója (nincs jelentôsége)
  139. 0Bh    2     szektorméret (2 egész hatványa)
  140. 0Dh    1     clusterenkénti szektorok száma
  141. 0Eh    2     fenntartott szektorok (szektorok száma az elsô FAT elôtt)
  142. 10h    1     FAT-másolatok száma
  143. 11h    2     maximális bejegyzések száma a gyökérkönyvtárban
  144. 13h    2     összes szektorok a lemezen/partíción (ha 0ffffh, akkor az 1fh offszeten)
  145. 14h    1     média-leíró bájt
  146. 15h    2     FAT mérete (szektorokban)
  147. 17h    2     sávonkénti szektorok száma
  148. 19h    2     író/olvasó fejek száma
  149. 1Bh    4     rejtett szektorok száma
  150. 1Fh    4     összes szektorok száma a lemezen/partíción (ha 13h offszeten 0ffffh van)
  151. 20h    1     fizikai lemez-azonosító
  152. 21h    1     fenntartott
  153. 22h    1     kibôvített boot-rekord szignatúra (29h) (a következô adatok csak 
  154.              megléte esetén érvényesek)
  155. 23h    4     lemez sorozatszáma (serial number)
  156. 27h    11    kötet-azonosító (volume label)
  157. 30h    8     file-rendszer (FAT) azonosítója 
  158.  
  159. A rendszerindítás során a boot-szektor a 0000:7C00 címre került betöltésre és 
  160. megkapja a vezérlést. A táblázat elején található utasítás - a logikai táblázatot
  161. áthidalva - a boot-szektor valódi belépési pontjára ugrik. A boot-szektorban 
  162. elhelyezkedô program feladata az operációs rendszer fájlainak megkeresése és 
  163. betöltése. A DOS 5.0 elôtti verziókban ezeknek a fájloknak kötött helyen, 
  164. közvetlenül a gyökérkönyvtár után kell elhelyezkedniük, e verzió felett azonban 
  165. már nincs ez a megkötés.
  166.  
  167. A FAT felépítésével folytatjuk ...
  168.                                                        - STING -
  169.                                                 eMail: STING@CRNL-GIMN.CRNL.HU
  170.  
  171. (*****************************************************************************)
  172.  Az alábbiakban található egy Pascal record, mely a bootsector-t felépítéséhez
  173.   hasonlóan van felépítve, ha direkt lemezolvasással (INT 13h) olvasnánk be
  174.   pl: floppy-nk bootsector-át akkor minden információ pontosan a record mezôibe
  175.   kerülne. De ne rohanjunk a dolgok 'elibe', ugyanis errôl még késöbb lesz szó,
  176.   s kevés ismeret birtokában az INT 13h-s megszakítással károkat okozhatnánk
  177.   winchester-ünk - floppy-nk adataiban. Egyenlôre maradjunk a record-nál:
  178.  
  179.   type
  180.    PBootSecInforms = ^TBootSecInforms;
  181.    TBootSecInforms = record
  182.      JMP            : Array[1..3] of Byte;
  183.      OEMName        : Array[1..8] of Char;
  184.      Byte_Sector    : Word;
  185.      Sector_Cluster : Byte;
  186.      ReservedSecs   : Word;
  187.      FATCount       : Byte;    {FATCount * SectorInOneFAT          }
  188.      MaxRootEntries,           {(MaxRootEntries * 32) / Byte_Sector}
  189.      Total_Sector   : Word;    {DataStart = ReservedSecs + FATSize + RootSize}
  190.      MediaDescriptor: Byte;
  191.      SectorInOneFAT,
  192.      Sector_Track,
  193.      Head_Number,
  194.      Hidden_Sector  : Word;    {if partitions > 32M then It's the Lo Word    }
  195.      Hidden_SectorHi: Word;    {if partitions > 32M then used else not used  }
  196.      BIGTotal_Sector: Longint; {if (partitions > 32M) And (Total_Sector = 0) }
  197.      PhisicalDriveNo: Byte;    {   then used else not used                   }
  198.      InfoLevel      : Word;    {Must be 0 ???}
  199.      SerialNumber   : Longint; {In Hex (bin) }
  200.      VolumeLabel    : Array[1..11] of Char; {'NO NAME    ' if none present}
  201.      FileSystemType : Array[1..8] of Char;  {'FAT12   '    or 'FAT16   '  }
  202.    end;
  203.  
  204. (*****************************************************************************)