Segmentarea de memorie în modul protejat

Segmentarea memoriei în modul protejat. Tag-uri. tabel descriptor.

Intr-un articol anterior, programul a fost pus în aplicare, ceea ce face trecerea la modul protejat pentru a verifica posibila funcționare în continuare în modul protejat și pune în aplicare o buclă simplă, cu instrucțiuni de 16 biți. Acum, sarcina programului următor - o tranziție de la modul protejat și utilizarea pentru instrucțiuni pe 32 de biți. Pentru a realiza acest lucru, ar trebui să se familiarizeze cu noile informații referitoare la modul protejat.


Figura 11. Selector Format

Biți 3-15 indică numărul de descriptori din tabelul de tag-uri selectate (un tabel doar de mai jos). Astfel, selectorul 213 poate descrie = 8192 descriptori un tabel. Fiecare tabel de segment descriptor descrie la ceea ce el nu trebuie să fie un segment de cod sau date (tipuri de segmente vor fi scrise mai jos).

Biți 0-1 conțin nivelul de privilegii solicitat (RPL - solicitat Privilege Level) segmentul de acces, care este, ce privilegii programul accesează descriptorul segmentului descris. Privilegii Despre Acces nelimitat vor fi discutate mai târziu, și atâta timp cât vom presupune ca acestea să fie egal cu zero (adică, cea mai mare).

Până în prezent, în exemplele noastre este suficient pentru a utiliza descriptor de segment. Luați în considerare structura descriptorului de segment:


Figura 12. Formatul descriptorului de segment

Acum, să ne ia în considerare mai detaliat descriptor de format.

Limita - deplasarea maximă de la începutul segmentului, și anume, limita este dimensiunea segmentului minus un octet. Astfel, se pare că dimensiunea minimă a segmentului poate fi setat la un octet, iar cea maximă - un megabyte sau patru gigaocteți (acest lucru depinde, că mărimea segmentului este multiplicat cu 4 kilobytes sau nu).

G - flag granularitate (Granularitate), care tocmai indică ce se măsoară prin mărimea segmentului, dacă G = 0, dimensiunea segmentului este considerat în octeți (adică, dimensiunea maximă a segmentului obținut 220 = 1 megabit) în cazul în care G = 1 , dimensiunea segmentului este considerat în 4 KB blocuri (pagini), adică, dimensiunea maximă a segmentului este de 220 * 212 = 4 GB, cu ea întotdeauna un multiplu al mărimii segmentului 4 kilobytes.

D / B - un indicator care indică dacă segmentul de bit: 0 - 16 biți segment 1 - segment de 32 de biți (acest indicator este, de asemenea, numit BIG).

Bit 53 este rezervat și va fi întotdeauna la zero.

AVL bit este liber (disponibil) și poate fi utilizată la discreția programului.

biți DPL defini privilegii de acces la segmentul (descriptorul Privelege Level). Există 4 nivele de acces, în cazul în care 0 - cea mai mare prioritate, 3 - cea mai mică prioritate. Astfel, a fost posibil să se utilizeze datele descriptor segment de program descrise în selectorul, biții de program utilizate RPL ar trebui să nu mai puțin important decât biți descriptor DPL. În caz contrar, există o eroare de hardware (întrerupere), numită excepție, care poate fi procesată de către nucleu.

pavilion S și tipul de segment ar trebui să fie luate în considerare împreună. Dacă S este setat, înseamnă că segmentul este sistemul (System), altfel aruncat steagul S indică faptul că descriptorul descrie un segment de date sau cod. În cazul în care un segment este un sistem, acesta indică tipul (a tipurilor de descriptori de sistem vor fi scrise mai târziu), într-un alt caz, descriptorul descrie un segment de date, un segment de cod.

Câmp „tip de segment“ pentru segmentul de date este după cum urmează:


Figura 13. Câmpul de date segment de „tip de segment“

Pentru câmpul segment de cod este un pic diferit:


Figura 14. Câmpul „de tip segment de“ segment de cod

Flag A este de asemenea utilizat pentru memoria virtuală, și este un pavilion de acces (accesat), adică, pentru orice referire la segmentul descris de pavilion va fi setat automat (adică, sistemul de biți de operare decide ce segmente ar trebui să fie temporar resetat la disc swap fișier . dar cu unele segmente ar trebui să aștepte). Aceasta este, sistemul de operare poate reseta periodic bitul, iar dacă după un timp devine egală cu una, atunci segmentul poate fi resetat, de exemplu, pe hard disk, eliberând memorie.

Două caracteristici determinate de segmentele de date flag:

D specifică direcția de creștere segment de pavilion (Direcție). În general, în cazul în care D = 1, segmentul selectat este un segment al stivei crește și „înapoi“. Dacă D = 0, segmentul selectat este un segment de date. De fapt, valoarea D = 1 este utilizat practic.

Flag W determină posibilitatea de a înregistra în segmentul (scriptibile). Aceasta este, steagul eliminat indică faptul că segmentul de date este read-only. Dacă indicatorul este setat, segmentul este de asemenea disponibil pentru înregistrare.

Următoarele două pavilion caracteristic determinat pentru segmentul de cod:

Bit C este un pic de subordonare (Conformarea), dar va fi considerat mai târziu.

Domenii P. DPL. S și ​​tipul de segment constituie un grup - permisiunile de acces la segmente, iar pentru operarea cu acest grup de instrucțiuni speciale CPU sunt introduse, care vor fi discutate mai târziu.

Acum, să ne discutăm structura de masă descriptor. tabele LDT (descriptorul Local de masă), IDT (Interrupt Descriptor Table) și GDT (Global Descriptor Table) au aceeași structură - sunt șiruri de descriptori. Tabelele în sine nu sunt segmente - aceasta este zona de memorie fizică. IDT distincții din GDT și LDT este că descriptorii specifici sunt stocate în ea că nu vom atinge. Singura diferență față de GDT LDT este că tabelul GDT poate fi doar una, iar LDT poate fi de multe. În plus, descriptor zero în tabelul GDT nu poate fi utilizat și ar trebui să conțină zerouri (numit un „descriptor de la zero“). Structura tabel este următoarea:


Figura 15. Structura tabelelor Descriptor

Luați în considerare o structură de date stocate în registre GDTR și IDTR:


Figura 16. Structura datelor registrelor GDTR și IDTR

Structura registrului LDTR este următoarea:


Figura 17. Structura de date Înregistrare LDTR

Dintre toate cele 10 octeți sunt disponibile pentru noi doar mai mici de doi octeți (biții 0-15), în care pentru a descărca LDT selectorul de masă descriptor. situat în tabelul GDT.

Registrele GDTR manipulau. LDTR. IDTR sunt enumerate în tabelul următor:

Tabelul 3. Comenzile registrelor segment de suprascriere implicit
suprascrie explicit registru de instrucțiuni sunt destinate funcționării în registrele DS. ES. FS. GS. SS. Pentru a încerca să schimbe segmentul de înregistrare CS. avem nevoie pentru a profita de comenzi implicite. Acum avem suficiente informații pentru a realiza performanța de cod pe 32 de biți. Dar va fi în problema următoare.