Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
MS-DOS gestioneaza memoria pentru a asigura ca toate programele au acces la memoria necesara pentru o executie normala. Sistemul aloca memorie pentru un program in timpul incarcarii, iar acesta poate aloca la randul lui cantitati de memorie pe masura ce are nevoie de ele sau poate elibera orice cantitate de memorie pe care nu o mai foloseste.
Programele aloca memorie conventionala (adresele 0000:0000 ÷ A000:0000) prin folosirea functiei sistem de alocare a memoriei (Functia 48h). Aceasta functie cauta dupa un bloc de memorie cel putin atat de mare cat blocul cerut si intoarce adresa de segment al noului bloc. Deoarece la incarcarea unui program MS-DOS poate aloca toata memoria conventionala disponibila, functia de alocare a memoriei poate intoarce o valoare de eroare 0008h (ERROR_NOT_ENOUGH_MEMORY). In acest caz registrul BX va contine dimensiunea celui mai mare bloc disponibil, in paragrafe.
Daca un program nu mai are nevoie de memoria pe care a alocat-o, el poate elibera memoria folosind functia de eliberare a memoriei alocate (Functia 49h). Dupa ce a fost eliberata, memoria devine disponibila, astfel incat ea poate fi alocata din nou, de acelasi program sau altul. Un program isi poate largi sau micsora cantitatea de memorie dintr-un bloc la un numar specificat de paragrafe, folosind functia modifica dimensiunea unui bloc de memorie (Functia 4Ah).
Un program care lanseaza in executie un alt program (numit program fiu) de obicei foloseste functia de modificare a dimensiunii unui bloc de memorie, pentru a-si reduce propria dimensiune, facand astfel disponibila mai multa memorie pentru programul fiu. In astfel de cazuri, programul parinte transmite functiei adresa de segment al PSP-ului sau, impreuna cu noua dimensiune. Programul parinte NU trebuie sa elibereze memoria care contine propriul sau cod, date si stiva, altfel alocari succesive ar putea distruge continutul acelei memorii. Pentru a inlatura aceasta situatie, unele programe isi copiaza codul si datele pe disc si elibereaza toata memoria, cu exceptia memoriei corespunzatoare unei rutine mici, care va reloca memoria si va reancarca de pe disc codul si datele, cand va fi nevoie din nou de acestea.
Strategia curenta de alocare, stabilita prin functia de setare a strategiei de alocare (Functia 5801h), determina modul cum functia de alocare a memoriei va cauta pentru un bloc de memorie. Cautarea poate incepe sau de la inceputul sau de la sfarsitul memoriei conventionale si sfarseste la gasirea primului bloc care satisface cerintele sau, daca nu exista nici un bloc disponoibil, se intoarce blocul cel mai apropiat. Tot strategia de alocare determina daca functia va cauta in memoria conventionala sau in zona superioara a memoriei (UMB). Un program poate determina strategia curenta de alocare prin folosirea functiei de citire a strategiei de alocare (Functia 5800h).
Obs.: Daca un program schimba strategia de alocare, el ar trebui sa salveze strategia originala si sa o restaureze inainte de terminare.
Un bloc din memoria superioara (UMB) este o zona RAM din memoria superioara care este disponibila programelor. Zona de memorie superioara (adresele A000:0000 ÷ FFFF:0000) este rezervata in principal pentru memorii ROM si dispozitive mapate in memorie, dar MS-DOS poate mapa RAM la orice adresa din aceasta zona, care nu este utilizata de ROM sau alte dispozitive.
Un program poate aloca un bloc de memorie superioara utilizand functia de alocare a memoriei. Inainte de a aloca memorie, trebuie ca programul sa seteze o strategie de alocare potrivita si sa faca legatura cu zona de memorie superioara. Ca si la memoria conventionala, un program foloseste pentru functia de stabilire a strategiei de alocare functia 5801h. O strategie de alocare ca de exemplu FIRST_FIT_HIGH (0080h) determina ca functia de alocare sa caute memoria superioara si sa continue cu cautarea in memoria conventionala, daca nu a gasit bloc disponibil.
Functia de alocare nu poate cauta in memoria superioara doar daca aceasta este legata de restul memoriei sistem. Un program poate stabili legarea memoriei superioare prin folosirea functiei de stabilire a legaturii cu memoria superioara (5803h), sau poate determina daca aceasta legatura exista folosind citirea starii legaturii cu memoria superioara (Functia 5802h).
Obs. Daca un program schimba legatura cu memoria superioara el ar trebui sa salveze starea anterioara si sa o refaca inainte de terminare.
Un program poate utiliza functia de eliberare a memoriei si pentru eliberarea blocurilor din memoria superioara. Deasemenea poate utiliza si functia de redimensionare a blocurilor pentru a reduce sau mari dimensiunea blocului alocat.
Daca un program a fost lansat folosind comanda LOADHIGH, sistemul incarca acel program in memorie alocata din zona de memorie superioara. Desi un program poate fi in memoria superioara, memoria pe care o aloca depinde de strategia de alocare.
Blocurile de memorie superioara nu sunt accesibile prin functii MS-DOS doar daca comanda dos = umb este inclusa in fisierul CONFIG.SYS si driverul HIMEM.SYS si software-ul de gestionare a memoriei, de ex. EMM386.EXE sunt incarcate. Daca dos = umb nu este specificat in CONFIG.SYS, dar software-ul de gestionarea memoriei este incarcat, programele pot accesa zona de memorie suprioara folosind apeluri directe la software-ul de gestionare a memoriei.
MS-DOS-ul tine evidenta blocurilor de memorie prin crearea unei liste inlantuite de structuri ARENA, care definesc dimensiunea si proprietarul blocurilor de memorie.
Structura ARENA are urmatoarea componenta:
ARENA STRUC
arenaSignature db ? ;4dh=valid, 5ah=ultim
arenaOwner dw ? ;proprietarul acestui bloc
arenaSize dw ? ;dimensiunea blocului in paragrafe
arenaReserved db 3 dup(?) ;rezervat
arenaName db 8 dup(?) ;numele de fisier al proprietarului
ARENA ENDS
La incarcare MS-DOS-ul creaza astfel de structuri pentru memoria disponibila. El creaza alte astfel de structuri pe masura ce este nevoie de ele, cand incarca programe si drivere sau cand programele aloca memorie. Numarul, dimensiunea si pozitia structurilor ARENA depind de dimensiunea blocurilor de memorie alocate.
Programele trebuie sa aiba grija sa nu altereze structurile ARENA. MS-DOS-ul nu poate reface structurile pe care programele le-au suprascris sau le-au modificat. Daca o structura ARENA a fost alterata, functiile ca alocare de memorie si eliberare de memorie esueaza, dand ca si cod de eroare valoarea 0007h (ERROR_ARENA_TRASHED).
Campurile structura ARENA :
arenaSignature |
- specifica daca structura este valida. Acest camp trebuie sa contina 4Dh sau 5Ah. Valoarea 5Ah indica faptul ca structura este ultima din lista. |
arenaOwner |
- specifica proprietarul blocului. Acest camp contine adresa de segment al PSP-ului programului proprietar. Contine zero daca blocul este liber. |
arenaSize |
- specifica dimensiunea blocului, in paragrafe. Blocul incepe imediat dupa structura ARENA. |
arenaReserved |
- rezervat |
arenaName |
- contine un sir terminat cu 0, specificand numele fisierului programului care detine blocul. Nume ca SC si SD sunt utilizate de MS-DOS pentru a reprezenta cod sistem (programe) respectiv date sistem. |
Tabelul 5.3-
Comentarii :
Fiecare structra ARENA este urmata imediat de un bloc continuu de memorie. Urmatoarea structura ARENA din lista este in continuarea respectivului bloc. Aceasta inseamna ca adresa segment a urmatoarei structuri din lista este egala cu adresa de segment a blocului de memorie curent plus dimensiunea sa.
MS-DOS-ul completeaza campul arenaName pentru un bloc cand incarca un program in acest bloc. Structurile ARENA pentru memoria alocata de programe prin functia de alocare nu sunt completate in acelasi fel.
Pentru calculatoarele bazate pe procesoare 80286, 80386 si mai recente, cea de-a 21 linie de adresa a procesorului (A20) controleaza accesul la un spatiu suplimentar de 64K, numit zona de memorie inalta (HMA). Producatorii de calculatoare de obicei includ un circuit pentru a dezactiva linia A20 cand procesorul ruleaza in mod real. Acesta asigura ca mediul de operare sa fie identic cu acela al unui 8086, in care adresele ca si FFFF:0010 se suprapun peste inceputul memoriei. Cand linia A20 este activa, adresele care s-ar repeta (adresele in intervalul FFFF:0010 ÷ FFFF:FFFF) asigura accesul la HMA.
Daca un calculator ofera suport RAM pentru HMA, atunci MS-DOS poate activa linia A20 si sa realoce codul sistem in HMA, astfel eliberand memoria conventionala pentru alte programe. MS-DOS-ul se relocateaza in HMA doar daca comanda dos=high este in CONFIG.SYS iar HIMEM.SYS este incarcat. Acest driver contine codul care permite activarea si dezactivarea liniei A20.
Pentru a suporta programele care se asteapta ca adresele sa se repete, MS-DOS-ul dezactiveaza linia A20 intotdeauna cand incarca si executa un program. In timp ce linia A20 este dezactivata, partea MS-DOS din HMA nu este accesibila direct, desi programele pot totusi sa apeleze functii sistem MS-DOS. Pentru a realiza acest lucru, MS-DOS-ul redirecteaza toate apelurile sistem la un "stub" din memoria conventionala, care activeaza linia A20 si face salt la functia MS-DOS solicitata. Odata activata, linia A20 ramine activata chiar dupa ce se revine din apelul functiei sistem.
Programele nu trebuie sa foloseasca HMA daca MS-DOS-ul a fost realocat aici. Un program poate determina daca MS-DOS-ul este sau nu in HMA folosind functia care intoarce versiunea MS-DOS-ului. Aceasta functie seteaza bitul 4 din registrul DH daca MS-DOS-ul este in HMA.
Copyright © 2024 - Toate drepturile rezervate