LOCK |
RD |
C74 |
0040F700 ' |
] deskryptor stosu zadania. Był już |
LOCK |
RD |
C70 |
94000000 |
podczytywany w trakcie przełączania zadań |
LOCK |
WR |
C74 |
-----F700 |
(dlatego bit A=l) ale potem na jego miejsce do ukrytych rejestrów skojarzonych z SS wpisano dane stosu poziomu zerowego (dla procedury z “obsługą wyjątku) |
Realizacja instrukcji IRET zajęłą 13 cykli magistrali, znacznie więcej niż 3 cykle w trybie rzeczywistym. Nie jest to jednak wcale dużo - dalej pokazane będzie wykonanie rozkazu IRET przy powrocie z zadania do zadania gdzie liczba cykli zbliża się do 100.
Poniżej zademonstrowane zostanie wywołanie procedury (w obrębie zadania) połączone ze zmianą poziomu przywilejowania oraz z przekazaniem parametrów przez stos. Wywołując w trybie wirtualnym procedurę możemy stosować metodę - bezpośrednią pośrednią
poziom
bieżący
CPLi
GDT (LDT) |
wg^ | ||||
K.O. | |||||
przesuń- |
baza |
limit |
atrybuty |
w | |
ięciei |
DPLc, |
proce- | |||
selektor ) |
deskryptor segmentu |
durę | |||
kodu |
CPLz |
przesunięcie i
Dla metody bezpośredniej selektor w rozkazie wywołania międzysegmentowego wskazuje wprost na segment kodu. W tym przypadku przesunięcie (stan EIP) odczytujemy wprost z instrukcji oraz nie może zachodzić zmiana poziomu uprzywilejowania.
baza
__ ' ~' li _|S
CALL k.O. l-'" A we Drzesu- musi
zachodzić phmit DPLc=CPLi DPLc>CPL2
Dla metody pośredniej selektor w rozkazie wywołania międzysegmentowego wskazuje wpierw na deskryptor systemowy bramy wywołania. Zawarty tam nowy selektor odnosi się do docelowego segmentu kodu. Przesunięcie w rozkazie jest ignorowane - up korzysta z przesunięcia w deskryptorze bramy wywołania. Prawa dostępu do deskryptora bramy wywołania są identyczne jak przy dostępie do danych a priorytet nowego poziomu bieżącego nie może ulec obniżeniu.
deskryptor
bramy
wywołania
deskryptor
segmentu
kodu
we w procedurę (CPL2)
musi
zachodzić
DPLc <CPL, DPLg> CPL2