"..640kb memória több, mint amennyire egy
             egyfelhasználós alkalmazásnak bármikor is szüksége
             lesz.. a szegmentált memóriaszervezés
             gazdaságosságának köszönhetően.." 
                             (an Intel Application Note, 1978)
 

Nos, a fenti állítás egy 1978-ban az Intel által megjelentetett és a PC-k alapjának is tekinthető, egy-kártyás számítógép építési útmutatójából származik. Mára már kiderült: az íróknak nem lett igazuk... 

Bár a Windows-os alkalmazások - szinte - egyeduralkodóvá válásával, valamint a beépített DOS Extender-t használó programok (elsősorban játékok) elterjedésével feledésbe merülőnek tűnik a DOS mágikus 640kbájtos határa, úgy gondolom mégis érdemes megismerkednünk az e határ "átlépését" elősegítő, valamikor igen jelentős szereppel bíró technikákkal ; nem is inkább gyakorlati, mintsem elméleti jelentőségük miatt, hiszen megismerésükkel, technikai megoldásaik megértésével talán magunk is jobb, gyorsabb megoldásokat dolgozhatunk ki - akár teljesen más téren - felmerülő számítástechnikai problémáinkra.

A 640 kb-os korlát

Biztos' sokakat elgondolkoztatott már, hogy vajon honnan ered a DOS - "bitekhez szokott szemmel" nem egészen kereknek tűnő - sokat emlegetett 640kbájtos korlátja. Nos, az ok egyszerűbb, mint gondolnánk: ennyi hely maradt az operatív memória számára. A PC-k memória-architektúrájának kialakításakor a már bevált, felülről-csipegetés elvét alkalmazták, azaz az újabb és újabb memória-lapolt egységek számára a területeket mindig a még szabad (kihasználatlan) memória-tartomány legfelső darabjából osztották ki: így a ROM-BIOS a F0000h-FFFFFh, a ROM-BASIC az E0000h-EFFFFh, a bővítő-kártyák (és BIOS-aik) a F0000h-DFFFFh, a karakteres megjelenítő egységek pedig először a B0000h-CFFFFh, majd a grafikus kártyák az A0000h-CFFFFh területet kapták.

Az eredeti PC maximálisan 256kbájtos memóriája mellett persze a rendszer-tervezők "gavallér-módon" osztogatták ki az 1MB-os címtartomány fennmaradó területeit. Azonban az újabb és újabb, a növekvő igények hatására egyre nagyobb memóriával szerelt modellek egyszer csak elérték az A0000h, azaz a 640 kbájtos határt amin túl hagyományos módszerekkel már nem nyílt lehetőség a memória bővítésére. Ráadásul az egyre komolyabb feladatokra használt adatbázis- és táblázatkezelő rendszerek pedig csak úgy "falták" a kilobájtokat...

A felső memória-blokkok (UMB)

A 640KB és 1MB közötti, az A0000h-FFFFFh fizikai címtartományban kihasználatlanul hagyott RAM memória-blokkokat szokás UMB-nek (Upper Memory Blocks - felső memória-blokkok) nevezni. Ezen memóriablokkokat általában ún. árnyék RAM-ként (Shadow RAM) szokták hasznosítani. A bővítő ROM-okban tárolt programok futásának sebessége ugyanis jelentősen megnövelhető, ha a ROM memóriánál jóval gyorsabb, az adott memóriablokk "alatt" - azaz azonos fizikai címen - elhelyezkedő RAM memóriába másoljuk át azok tartalmát és ott futtatjuk őket. Az árnyék-RAM engedélyezése esetén a BIOS rendszer-indításkor a bővítő ROM-ok tartalmát a RAM-ba másolja, majd azt írásvédetté teszi, valamint "kikapcsolja" a "felette" elhelyezkedő ROM-memóriákat.

Az UMB ROM vagy Shadow RAM memóriák által nem használt területeit a DOS maga nem képes felhasználni. Ezen területeken EMS lapkeret alakítható ki, vagy speciális eszközmeghajtó és rezidens (TSR) programok tölthetők be és futtathatók.

A kiterjesztett memória (EMS)

A probléma megoldására a fejlesztőknek olyan megoldást kellett kidolgozniuk, amely az ismert hardver korlátok ellenére is tetszőlegesen nagy memória kezelését teszi lehetővé. A megoldást az ún. memória-lapozási technika (paging) nyújtotta, amelynek segítségével több MB memória használatára is lehetőség nyílt a gépekben. A technika lényege, hogy a teljes elérni kívánt - amúgy a processzor címtartomány kívül elhelyezkedő - memóriát apróbb darabokra ún. lapokra osztják fel (logikailag). Ezek a lapok közül aztán a program által meghatározott, de mindig csak egyetlen darab "látható" a processzor címtartományában elhelyezkedő lapméretnyi területű ún.lapkeretben (page frame). A lapkeret gyakorlatilag egy, a memória alsó 1MB-jában elhelyezkedő "lyukként" képzelhető el, amelyen "keresztül" egyszerre a teljes expanded memóriának mindig csak a lapmérettel egyező, de tetszőleges, a lapok sorszámaival megadott részét láthatjuk.

Valódi (nem emulált, lásd később) lapozás esetén lapkeret címtartományába történő írás és olvasás valójában a kiterjesztett memória éppen belapolt területének egy celláját írja ill. olvassa.

A kiterjesztett memória specifikációt (Extended Memory Specification - EMS) a Lotus, az Intel és a Microsoft dolgozta ki (ezért szokták a specifikációt a kidolgozók kezdőbetűiből alkotott mozaikszó eléillesztésével LIM EMS-nek is nevezni) 1985-ben. Az EMS a teljes kiterjesztett memóriatartományt 16kbájt méretű lapokra osztja, melyek közül a 64kbájtos - általában az E0000h-EFFFFh-ig elhelyezkedő - címtartományba egymástól függetlenül egyszerre négy darab lapozható be. A specifikáció gyakorlati jelentősége, hogy az alkalmazott - esetenként eltérő - gyakorlati megvalósításoktól függetlenül egységes módon, azonos funkcióhívásokkal teszi lehetővé az alkalmazások számára a kiterjesztett memória elérését. Az EMS memória maximális mérete 32MB lehet (286-oson az EMM386.EXE használata esetén természetesen csak 16MB).

A specifikáció a lapozási mechanizmus kezelésén kívül számos kényelmi szolgáltatást is biztosít. A LIM EMS lehetőséget nyújt programkód tárolására és futtatására a kiterjesztett memóriában (pl. a Pascal overlay-kezelése ki is használja ezt - lásd OvrInitEMS függvény). Az alábbi ábra az EMS memória-kiosztás egy tipikus változatát mutatja.

A mindenki által jól ismert EMM386.EXE program valójában egy EMS-emulátor, hiszen a bővített memória (és persze a HIMEM.SYS) felhasználásával utánozza az eredeti kiterjesztett memória működését. Esetében az EMS memória nem ténylegesen külön, nem címezhető területen, hanem a bővített memóriában kap helyet. A lapváltás során az emulátor a változtatásokat a bővített memóriába írja vissza ill. az új lap tartalmát is onnan olvassa be. A valódi ill. emulált kiterjesztett memória könnyen megkülönböztethető: azonos sorszámú lap kettő vagy több példányban történő belapozása esetén előbbi esetben az egyik 16kbájtos lapkeretbe történő írás azonnal megváltoztatja a másik (azonos sorszámú lapot tartalmazó) lapkeret tartalmát is, míg emuláció esetén a két - elvileg azonos - lap tartalma független marad egymástól, hiszen a módosítások csak lapváltáskor íródnak vissza valódi tárhelyükre: a bővített memóriába.

A bővített memória (XMS)

Míg a 8086 ill. kompatibilis áramkörök csak 20, addig a 286-os már 24, a 386-os és felülről kompatibilis processzorok pedig már 32 bites címvezetékkel rendelkeztek. Ennek megfelelően a processzor által közvetlenül megcímezhető memória-tartomány 1MB-ról, 16MB-ra majd 4GB-ra nőtt. A kompatibilitás megőrzése miatt azonban a fejlettebb processzorok a plusz (1MB feletti) ún. bővített memóriát (extended memory) csak a processzor egy speciális (fejlettebb) ún. védett módjában érhetik el.

Az igazsághoz hozzátartozik, hogy a kompatibilitás a tárcímzés néhány speciális esetében nem igaz, ugyanis a 286-os és fejlettebb processzorok az FFFFh:0010h-tól FFFFh:FFFFh-ig terjedő logikai címekből nem ugyanazt a fizikai címet képzik mint a 8086-osok. Ez utóbbiak esetén ugyanis a logikai címekből történő fizikai címképzés során a keletkezett cím 21 bitje elvész (hiszen csak 20 bites a címbusz), így a szóban forgó címtartományba történő írás ill. olvasás valójában a fizikai memória - 16 bájt híján - első 64kbájtjába ír ill. olvas.

Ezzel szemben a 80286 és fejlettebb processzorok esetén a túlcsordulás nem vész el és ugyanaz a logikai címtartomány az 1MB feletti memória - szintén 16 bájt híján - első 64kbájtját jelentő fizikai címekre fordul le. Ismerve e inkompatibilitást az AT alaplap tervezői a teljes kompatibilitás megőrzése érdekében egy ún. A20 kaput (A20 gate) iktattak a rendszerbe, melynek kezelését a billentyűzet-vezérlő és reset-generátor áramkörre bízták. A gép bekapcsolásakor az A20 kapu zárva van, azaz nem engedi ki a címbuszra a processzor által generált fizikai cím 21. bitjét, ezáltal a PC ill. XT alaplapokkal teljesen megegyező működést produkálva. Amennyiben az operációs rendszer vagy DOS extender a processzort védett módba kapcsolja, az A20 kapu engedélyezésével tudja (és kell is neki a helyes működéshez) a 21. címbit kiengedését a címbuszra biztosítani. Ezt a speciális, az A20 kapu engedélyezett állapotában akár valós módból is elérhető, közvetlenül 1MB-nál kezdődő - 16 bájt híján - 64kbájtos területet szokás HMA-nak (High Memory Area - magas memória-terület) nevezni

A Lotus, az Intel, a Microsoft és az AST által kidolgozott XMS (eXtended Memory Specification - bővített memória specifikáció) e, 1MB felett fekvő memória-területek elérését teszi lehetővé a valós módú programok számára is. A specifikációt implementáló HIMEM.SYS eszközvezérlő betöltődése után azonnal engedélyezi az A20 címvonalat, ezáltal a már említett HMA területet valós módból közevetlenül is elérhetővé téve. Egyúttal standardizált szervizrutinokat bocsát az alkalmazások rendelkezésére, amelyekkel azok a bővített memóriából területeket tudnak foglalni maguknak ill. a foglalt és az 1MB alatti területek között adat-mozgatásra képesek. E rutinok meghívásakor a HIMEM.SYS átvált védett módba, elvégzi a szükséges adatmozgatásokat, majd valós módba visszalépve visszaadja a vezérlést a hívó programnak. A 3.0-s XMS specifikáció maximális 64MB 1MB feletti memória használatát teszi lehetővé (16-bites regisztereket használ a méretek közlésére, amiket KB-okban ad meg).

A lemezmellékleten megtaláljátok az XMS 3.0 ill. az EMS 4.0 specifikációkat (ez utóbbiban egyébként egy Pascal program is található, amely a funkciók tesztelésére használható).

A sorozat következő részében megismerkedünk a DOS extenderek és memória-menedzserek működésével.

Várom észrevételeiteket és javaslataitokat a sorozattal kapcsolatban.