Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

<< Zpět

česky: , English:

MEMORY

Manažer paměti

V systému Litos8 sdílí aplikace i systém společný adresový prostor v prvních 64 KB paměti RAM (tj. všechny segmentové registry jsou nastaveny na 0). Jádro systému sídlí v horní polovině segmentu 64 KB (ve verzi 1.0 startuje jádro od adresy 7500h, rezidentní začátek je od adresy asi 8000h). Uživatelská aplikace se zavádí od adresy 1000h. Oblast paměti od 0 po asi 0600h je vyhrazena pro BIOS (včetně adres vektorů INT). Oblast od 0C00h po 1000h je rezervována pro adresy skoků do systémových funkcí (API). Ve zbylém prostoru 0600h až 0C00h leží implicitní zásobník.

Po startu je aplikaci přidělen paměťový blok podle údaje v hlavičce programu. Zbylý prostor je ponechán jako volný, dokud si o něj aplikace nezažádá. Paměť je systémem přidělována buď po násobcích 1 KB nebo (u paměťového bloku pod 1 KB) ve velikostech mocniny dvou: 8, 16, 32, 64, 128, 256 nebo 512 bajtů.

Při alokaci malých bloků jsou 1 KB stránky rozdělovány na segmenty o stejné velikosti. Např. si aplikace zažádá o 13 bajtů paměti. Systém nejdříve stanoví nejbližší vyšší modul velikosti mocniny dvou, tj. zaokrouhlí požadavek na 16 bajtů. Podívá se do tabulky volných 16bajtových bloků a když nemá žádný blok k dispozici, alokuje si nejdříve novou 1 KB stránku, tu rozdělí na 64 volných 16bajtových bloků a z nich aplikaci jeden přidělí.

Při uvolňování bloku převede systém nejdříve adresu bloku na číslo 1 KB stránky. Z tabulky zjistí modul velikosti bloků v této stránce - tj. např. 16 bajtů. Označí blok v tabulce 16bajtových bloků jako volný a sníží počítadlo alokovaných bloků v této 1 KB stránce. Pokud počítadlo dosáhne nuly, stránku 1 KB uvolní.


MemAlloc - allocate memory block

INTPUT:
AX = required size of memory block (0...)

OUTPUT:
AX = address of memory block (NC), or 0 (NULL) on error (CY)
CY = allocation error


MemFree - free memory block

INPUT:
AX = block address (can be NULL)

OUTPUT:
AX = block address, or 0 (NULL) if invalid memory block (CY)
CY = invalid memory block


MemResize - resize memory block

INTPUT:
AX = required new size of memory block (0 = delete block)
BX = address of memory block (NULL = create new block)

OUTPUT:
AX = new address of memory block (NC), or 0 (NULL) on error (CY)
CY = allocation error


MemDup - duplicate memory block

INTPUT:
BX = address of memory block (NULL = create new block)

OUTPUT:
AX = address of new memory block (NC) or 0 (NULL) on error (CY)
CY = allocation error


MemGetSize - get memory block size, check block address validity

INPUT:
AX = block address (can be NULL)

OUTPUT:
AX = block size (NC), or 0 if invalid memory block (CY)
CY = invalid memory block (AX = 0)


MemMaxFree - get maximum available memory block

OUTPUT:
AX = max. size of free memory space


MemGetFreeTotal - get total free memory

OUTPUT:
AX = total free memory (in bytes)


MemGetUsedTotal - get total used memory

OUTPUT:
AX = total used memory (in bytes)


GetSysMemSize - get size of system memory (640 KB)

OUTPUT:
AX = size of system memory (in KB)


Zdrojový kód MEMORY.ASM

<< Zpět