Lucrarea
nr. 10
Utilizarea microprocesorului în modul
protejat (I)
Modul protejat
Structura unui descriptor de
segmente
Utilizarea modului protejat
la 286
Tema de laborator
Modul protejat
În modul de adresare protejat conținutul registrului segment reprezintă
un index într-o tabelă a descriptorilor de segmente; fiecare descriptor
de segment conține o serie de informații referitoare la segment, inclusiv
adresa de bază a segmentului. Adresa de bază a segmentului se adună cu
valoarea adresei efective a deplasamentului în cadrul segmentului rezultând
o adresă liniară reprezentată pe 24 de biți (la 286). Adresa fizică poate
fi egală cu adresa liniară sau pentru determinarea ei se poate folosi un
mecanism opțional de paginare (de la 386 în sus).
Cei 16 biți ai unui registru segment sunt împărțiți în trei zone:
-
biții 0 și 1 definesc nevelul de privilegiu cerut de programul curent pentru
accesul la segment. Nivelul cel mai privilegiat este 0;
-
bitul 2 precizează la care tabelă a descriptorilor se face referire: tabelul
descriptorilor globali sau tabelul descriptorilor locali;
-
biții 3-15 conțin indexul în tabelul descriptorilor de segmente.
Figura 10.1
Intrarea numărul zero din tabela descriptorilor globali corespunde selectorului
nul (0000h).
Fiecare program care rulează în modul protejat poate folosi segmente
aflate într-un spațiu de adrese virtuale de forma selector:offset.
Structura
unui descriptor de segmente (286)
Procesorul 286
Figura 10.2
Limita |
dimensiunea segmentului |
Baza |
adresa de bază a segmentului |
P |
1 - segmentul este prezent în memorie
0 - segmentul nu este prezent în memorie |
DPL |
nivelul de privilegiu al descriptorului |
T |
1 - descriptorii segmentelor programelor aplicație
0 - pentru descriptorii folosiți de sistem și pentru cei de tip poartă |
Tip (pentru T = 1) |
Bitul 11 |
0 - segment de date
1 - segment de cod |
Bitul 10 |
0 - segment de date - crește spre adrese mari
0 - segment de cod - segment obișnuit
1 - segment de date - crește spre adrese mici
1 - segment de cod - segment conform |
Bitul 9 |
0 - segment de date - nemodificabil
0 - segment de cod - se permite doar execuția
1 - segment de date - modificabil
1 - segment de cod - se permite și citirea |
Bitul 8 |
0 - segmentul nu a fost accesat
1 - segmentul a fost accesat |
|
Tabelul 10.1
Utilizarea modului protejat la 286
Trecerea din modul real în modul protejat
Pentru a trece procesorul în modul protejat se parcurg următoarele etape:
-
construirea tabelelor descriptorilor de segmente:
-
definirea unui tip struct
segdesc STRUC
limita dw 0
bazal dw 0
bazah db 0
acces db 0
dw 0
segdesc ENDS
declararea tabelei descriptorilor
GDT1 segdesc < lung_tabela, , , acces_date, > ; descriptor nul
GDT2 segdesc < lung_cod, , , acces_cod, > ; descriptor segment cod
...
completarea câmpurilor din tabelă.
-
încărcarea adreselor acestor tabele în registrele special destinate ale
procesorului:
lgdt tabela ; incarca registrul GDTR cu adresa si
; lungimea tabelei descriptorilor globali
lldt tabela ; incarca registrul LDTR cu adresa si
; lungimea tabelei descriptorilor locali
-
se trece în modul protejat prin setarea bitului 0 din registrul CR0:
lmsw AX
-
prima instrucțiune din modul protejat trebui să fie jmpfar seg, off pentru
a goli coada de instrucțiuni și pentru a încărca în CS un descriptor corect
de segment.
jmpfar MACRO seg, off
db 0eah
dw offset off
dw seg
ENDM
-
se inițializează registrele segment.
Trecerea din modul protejat în modul real
La procesoarele 286 ieșirea din modul protejat se face prin resetarea
procesorului. Pentru aceasta se urmează următorii pași, folosindu-se facilitatea
de inițializare și salt FAR indirect prin 0040H:0067h:
-
încarcă adresa de revenire într-o variabilă BIOS aflată la adresa 0040h:0067h;
-
stabilește modul de inițializare al sistemului (registrul 0fh din CMOS):
mov al, 0fh
out 70h, al
mov al, 5
out 71h, al
-
trecerea in modul protejat
-
executie im mod protejat
-
reset soft:
mov al, 0feh
out 64h, al
-
sterg cele doua controller-e de intreruperi
out 21h, 0
out 0a1h, 0
-
activez intreruperile
Tema de laborator
Să se implementeze un program ce trece procesorul
în modul protejat, afișează un text pe ecran scriind direct în memoria
video și apoi se iese din modul protejat.