Memóriakezel riakezelés s I. A memória címzése; A memória felosztása; Abszolút változó (rádefiniálás); Memóriatömbök. Készítette: dr. Nyári Tibor
Emlékeztető! A memória címzc mzése: A memóri riát byte-onk onkéntnt címezzük, a címzc mzéshez regiszter-eket eket használunk. 16 bit-es címzési mód: m 1 regiszter=2 byte(=16 bit) 2 16 (=65535 byte) 32 bit-es címzési mód: m 64 Kbyte címezhető meg. 2 32 byte 4096 Mbyte címezhető meg.
szegmenscím Alapfogalmak: Abszolút t cím: c a memória valamely byte-jának a memória elejétől számított fizikai címe Relatív v cím: c a memória valamely pontjától számított cím Paragrafus: a memória egy 16 byte nagyságú része (a paragrafus mindig egy 16-tal osztható fizikai címen kezdődik, így a k. paragrafus a k*16. byte-on kezdődik) Szegmens: egy vagy több paragrafusból álló folytonos memóriaterület (nagysága nem haladhatja meg a 64 Kbyte-ot, a kezdőcíme megadható paragrafusokban vagy abszolút módon) Paragrafusokban általában egy szegmens kezdetét szokás megadni
abszolút cím Például: Egy 3 paragrafusnyi, 48 byte méretű szegmens, amelynek szegmenscíme: 2 $0000 (0) 0 16 byte $0010 (16) 1 16 byte $0020 (32) 2 16 byte $0030 (48) 3 16 byte $0040 (64) 4 16 byte szegmenscím 16 byte
DOS Kétkomponensű címzési módszerm Egy fizikai címet egy szegmenscím és egy ofszetcím határoz meg. Szegmens:Ofszet Szegmenscím: m: egy szegmens címe paragrafusokban Ofszetcím: a szegmensen belüli relatív cím eltolás - mindkét cím egy-egy regiszter, értéke: $0000 - $FFFF - több Szegmens:Ofszet is meghatározhat egy memóriacímet Normált cím: c ha az eltolás értéke 0-15 közé esik - normált cím esetén egy címet csak egyfélek leképpen lehet megadni
Például: Ha a szegmenscímet megszorozzuk 16-tal, és hozzáadjuk az ofszetcímet, akkor megkapjuk, hogy a fizikai cím a memória hányadik h byte-ja. $0001:$0021 $0002:$0011 $0003:$0001 1 * 16 + 33 = 49 2 * 16 + 17 = 49 3 * 16 + 1 = 49 mindhárom cím ugyanazt a byte-ot határozza meg a memória 49. ($0031.) byte-ját. az 1 Mbyte teteje: $FFFF:$000F, azaz 65535 * 16 + 15 = 1 048 575
A memória felosztása: sa: $10000:$0000 $E000:$0000 $C000:$0000 $A000:$0000 AT extended memória ROM BIOS terület Installálható ROM terület Video pufferek területe $0040:$0000 DOS átmeneti része Átmeneti programterület Transient Program Area DOS rezidens része ROM BIOS adatterület Megszakítási vektortábla Címek
A megszakítási si vektortábl blában a hardware és a software megszakítások címei vannak. A megszakítási si rutinok olyan végrehajtható eljárások, melyeket a rendszer használ anélkül, hogy sok esetben a programozó tudna róla. A vektortábla rutinjait a programozó is felhasználhatja saját céljaira. Megszakítási vektortábla
Rendszerterület, amely a hardware vezérl rléséhez szüks kséges adatokat tartalmazza. Ezt a területet átírni csak a rendszer alapos ismerete esetén szabad! ROM BIOS adatterület
A DOS alaprutinjai, amelyek indításkor betöltődnek a memóriába és az operációs rendszer futása során ott is maradnak. DOS rezidens része
Ez a terület a 640 kbyte legnagyobb része, ide kerülnek a felhasználói programok. Ide kerül az általunk írt program is, ezért ennek elhelyezkedését a memóriában és a program által használt további memóriaterületeket részletesen tárgyaljuk. Átmeneti programterület Transient Program Area
Értelemszerűen az operációs rendszer átmenetileg használt részeinek területe. DOS átmeneti része
Képernyőmemóriák területe. A rendszer egy képernyőmemória tartalmát vetíti ki a monitorra. Video pufferek területe Más-más típusú videokártyák esetén a videopuffer ezen területen belül különböző címeken helyezkedhet el.
Ezt a területet a rendszer foglalja Installálható ROM terület magának.
Ezt a területet a rendszer foglalja magának. ROM BIOS terület
AT extended memória Extended (bővített) memória: - az 1Mbyte feletti memória részr sz, melyet a processzor csak védett üzemmódban tud elérni.
PrefixSeg PSP A *.exe állomány elhelyezkedése a tárban: t HeapEnd HeapPtr HeapOrg Sseg:SPtr Szabad memória Heap Overlay puffer Verem OvrHeapEnd OvrHeapOrg SSeg:$0000 Szabad verem Globális változók Átmeneti programterület Transient Program Area DSeg:$0000 CSeg:$0000 Típusos állandók System egység kódszegmens 1. egység kódszegmens 2. egység kódszegmens k. egység kódszegmens *.exe tartalma Főprogram kódszegmens
PrefixSeg PSP PS P: Program Segment Prefix Egy 256 byte-os memóriaterület, melyet az operációs rendszer állít elő az *.exe állomány betöltésekor. A PSP szegmenscímét a System egység PrefixSeg változója tartalmazza.
A kódszegmens: k A program jól elkülöníthető programrészek szekből áll. Egy Pascal programnak mindig van egy főprogramja, amely különböző modulokat használ. Ezek lehetnek szabványos mo- dulok (System, Crt, Printer, stb.) és a programozó által készk szített, majd a programhoz hozzászerkesztett modulok. Minden modul lefordított kódja egy különk szegmens, melyek egymás s után helyezkednek el a tárban: -főprogram kódszegmense; - programhoz szerkesztett modulok kódszegmensei DSeg:$0000 fordított sorrendben, mint ahogyan azokat a USES kulcsszó után megadtuk, majd pedig a SYSTEM egység g az utolsó kódszegmens, amely minden programhoz automatikusan hozzászerkeszt szerkesztődik Egy kódszegmens k maximális mérete: m 64 kbyte CSeg:$0000 A program futásakor a vezérlés mindig más m s kódszegmensbenk van, az aktuális szegmens szegmenscímét a processzor CS (CodeSegment) regisztere tartalmazza, melynek értékét a SYSTEM egység Cseg függvényével lekérdezhetjük. Típusos állandók System egység kódszegmens 1. egység kódszegmens 2. egység kódszegmens k. egység kódszegmens Főprogram kódszegmens *.exe tartalma
Adatszegmens: Az adatszegmens egy közös, állandó adatterület. A főprogram és az összes egység ezt az adatterületet használja statikus adatainak tárolására. Az adatszegmens tartalmazza tehát a globális lis változókat és az összes típusos állandót. Az adatszegmens mérete is maximum 64 kbyte lehet. Ebből következik, hogy összességében ennél nagyobb terület nem áll rendelkezésünkre nkre globális adataink számára. 64 kbyte-nál nagyobb területet elfoglaló adatszerkezetet nem adhatunk meg programunkban, és a szabványos egységekben deklarált adatok szintén az adatszegmensből l foglalják k a helyet. DSeg:$0000 Globális változók Típusos állandók Az adatszegmens méretét a deklarált lt adatok határozz rozzák k meg, így az már a fordítás s során n eldől. Az adatszegmens szegmenscímét a processzor DS(Data Segment) regisztere tartalmazza, mely a program futása során állandó, értéke a System egység Dseg függvényével lekérdezhető.
Veremszegmens: LIFO A veremszegmenst a rendszer az adatok ideiglenes tárolt rolásárara használja: ide kerülnek az eljárások és s függvf ggvények lokális lis változv ltozói, paraméterei és visszatérési si címeic mei. A verem szegmenscíme és s mérete m a futás s során állandó. A szegmenscímet a processzor SS (Stack Segment) regisztere tartalmazza, értéke a System egység Sseg függvényével lekérdezhető. A verem méretét (min. 1 kbyte, max.. 64 kbyte) fordítás előtt meg lehet adni ($M fordítási direktíva) va). Ha ezt nem tesszük, akkor a keretrendszerben megadott alapértelmez rtelmezés lép érvénybe, amelynek szokásos értéke 16 kbyte körül van. A verem lefelé növekszik. Sseg:SPtr SSeg:$0000 Verem Szabad verem A verem-mutat mutató mutatja a következő elhelyezendő adat címét. Ez a verem szegmenscímétől számított relatív v cím, c mely kezdetben maximális, és ahogy telik a verem, úgy csökken az értéke. A verem-mutat mutató a System egység SPtr függvényével lekérdezhető.
Overlay (átfedési) puffer: Ez a terület csak akkor része programunknak, ha átfedési (overlay( overlay) technikát alkalmazunk, egyébk bként a verem után n közvetlenk zvetlenül l a heap következik. Az overlay technikát nagy programok esetén szokás használni, és lényege a következő: nem tartjuk bent egyszerre a tárban t a teljes OvrHeapEnd lefordított programot, hanem annak csak az éppen futó részeit. Így a futó OvrHeapOrg programrészek átfedik egymást. A betöltéseket az Overlay egység automatikusan elvégzi a hivatkozott programelemek alapján. Overlay puffer A puffer elejét a System egységben található OvrHeapOrg, végét az OvrHeapEnd függvénnyel kérdezhetjük le.
Heap: halom, rakás A heap egy dinamikus adattárol roló. A program futása közben dinamikus változv ltozókat lehet itt létrehozni illetve megszüntetni ntetni. A teljes heap bármekkora lehet, de egy dinamikus változv ltozó mérete nem lehet több t 64 kbyte-nál. HeapEnd A heap minimális illetve maximális HeapPtr Szabad memória méretét a $M fordítási direktívával adhatjuk meg, ha ezt nem tesszük, akkor a keretrendszerben megadott Heap HeapOrg alapértelmez rtelmezés lép életbe, mely szerint a heap lefoglalja a teljes szabad Overlay puffer memóri riát. A heap veremszerűen en működik, felfelé növekszik. A területfoglalásokat és felszabadításokat, a foglalt és a szabad területek felügyeletét a heap-manager végzi, mely a System egység része. A heap mutató alatti részben vannak a program által lefoglalt dinamikus változók, a felette lévő rész szabad. A heap alját a System egység HeapOrg változója, tetejét a HeapEnd, a heap-mutat mutatót a HeapPtr mutatja.
A Verem és s a Heap méretének beáll llítása: {$M Veremméret ret, HeapMin, Heapmax} Veremméret: ret: a verem pontos méretét állítjuk be (1024..65520) HeapMin: az a minimális heapméret, amelyre a programnak mindenképpen szüksége van a futáshoz (0..655360) HeapMax: az a méret, amelynél több heap-et nem szeretnénk, ha a program lefoglalna még akkor sem, ha van annyi hely (HeapMin..655360) A $M direktívát a főprogram elején kell megadni, elhagyása esetén a ke- retrendszerben megadott értékek a mérvadóak. Ha a HeapMin-ben megadott terület a program futásakor nem áll rendel- kezésre sre, akkor a program nem indul el.
A Seg és Ofs függvények: A függvények paramétere bármi lehet, aminek a memóri riában címec van (változó, rutin, stb.). A visszaadott érték k WORD típusú - a kérdéses objektum szegmens illetve ofszet címe. c Például: Seg(a) illetve Ofs(a)
Abszolút t változv ltozó,, rádefinir definiálás: Elképzehető olyan eset, amikor a programozó maga akarja meghatározni egy változó fizikai címét. Például amikor a ROM BIOS adatterület egy adatát szeretné programjából megváltoztatni (érdemes kerülni! lni!) vagy gyakoribb esetben a képer- nyőmem memóriát akarja direkt módon m elérni rni. Ekkor a deklaráci ció végén meg kell adnia a változó címét: var valtozo_nev nev: : típus t ABSOLUTE Szegmens:Ofszet; Abszolút változó megadásakor nem törtt rténik memóriafoglal riafoglalás, a változóhoz tartozó terület kezelésének felelőse a programozó. Abszolút t változv ltozót t csak indokolt esetben célszerc lszerű használni (sokszor csak kényelmi k szempontból), mert a memória néhányn ny részének megváltoztat ltoztatása esetén n a rendszer összeomolhat!!!
Például: A színes képernyő memória első karakterének abszolút deklarációja: var elso_karakter : array[1..2] of byte : absolute $B800:0; vagy Mono monitor esetén az egész képernyő lefedésére alkalmas deklaráció: type monitor_tipus tipus = array[1..25,1..80,1..2] of byte; var monitor : monitor_tipus tipus absolute $B000:0; stb.
BALTA!!! Ha tipus2 több memóriát foglal, mint tipus1, akkor v2 belelóg a v1 utáni változóba....érdekess rdekesség: Egy abszolút változó deklarálásakor a konkrét fizikai cím c m helyett írhatunk egy másik változv ltozónevet is. Például: var v1 : tipus1; v2 : tipus2 absolute v1; Így v2 címe megegyezik v1 címével. A rendszer v1 számára helyet foglal automatikusan, de v2 számára nem. v2 felügyelete teljes egészében a programozó dolga. BALTA!!! Jelen esetben v2-t rádefiniáltuk v1-re.
Például: MEM[$B800:I]:=Ord( * ); Memóriat riatömbök: A memória direkt elérésére a Pascal-ban az egész memóriát lefedő tömböket definiálhatunk: MEM [ Szegmens:Ofszet ] MEMW [ Szegmens:Ofszet ] MEML [ Szegmens:Ofszet ] A MEM tömb segítségével a memória egy adott címén található byte-ot írhatjuk illetve olvashatjuk. MEMW esetén a hivatkozás WORD típusú. MEML esetén a hivatkozás LONGINT típusú.
vége