Egy kedves barátomnak időről-időre memóriateszteléssel is kellett foglalkoznia a munkahelyén. A behozott gépeket egészében, a lehető legegyszerűbb módon szerette volna tesztelni. Természetesen nem talált megfelelő célprogramot, amely eleget tett volna elvárásainak. Nos, az igények nem tűntek túlságosan meredeknek ahhoz, hogy belevágjak a program megírásába. Az igazi kihívást az idő szűkössége jelentette: mindössze néhány óra állt a rendelkezésemre...

Kihívás

Egy kedves barátomnak időről-időre memóriateszteléssel is kellett foglalkoznia a munkahelyén. A behozott gépeket egészében, a lehető legegyszerűbb módon szerette volna tesztelni. Mivel a gépeken a legkülönfélébb operációs rendszereket találta, így rendszeresített néhány 2 gigás vinyót, és minden gépre egyesével felrakta a Windows NT 4.0-t. S hogy miért pont azt? Nos, a Windows 95 és 98 tapasztalatai szerint nem minden esetben voltak képesek azonnal lebuktatni a hibás RAM modult, míg az NT általában már az első bootolásnál elszállt a hibás RAM miatt... Nos, ez a kedves, ám bonyolult megoldásokhoz szokott emberke szerette volna az említett műveletet egyszerűsíteni. Természetesen nem talált megfelelő célprogramot, amely eleget tett volna elvárásainak:

  • 32 vagy 64 bites memória vizsgálat (a 16 bites programok nem minden esetben jeleztek hibát)
  • a teljes memória átvizsgálása (64 MB feletti rész is)
  • DOS boot lemezről képes legyen futni -> kompakt méret (max. 1 MB)
  • max. fél órát vehet igénybe a teszt
  • végtelenített tesztre is legyen parancssori kapcsoló
  • egyedi elvárások (pl. vörös képernyő, ha hibát talált a program)

Nos, az igények nem tűntek túlságosan meredeknek ahhoz, hogy belevágjak a program megírásába. Az igazi kihívást az idő szűkössége jelentette: mindössze néhány óra állt a rendelkezésemre...

Hogyan?

Többféle út kínálkozott a teljes memória elérésére. Mivel alapvetően rossznak tűnt 16 bites programból végezni a 32 ill. 64 bites memória transzfert, ezért elvetettem a 16 bites assembly program, és az INT 15h megszakításon keresztüli XMS kezelés gondolatát...

Az idő sürgetett, így az első kezem ügyébe akadó DOS extender-t, a DOS32-t választottam. Ez képes XMS, EMS, VCPI és DPMI felületek kezelésére, és rendkívül egyszerű forráskóddal is beéri, vagyis nincs szükség hosszadalmas inicializációra, ill. include fájlok használatára. A DOS32 ugyan nem mai darab, tapasztalatok szerint azonban kisebb védett módú assembly programok futtatására megfelelő környezetet biztosít.

Kezdjük el!

Rendkívül egyszerű a DOS32 programok alap forrása:

.386

 

/ 32 bites védett mód

.MODEL

FLAT

/ Flat memóriakezelés

.STACK

100h

/ A vermünk, mérete tetszőleges

.CODE

 

/ Itt kezd?dik a kódszegmensünk

@entry:

 

/ És már jöhet is a program!

...

 

/ A lényeg helye...

MOV

AH, 4Ch

/ A program végén kilépünk

INT 21h

   

END

@entry

/ A program vége, és a belépési pont megjelölése

A fordítás sem túl bonyolult (a forrásunk neve legyen PROBA.ASM):

  • TASM proba
  • DLINK proba -S

Ezzel a DOS32 beépül a kész EXE-nk elejére, így a DOS32.EXE nem szükséges a programunk futtatásához...

A lényeg

Maga a memória vizsgálat pofonegyszerű. Teleírjuk a memóriát egy meghatározott értékkel, majd visszaolvassuk, és a két értéket összehasonlítjuk. Bármilyen apró kis eltérés is a memória rendszer hibás működésére utal. A memória átbogarászására többféle bevált módszer is létezik, én egy sajátos, mondhatni egyéni utat választottam: írjuk tele a memóriát csupa 00h bájttal. Miután végeztünk, olvassuk vissza a teljes memóriát, és ellen?rizzük, hogy minden pozíción 00h van-e. Ha stimmel, menjünk tovább 01h, 02h, 03h ..., egészen FFh-ig. Ha mindezzel végeztünk, az azt jelenti, hogy a memória helyesen működik, hiszen minden bit átbillenthet? 0-ról 1-re és 1-r?l 0-ra is.

Problémák

A program első verziójának tesztelése folyamán kiderült, hogy a program nem minden esetben volt képes a rossz memóriából hibát kicsiholni. Azonban a végtelenített teszt miatt beépítésre került "L" parancssori kapcsoló használatával a program legkés?bb a második iterációban már minden hibás memóriát kiszúrt. Így végül a 2.0-s verzióban, alapesetben 3 iterációval fut a program, vagyis végigmegy 00h-tól FFh-ig az összes lehetséges értéken, majd ezt még kétszer megismétli. Az "L" kapcsoló természetesen továbbra is használható maradt... A másik problémát a 'speciális' memória vizsgálati mód jelentette: a sokféle adat miatt a teljes memória átbogarászása viszonylag hosszú ideig tart, azonban szerencsére az el?re meghirdetett kereteken belül marad. Egy 500 MHz-es Pentium III, 128 MB PC100 SDRAM-os konfiguráción 1 iteráció kb. 7 percig fut... A program 64 bites transzfert használó változata idő hiányában sajnos túl bonyolultra és jóval lassabbra sikeredett. Mivel a 32 bites műveleteket végző verzió is tökéletesen megfelelt az elvárásoknak, így nem is foglalkoztam többet a 64 bites program optimalizációjával, és itt sem közlöm le a bénácska program forrását... Ha kedved szottyan a 32-ről 64 bitre való átírásra, akkor az MMX és FPU rövidítések környékén indulj el! :)

Végeredmény

A program forrása az apróbb extra igények után terjedelmesre nőtt: majdnem 8 KB hosszú lett! :) A program fordított változata is megtalálható a cikk mellett, de nem ajánljuk Win9x alól elindítani. (Simán DOS-ból, minden vezérlő program - pl. EMM386.exe, HIMEM.sys - nélkül.) A programot alaposan elláttam megjegyzésekkel így minden részlet érthető. Ellenben hiányzik belőle néhány alapvető, ám időhiány miatt kimaradt kényelmi szolgáltatás, pl. a kurzor eltüntetése vagy a teszt megszakításának lehetősége...