Atunci când gateway-ul de apel este utilizat pentru a transfera controlul către un segment de cod mai neconform, mai confortabil (atunci când neconformitatea DPL a segmentului de cod de destinație este mai mică decât CPL), procesorul trece automat la stivă pentru nivelul de privilegii al segmentului de destinație. Această comutare a stivelor se face pentru a împiedica restrângerea codului privilegiat din cauza spațiului insuficient de stivă în procedura utilizatorului. De asemenea, protejează procedurile privilegiate de impactul posibil (accidental sau intenționat) al codului mai puțin privilegiat prin coșul partajat.
Fiecare sarcină este de a defini până la 4 stive: una pentru codul aplicației (care funcționează la nivel de privilegii 3) și unul pentru fiecare dintre celelalte nivel 2, 1 și 0. Dacă se utilizează numai două nivele de privilegiu, atunci cele două stive 3 și 0 trebuie determinate . Fiecare stiva se află într-un segment separat și este identificată de un selector de segmente și de un indicator de stivă.
Selectorul de segmente și indicatorul stack pentru nivelul de privilegii de nivel 3 se află în registrele SS și ESP atunci când execută codul la nivelul de privilegii 3 și sunt stocate automat în stackul procedurii de apelare atunci când stivuirea este schimbată.
Indicatorii pentru nivelurile privilegiilor 0, 1 și 2 sunt stocați în TSS pentru sarcina curentă (a se vedea Figura 7-2).
(Figura din manualul Intel)
Fiecare dintre acești indicatori este alcătuit dintr-un selector de segmente și un pointer de stivă (încărcat în registrul ESP). Indicatorii inițiali sunt valori numai pentru citire. Procesorul nu le modifică atunci când sarcina este executată. Acestea sunt folosite numai pentru a crea stive noi pentru apeluri către segmente mai privilegiate. Aceste stive sunt eliminate (șterse) la revenirea din procedura chemată. La următorul apel, se creează un nou teanc folosind indicatorul inițial de stack. TSS nu definește o stivă pentru nivelul de privilegii 3, deoarece procesorul nu permite transferul controlului de la proceduri care rulează la niveluri de privilegii 0, 1, 2 pentru a privilegia nivelul 3 în alt mod decât returnarea.
Sistemul de operare este responsabil pentru crearea de stive și descriptori de segment de stive pentru toate nivelurile de privilegii utilizate și pentru încărcarea indicatoarelor de start către aceste stive din TSS. Fiecare stiva trebuie să fie citită / scriabilă (aceasta ar trebui permisă în câmpul de tip din descriptorul de segment) și trebuie să ofere spațiu suficient (definit de câmpul limită) pentru a stoca următoarele entități:
- Conținutul înregistrărilor SS, ESP, CS și EIP ale procedurii de apelare
- Parametrii și variabilele temporare necesare pentru procedura apelată
- Registrul flags este EFLAGS și codul de eroare, cu un apel implicit explicit al unui handler de întrerupere sau de excepție.
Un stack necesită mult spațiu pentru a stoca un număr mare de cadre de acest tip, deoarece procedurile determină adesea alte proceduri, sistemul de operare poate suporta cuiburile de întreruperi multiple. Fiecare stiva ar trebui să ofere suficient spațiu pentru stocarea datelor în scenariul cel mai defavorabil pentru un anumit nivel de privilegii. (Chiar dacă sistemul de operare nu utilizează mecanismul de multitasking hardware, acesta trebuie să creeze cel puțin un TS pentru a controla comutarea stack-urilor). Atunci când o procedură de apel prin intermediul gateway-ului de apel are ca rezultat o schimbare de nivel de privilegiu, procesorul efectuează următorii pași pentru a comuta stivele și începe executarea procedurii chemate cu un nou nivel de privilegii.
- Utilizează segmentul de cod de destinație DPL (noul CPL) pentru a selecta un indicator la noul stiva (selector de segmente și pointer stack) din TSS.
- Citește selectorul de segmente și indicatorul stack pentru stiva la care doriți să treceți de la actualul TSS. Orice încălcare a limitelor detectate la citirea selectorului segmentului de stivă, a indicatorului de stivă sau a descriptorului segmentului de stivă are ca rezultat o excepție TSS (#TS) nevalidă.
- Verifică mânerul segmentului de stivă pentru tipul de potrivire și nivel de privilegii și generează o excepție TSS (#TS) nevalid atunci când sunt detectate încălcări.
- Stochează temporar registrele SS și ESP actuale.
- Încarcă noile valori ale selectorului de segmente și ale indicatorului de stivă în SS și EIP.
- Plasează valorile temporar stocate pentru registrele SS și EIP (pentru procedura de apelare) din noul stiva (a se vedea Figura 5-13).
- Copiază numărul de parametri specificați de câmpul parametru al gateway-ului de apel din stack-ul apelantului către stiva nouă. Dacă numărul este zero, parametrii nu sunt copiați.
- Pune indicatorul de instrucțiuni (valorile curente ale registrelor CS și EIP) în noul teanc.
- Încarcă selectorul de segment pentru noul segment de cod și noul indicator de instrucțiuni EIP de la gateway-ul de apel la registrele CS, EIP și începe executarea procedurii chemate.
Cm. Descriere instrucțiuni CALL în capitolul 3 din Manualul documentului (Instruction Set de referință) în Manualul IA-32 Intel Architecture Software Developer, volumul 2 pentru o descriere detaliată a nivelurilor privilegiul de control și alte controale de securitate, atunci când sunt executate de către procesorul în continuare apela prin poarta de apel.
(Ilustrație din manualul Intel)
Câmpul de numărare a parametrilor de la gateway-ul de apel determină numărul de unități de date (până la 31) pe care procesorul trebuie să le copieze din stiva procedurii de apelare în teancul procedurii chemate. Dacă sunt necesare mai mult de 31 de elemente, unul dintre parametri poate fi un pointer la o structură de date sau valori stocate SS, registrele ESP pot fi folosite pentru a accesa parametrii din "stack-ul vechi". Dimensiunea unităților de date transferate procedurii numite depinde de dimensiunea gateway-ului de apel (așa cum este descris în secțiunea 5.8.3, "Gateway-uri de apel").