A CONFIG.SYS felépítése és programozása


Mire jó a CONFIG.SYS?

A CONFIG.SYS egy egyszerű szövegfile, amelynek segítségével megadhatjuk, hogy a gép a DOS kerneljét követôen milyen ún. eszközmeghajtó programokat (device driver) töltsön be a memóriába. A device driverek lehetôvé teszik olyan hardware eszközök kezelését, amelyekhez a DOS kernelje nem biztosít közvetlen hozzáférést (ilyen pl. az egér).

A device driverek rendszerint .SYS kiterjesztéssel rendelkeznek, de a DOS újabb változataiban már felbukkantak az .EXE kiterjesztésű, egyszerre device driverként és futtatható programként is viselkedô driverek (pl. SMARTDRV.EXE, EMM386.EXE).

A leggyakrabban használt device driverek (MS-DOS v6.22 esetén)

HIMEM.SYS
Ezzel a driverrel lehet a valós (real) módban futó programok számára elérhetôvé tenni a mágikus 1MB-os határ fölötti memóriaterületet (XMS = extended memory). Ha például 8 mega RAM-unk van, akkor ezt a drivert nagy valószínűséggel szerepeltetni fogjuk a CONFIG.SYS-ben (hacsak nem használunk olyan memóriamenedzsert, amely kiváltja a HIMEM.SYS használatát, ilyen pl. a Quarterdeck QEMM386).

EMM386.EXE
A HIMEM.SYS szolgáltatásaira épülô driver, amely lehetôvé teszi az EMS memória (EMS = expanded memory) használatát. Az EMS egy az XT-k idejébôl visszamaradt hardware-es memóriabôvítési megoldás, amely ISA slotba illeszthetô memóriakártyák segítségével tette lehetôvé 1 MB-nál több memória megcímzését. Ma már nem sűrűn használják a hardware-es megoldást, mert a 386-os processzorok fejlett memóriakezelési technológiája (paging) lehetôséget ad ennek a hardware-es bôvítésnek a szoftveres szimulációjára. Ezt a szimulációt végzi el az EMM386.EXE. A driver használatára azért van még mindig szükség, mert számtalan olyan DOS-os program van, amelynek a memóriakezelése ezen a szabványon alapul.

ANSI.SYS
Használatával ANSI terminállá alakíthatjuk át a gépünket, azaz a DOS képernyôre író szolgáltatásai a driver betöltése után felismerik az ún. ANSI-szekvenciákat, és végre is hajtják azokat. Az ANSI szekvenciák lehetôséget adnak pl. a kurzor mozgatására, színek használatára, szövegbevitelre, menüzésre, stb.

DISPLAY.SYS
Lehetôséget nyújt (EGA és VGA kártyákon) a szöveges módban (80x25) használt default karakterkészlet megváltoztatására. A tényleges váltást a MODE CON paranccsal lehet eszközölni.

INTERLNK.EXE
Ha van egy soros vagy párhuzamos kábelünk (mindkét végén COM illetve LPT csatlakozóval), akkor összeköthetünk két gépet a megfelelô portjaikon keresztül. Ha ezt a drivert az egyik gépen (A) betesszük a CONFIG.SYS-be (majd rebootolunk), és a másik gépen (B) elindítjuk az INTERSVR.EXE programot, akkor az (A) gépen megjelenik a (B) gép minden elérhetô drive-ja (is), és úgy manipulálhatunk az (A)-n velük, mintha a (B) elôtt ülnénk. Ez a szolgáltatás nagyon jól használható nagy mennyiségű adat két gép közötti átvitelére (amennyiben nincs hálózat).

RAMDRIVE.SYS
Ezzel a driverrel gyárthatunk RAM-disket. A RAMDRIVE.SYS a központi memóriából (általában az XMS-bôl) lefoglal egy megadott méretű területet, és ezen a területen egy DOS partíciót szimulál (magyarul megjelenik az eddigiek mellett egy új logikai drive, mondjuk E: néven). Ezt a partíciót ugyanúgy kezelhetjük, mintha mondjuk egy vinyón lenne: írhatjuk/olvashatjuk, file-okat hozhatunk létre rajta, stb. Persze ha kikapcsoljuk a gépet, akkor a RAM-disk tartalma elvész, ezért kikapcsolás elôtt nem árt átmenteni a tartalmát valamely fizikai valójában is létezô partícióra.

SETVER.EXE
Ha ezt a drivert installáljuk, akkor a DOS "hazudni" fog egyes programoknak a verziószámát illetôen. Vannak programok, amelyek úgy indulnak, hogy megkérdezik a DOS-tól a verziószámát, és ha nem egyezik meg egy általuk megkívánt értékkel (pl. 3.3), akkor nem hajlandóak elindulni. A SETVER.EXE-vel kicselezhetjük ezt: a DOS minden programról, amely a verziószámát tudakolja, megállapítja, hogy szerepel-e egy listában (a SETVER.EXE tartalmazza ezt a listát, de mi is bôvíthetjük), és ha igen, akkor a listában a névhez rendelt verziószámot fogja visszaadni.

SMARTDRV.EXE
Szoftveres disk cache. Az adatkezelô programok gyakran írják-olvassák több százszor (ezerszer) ugyanazt a lemezterületet egymás után. Ha ilyenkor minden lépésben a vinyóhoz nyúlnánk, az elég lassú lenne. A disk cache programok egy olvasási kérelem esetén beolvassák a kért lemezblokk(oka)t egy általuk lefoglalt memóriaterületre (cache buffer), és csak ezután adják vissza a kért blokkot a programnak. Ha a program legközelebb olyan blokkot kér, amely már szerepel a cache bufferben, akkor a cache egybôl visszaadhatja a kért adatot, nem kell a lemezen kotorásznia. Ugyanez eljátszható az írással is: a cache nem írja ki egybôl a változtatásokat a lemezre, hanem a cache bufferben "gyűjti" ôket, és ha összegyűlt egy kupacnyi, akkor fordul csak a háttértárolóhoz, hogy az adatokat egy gyors menetben kiírja (ez persze veszélyes, áramszünet esetén könnyen elôfordulhat az adatvesztés, ha a program által kiírtnak vélt adatok csak a cache-bufferig jutottak el, a lemezre már nem).

Az egyes device driverekrôl a DOS HELP nevezetű parancsa segítségével szerezhetünk bôvebb információkat (pl. a HELP EMM386.EXE parancs az EMM386-ról ad részletes leírást).

A CONFIG.SYS-ben használható fontosabb parancsok (MS-DOS v6.22 esetén)

BUFFERS=x[,y]
A szektorbufferek számának meghatározására szolgál. A szektorbufferek egy igen primitív disk cache-t valósítanak meg, ha használunk más disk cache-t (pl. SMARTDRV), akkor célszerű ezt minimális értékre beállítani (minden buffer 532 byte memóriát foglal). A második paraméter (y) a másodlagos szektorbufferek számát állítja be (default a 0).

FILES=x
Meghatározza, hogy hány file lehet egyszerre nyitva (ebbe a DOS által megnyitott összes file beletartozik).

DOS=[HIGH | LOW][,UMB | NOUMB]

A következô paraméterek használhatóak:

  • UMB vagy NOUMB: a DOS-ra bízzuk-e az EMM386 vagy más memóriamenedzser által biztosított UMB-k (Upper Memory Block) menedzselését. Az UMB-k az XMS memóriából leszakított darabok, amelyeket az EMM386 címezhetôvé tesz az alsó 1 MB-os címterület felsô 384K-s ablakában (Upper Memory Area), és ezzel lehetôvé teszi, hogy pl. a device drivereinket ide töltsük (és ezzel növeljük a 640k alatti szabad terület méretét).

  • HIGH vagy LOW: Engedélyezzük-e, hogy a DOS feltöltse az operációs rendszer minél nagyobb részét a HMA-ba (High Memory Area). Ha HIGH, akkor engedélyezzük, ha LOW, akkor nem. Ahhoz, hogy ez működjön, szükséges (és elégséges:-) valamely XMS-driver (pl. HIMEM.SYS) betöltése (engedélyezni kell az A20 címvonalat).

A két lehetséges paraméter megadható egy parancsban is, vesszôvel elválasztva: pl. DOS=HIGH,UMB.

SWITCHES=/F /K /N /...
Az MS-DOS betöltôdési folyamatát konfigurálhatjuk. Egy használható opciója van: SWITCHES=/F, ha ezt beiktatjuk a CONFIG.SYS elejére, akkor a DOS nem fog a Starting MS-DOS... felirat megjelenése után 2 másodpercet várni.

LASTDRIVE=x
Azt adja meg, hány logikai meghajtót tartson nyilván a DOS a belsô adattáblázataiban (x A-tól Z-ig bármi lehet). Ha a LASTDRIVE mondjuk D-re van beállítva (LASTDRIVE=D), akkor hiába van 5 partíciónk, nem fogunk látni kettônél többet. Célszerű Z-re állítani.

STACKS=x[,y]
Ha egy hardware interrupt meghívódik, a megszakítási rutin rendszerint az éppen megszakított program stackjára (jobb esetben a sajátjára) szemetel. Ha ez a stack nem elég nagy (pl. a megszakítási rutin egy 8K-s buffert akar lefoglalni a 2K méretű stacken), akkor abból nagy gáz lehet ("Stack Overflow", "Exception 12" vagy más egyéb nyalánkság). A STACKS paranccsal arra utasítjuk a DOS-t, hogy minden hardware megszakítási rutinja futás elôtt állítsa át az SS:SP-t egy belsô DOS stackre, és oda szemeteljen (majd ha lefutott, akkor állítsa vissza az eredeti állapotot). Mivel egy hardware IRQ rutint is megszakíthat egy magasabb prioritású hardware IRQ (amelyhez tartozó handlernek egy másik stack kell), ezért több DOS stack-et is lefoglalhatunk. A STACK parancs két paramétere a DOS stackek számát (x), és a stackek méretét (y) adja meg (pl. STACKS=9,256).

SHELL=...
Itt lehet megadni a használni kívánt parancsértelmezô (shell) elérési útját, nevét és paramétereit. Ha nem adjuk, meg, akkor C:\COMMAND.COM az alapértelmezés.

NUMLOCK=ON | OFF
Ha nincs a BIOS-unkban "Num Lock Boot Status" opció, akkor ezzel kiválthatjuk. Azt adja meg, hogy a Num Lock a CONFIG.SYS lefutása után milyen állapotban legyen (ON vagy OFF).

COUNTRY=...
Ez a rémálom kezdete. Lehetôvé teszi, hogy "magyarítsuk" a DOS-unkat. Ennek a magyarításnak (kombinálva a DISPLAY.SYS driver, a MODE CON parancs és a KEYB rezidens billentyűzetdriver használatával) a leggyakoribb következményei:

  • megszokott angol nyelvű programjainkban a keretkarakterek helyett ékezetes betűk és más kriksz-krakszok jelennek meg,

  • a nyomtatók a 852-es kódlap alatt készített szövegeket 437-es (US) standard ASCII kódlappal írják ki, következésképpen az ékezetes betűk helyett a nyomtatásban keretkarakterek és más kriksz-krakszok jelennek meg (megoldás: be kell iktatni egy szoftveres konvertert a program és a nyomtató közé),

  • mivel használhatunk ékezetes karaktereket is a file-nevekben, nagyobb esélyünk van rá, hogy a más(ok)hoz átvitt lemezeinken lévô file-okat az illetô(k) nem fogják tudni kezelni,

  • a KEYB és a DISPLAY.SYS együttesen kb. 20 kilobyte-ot lefoglalnak a memóriából.

Ha valaki mindezek ellenére is használni kívánja a COUNTRY parancsot, akkor forduljon a DOS help-jéhez. Egyébként nem igazán hiszem, hogy DOS alatt erre szükség lenne, mert léteznek olyan billentyűzetdriverek (pl. MultiKey), amelyek rendkívül rugalmasan konfigurálhatóak: beállíthatjuk a billentyűzetkiosztást (melyik billentyűre milyen ASCII kódot generáljon), átállíthatjuk a DOS-ban használt karakterkészletet (ékezetesíthetjük), mindezt úgy, hogy nem kell áttérni a 852-es kódlapra. Ráadásul a MultiKey lehetôséget ad több installált kiosztás közötti futásidejű választásra (pl. Caps Lock + F1,F2,F3,... kombinációval). Saját tapasztalatom alapján azt tudom mindenkinek javasolni, hogy a 852-es kódlapot DOS (és Windows) környezetben messzirôl kerülje el, mert elég sok problémát tud okozni a használata (Windows alatt is - magyar Windows suxxx).

A végére maradt a két legfontosabb parancs:

DEVICE=...
Ezzel lehet egy device driver-t betölteni. A ... helyén meg kell adni a driver elérési útját, nevét, és a neki átadandó paramétereket (pl. DEVICE=C:\DOS\HIMEM.SYS /TESTMEM:OFF). Ha a DOS kezeli az UMB-inket (és betöltöttük az EMM386-ot), akkor DEVICE helyett használható a DEVICEHIGH parancs, ez megkísérli valamelyik UMB-ben elhelyezni a betöltendô drivert (ha nem sikerül, akkor a DEVICEHIGH úgy működik, mintha sima DEVICE lenne).

INSTALL=...
Ezzel lehet a CONFIG.SYS-bôl elindítani egy normál programot (BAT, COM, EXE). Olyan programot ne indítsunk INSTALL paranccsal, ami nem adja vissza egybôl a vezérlést a CONFIG.SYS-nek (pl. Norton Commander), az ilyet írjuk be inkább az AUTOEXEC.BAT végére. (Az INSTALL parancsnak is van UMB-s változata: az INSTALLHIGH.)

További megjegyzések:

  • A CONFIG.SYS-ben egy sort a REM paranccsal vagy a ; használatával lehet kommentnek nyilvánítani.

  • A SET parancs használható egy környezeti változó értékének beállítására (pl. SET TEMP=C:\TEMP).

Menüzési lehetôségek

Elôfordulhat, hogy a gépünket több különbözô CONFIG.SYS-szel szeretnénk használni. Például szeretnénk egy CONFIG.SYS-t

  1. arra az esetre, ha Windows-ozunk (ilyenkor nincs szükség sem az EMM386.EXE-re, sem a DOS-os egér meghajtóra),
  2. arra az esetre, ha csak XMS-t igénylô programokat (játékok, demók) futtatunk (ekkor szintén nem kell az EMM386.EXE, de a mouse driverre szükség lehet),
  3. arra az esetre, ha EMS-t használó programokat futtatunk,
  4. arra az esetre, ha soros/párhuzamos kábellel összekötöttük a gépünket valaki máséval, és az INTERLNK.EXE-t el akarjuk indítani,
  5. ...

Egy lehetséges megoldás az lenne, hogy létrehozunk CONFIG.1, CONFIG.2, stb. file-okat, és írunk egy batch file-t, amely rámásolja a paramétereként megadott számú CONFIG.x-et a CONFIG.SYS-re, majd rebootolja a gépet.

Az MS-DOS v6.22 már a CONFIG.SYS szintjén is biztosítja a multikonfigurációs lehetôségeket. Egy több konfigurációt tartalmazó CONFIG.SYS-t a következôképpen kell elkészíteni:

[menu]
menuitem=menu1, Menu 1 hosszabb leírása
menuitem=menu2, Menu 2 hosszabb leírása
...

Minden "menuitem" sor deklarál egy konfigurációt, amelynek van egy rövid azonosítója (pl. menu1), és (opcionálisan) egy hosszabb leírása is (ezt jeleníti meg a DOS bootoláskor, mint választható lehetôséget). Ha a hosszabb leírást nem adjuk meg, akkor a DOS az azonosítót (címkét) használja helyette.

[common]
BUFFERS=10,0
FILES=80
SHELL=C:\COMMAND.COM /E:1024 /P
...

A [common] szekcióba kerülnek azok a parancsok, amelyeket mindig végre kell hajtani, függetlenül attól, hogy melyik menüpontot választottuk.

[menu1]
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE
...

[menu2]
DEVICE=C:\DOS\INTERLNK.EXE
...

[...]
...

Ezzel a szerkezettel lehet megadni az egyes menüpontokhoz (a [menu] szekcióban megadott azonosító címkékhez) tartozó konfigurációs parancsokat. A DOS csak a választott menüelemhez tartozó parancsokat hajtja végre.

Az MS-DOS v6.22-be épített további menüzési parancsok lehetôséget adnak:

  • a menüpontok színének megváltoztatására (menucolor),
  • egy default menüelem megadására (ha eltelik egy másodpercben megadott idôtartam anélkül, hogy választottunk volna, akkor a default-ot veszi választottnak),
  • almenük létrehozására (submenu),
  • más file-ok beszúrására (include).

A részleteket ld. a DOS HELP-ben.

Példa a CONFIG.SYS-re