Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




FAMILIA iAPX 286 (Intel)

Informatica


FAMILIA iAPX 286 (Intel)

5.1. Introducere



iAPX 286 este un microprocesor produs de firma Intel si destinat aplicatiilor de mare compexitate, unor statii de lucru puternice, ca si conducerii evoluate a sistemelor functionind in timp real. iAPX 286 ofera facilitati neintilnite la predecesorii sai (iAPX 86/88 si iAPX 186/188). Din noile mecanisme sint de remarcat cele care, bazate pe hardware sau microprogramare, permit gestiunea memoriei virtuale prin utilizarea tehnicii de swapping, implementeaza medii protejate de executie sau permit gestiunea taskurilor in sistemele cu multiprogramare.

Proiectarea microprocesorului este complet diferita de cea a CPU anterioare. Pentru asigurarea compatibilitatii cu modelele anterioare iAPX 286 are doua moduri de operare: modul de lucru cu adrese reale, care face din iAPX 286 un super iAPX86 sau iAPX 186, si un mod de lucru protejat,care foloseste toate caracteristicile specifice sistemului iAPX 286.

Mecanismele de gestiune a memoriei constituie o parte majora a noilor trasaturi caracteristice ale microprocesorului studiat, permitind gestiunea prin swapping a memoriei virtuale, precum si implementarea de teste de memorie. Spre deosebire de alte microprocesoare din aceeasi generatie, MMU este implementata in acelasi circuit integrat cu CPU, lucru posibil ca urmare a filosofiei adoptate pentru gestiunea memoriei.

Principala problema in gestiunea memoriei consta in alocarea de descriptori de segment sau de pagina, care sa permita conversia eficienta de adresa si fara limitarea numarului de descriptori. Dezideratul devine realitate in cazul iAPX 286, deoarece gestiunea descriptorilor de segment este efectuata prin mecanisme ce nu sint complet invizibile programatorului. Gestiunea memoriei se face in interiorul circuitului CPU, asa ca sint utilizate registre pentru pastrarea descriptorilor celor patru segmente: de cod, de date, de stiva, pentru date suplimentare. Deci, cind apare necesitatea comutarii segmentului, are loc reincarcarea registrului asociat.

Acest mod de abordare poate conduce la performante ale sistemului egale sau superioare celor in care programatorulului ii este inaccesibil mecanismul de gestiune a memoriei. Pe de alta parte, el introduce distinctie - la nivelul programatorului - intre referirile in interiorul si cele in exteriorul segmentului, fapt ce ar putea afecta reutilizarea sistemelor de programe de mari dimensiuni.

O alta caracteristica a sistemului iAPX 286 o constituie setul extins de teste implementate prin hardware, avind ca obiectiv corectitudinea accesului la memorie. Mecanismele de baza de protectie folosesc testarea limitei segmentului, precum si separarea intre spatiul alocat taskurilor si cel asociat starilor privilegiate ale masinii. De asemenea, mecanismele de protectie utilizate verifica validitatea indicatorilor, ca si corectitudinea operatiilor de apelare/revenire a subrutinelor.

Circuitele necesare realizarii unui puternic sistem de prelucrare sint 80286 (care include, cum s-a aratat, si partea de gestiune a memoriei) si 80287, coprocesorul matematic.

Arhitectura CPU

5.2.1. Organizarea interna

Unitatea centrala de prelucrare a sistemului iAPX 286 este circuitul 80286, avind schema bloc din figura 5.1. Ea consta din patru blocuri principale: unitatea de magistrala (BU-bus unit), unitatea instructiunii (IU-instrction unit), unitatea de executie (EU-execution unit), si unitatea adresei (AU-address unit). Una din caracteristicile majore ale CPU consta in utilizarea unui tampon de tip stiva FIFO intre unitatea instructiunii si cea de executie sau a adresei. Acest fapt duce la cresterea vitezei de executie a unei secvente de instructiuni stocate in locatii succesive de memorie, deoarece permite suprapunerea extragerii, decodificarii si executiei instructiunilor.

Tamponul de pre-extragere (prefetch queue) intre unitatea magistralei si cea a instructiunii poate contine pina la 6 octeti din adresele de memorie imediat urmatoare celei ce contine instructiunea curenta. Unitatea instructiunii decodifica instructiunea si plaseaza rezultatul in tamponul instructiunilor decodificate, care poate contine trei astfel de instructiuni. Unitatea de executie prelucreaza operanzii in concordanta cu instructiunea decodificata extrasa din tamponul instructiunilor decodificate si calculeaza adresele virtuale ale operanzilor, care, ulterior, vor fi convertite in adrese fizice de catre unitatea adresei. Aceasta reprezinta o veritabila unitate de gestiune a memoriei (MMU), implementata pe aceeasi placheta de siliciu cu CPU, fapt ce conduce la cresterea vitezei de operare prin evitarea intirzierilor de transmisie intre circuitele integrate. Pe de alta parte, aria limitata pe care proiectantul a avut-o la dispozitie limiteaza unele din functiile ce pot fi efectuate.

Fig. 5.1. Schema bloc a unitatii centrale de prelucrare a microprocesorului 80286.

5.2.2. Semnale ale CPU

Capsula microprocesorului 80826 comunica cu lumea exterioara prin intermediul celor 63 pini ai capsulei. 6 sint destinati alimentarilor, iar 57 sint dedicati unor semnale, dupa cum se va detalia in continuare.

D0-D15

Aceste semnale sint semnalele magistralei de date, prin care CPU primeste date la citirea din memorie, la citirea din porturi de intrare si pe durata ciclurilor de confirmare a acceptarii cererilor de intreruperi. Aceleasi linii sint iesiri ale CPU, folosite de aceasta pentru transmiterea datelor la inscrierea in memorie si la inscrierea in porturi de iesire. Datele ce se transfera pot fi sub forma de cuvinte de 8 biti sau de 16 biti. Datele de 8 biti pot fi vehiculate atit pe D0-D7, cit si pe D8-D15, dupa cum adresa octetului este para sau impara.

A0-A23

Aceste semnale de iesire din CPU constituie informatiile vehiculate pe magistrale de adrese. Ele contin adresa fizica a locatiei de memorie sau a portului I/O. Sistemul poate adresa 64K porturi, asa ca doar liniile A0-A15 sint folosite in conjunctie cu porturile.

BHE

Semnalul BHE (bus high enable) este folosit pentru a se putea face discriminarea intre adresarea unui octet de la o adresa para (incarecaz A0 = 0 si BHE = 0). Deci, asa cum numele sugereaza, activarea semnalului BHE (BHE = 0) indica efectuarea unui transfer de date pe liniile D8-D15.

M/IO

Semnalul indica tipul de transfer de date: in conjunctie cu memoria cind M/IO = 1, sau in conjunctie cu un port de intrare/iesire, cind M/IO = 0.

COD/INTA

Semnalul COD/INTA permite deosebirea unei operatii de extragere din memorie a codului instructiunii de o operatie de citire din memorie a datelor. De asemenea, el permite discriminarea intre ciclul de confirmare a accepterii cererii de intrerupere si citirea dintr-un port de intrare.

S0-S1

Aceste semnale (S sugereaza stare), folosite in conjunctie cu M/IO si COD/INTA, permit identificarea tipului de ciclu de magistrala efectuat. Detaliile sint date in tabelul 5.1.

LOCK

Semnalul LOCK indica efectuarea de catre CPU a unei operatii indivizibile, asa cum este aceea destinata excluderii mutuale (a se vedea cap.3). Cind LOCK=0 (semnal activ) nici un alt dispozitiv nu poate efectua un ciclu pe magistrala locala sau comuna (in cazul sistemelor multiprocesor). LOCK este activat de executia instructiunii XCHG sau cind se executa o instructiune indivizibila care a fost prefixata intr-un mod adecvat (asupra acestor probleme se va reveni).

READY

Semnalul informeaza CPU ca locatia de memorie sau portul adresate sint gata de a efectua transferul de date. Cind READY=1 microprocesorul asteapta terminarea regimului tranzitoriu al elementului adresat. In felul acesta, 80286 poate lucra, fara modificari hardware, cu circuite de memorie sau periferice de diferite viteze.

Tabelul 5.1. Codificarea semnalelor de comanda.

COD/INTA M/IO S1 S0 Tip de ciclu magistrala

0 0 0 0 Confirmare cereri intrerupere

0 0 0 1 Rezervat

0 0 1 0 Rezervat

0 0 1 1 In repaus

0 1 0 0 Daca A1=1 atunci halt. Altfel:oprire

(shut down)

0 1 0 1 Citire de date din memorie

0 1 1 0 Inscriere de date in memorie

0 1 1 1 In repaus

1 0 0 0 Rezervat

1 0 0 0 Citire din port de intrare

1 0 1 0 Inscriere in post de iesire

1 0 1 0 In repaus

1 1 0 0 Rezervat

1 1 0 1 Citire cod instructiune

1 1 1 0 Rezervat

1 1 1 1 In repaus

Nota: In repaus - ciclu inexistent; magistrala pasiva

Rezervat -ciclu masina rezervat pentru variante ulterioare

HOLD, HLDA

Aceste semnale permit implementarea unui protocol simplu de transfer si reprimire de catre CPU ale controlului asupra magistralei locale unui/de la un alt posibil master. Cind HOLD = 1 microprocesorul termina ciclul masina in curs de desfasurare si acorda accesul la magistrala solicitantului, fapt confirmat de activarea semnalului de confirmare HLDA. Atita timp cit HOLD este activ, noul master emite semnale de comanda pe magistrala. Cind acesta si-a terminat activitatea, trece semnalul HOLD in starea inactiva (HOLD = 0) si microprocesorul preia controlul asupra magistralei, dezactivind confirmarea HLDA.

INTR

Semnalul de intrare INTR este folosit pentru semnalarea unei cereri de intrerupere mascabila. Cum intrarea este unica, pe durata ciclului de confirmare a acceptarii cererii de intrerupere microprocesorul primeste pe magistrala de date un identificator de 8 biti, furnizind informatii asupra sursei intreruperii.

NMI

Linia NMI este folosita pentru formularea catre microprocesor a cererilor de intreruperi nemascabile. Existind o unica intrerupere nemascabila, nu mai este necesar un identificator.

PEREQ si PERACK

Aceasta pereche de semnale extinde mecanismele de gestiune si protectie ale memoriei si asupra transferurilor de date efectuate de catre coprocesorul matematic. Activarea semnalului PEREQ indica unitatii centrale de prelucrare ca se solicita un transfer de date pentru coprocesor. PERACK informeaza coprocesorul ca are loc transferul operandului solicitat. Aceasta problema se va relua intr-un paragraf ulterior.

BUSY si ERROR

Si aceasta pereche de semnale este folosita pentru dialogul intre CPU si coprocesor. Starea activa a semnalului BUSY arata ca operatia ceruta coprocesorului se afla in curs de desfasurare. In consecinta, BUSY = 0 stopeaza activitatile CPU cind se executa o instructiune WAIT; activitatile se reiau cind BUSY devine 1. Starea activa a semnalului ERROR activeaza o intrerupere speciala care informeaza CPU despre detectarea unei erori pe durata executarii de catre coprocesor a unei operatii.

RESET

Intrarea reset anuleaza toate operatiile CPU si il repune intr-o stare initiala bine determinata, ceea ce permite repornirea ordonata a sistemului de programe la fiecare noua punere sub tensiune sau dupa revenirea dintr-o eroare fatala de sistem.

CLOCK

Semnalul de intrare CLOCK furnizeaza marcajul de timp cerut de secventierea functionarii microprocesorului.

5.2.3. Organizarea memoriei.

Memoria principala a sistemului iAPX 286 consta din unitati adresabile de 8 biti (octeti). Spatiul maxim de memorie adresabila de catre un programator este dependent de modul de lucru: in modul de lucru cu adrese reale el este de 220 octeti,in timp ce in modul de lucru protejat spatiul de adrese vizibil programatorului este de 230 octeti. Trebuie remarcat faptul ca, in modul de lucru protejat, memoria fizica adresabila de catre CPU este de doar 16 Mocteti (224), deoarece doar 24 pini ai circuitului sint dedicati semnalelor de adresa. Memoria fizica principala poate fi extinsa la 32 Mocteti daca se folosesc semnalele destinate pentru realizarea unui decodificator ce permite implementarea de spatii fizice separat pentru date si adrese. Fata de acestea, spatiul de adresare de un gigaoctet al modului de lucru protejat trebuie privit ca spatiu virtual de adrese; intrucit diferiti programatori pot folosi acelasi spatiu virtual pentru diferite programe, mecanismele folosite de catre iAPX 286 pentru conversia adreselor virtuale in adrese fizice pot oferi diverse spatii de memorie, cite unul pentru fiecare programator din sistem.

Adresarea memoriei este bazata pe conceptul de segmentare, intregulspatiu de adresare fiind compus din segmente a caror lungime variaza intre 1 koctet si 64 kocteti. Numarul maxim permis de segmente este de 16 in modul real si de 16 K (214) in modul protejat.

5.3. Principalele tipuri de date

Structurile de date de baza in sistemul iAPX 286 sint octetul (8 biti) si cuvintul (16 biti). Ele pot fi citite sau inscrise intr-un singur ciclu. Mai multe instructiuni pot manipula si date cu numar de biti mai mare de 16. Tipurile de date direct manipulate de catre iAPX 286 sint:

- intregi cu semn, de 8 sau 16 biti. Numerele negative sint reprezentate in complement fata de 2. Cind se foloseste coprocesorul matematic, lor li se adauga intregii cu semn pe 32 si 64 biti; -intregi fara semn, de 8 sau 16 biti. Toti bitii participa la reprezentarea marimii numarului;

-indicator (pointer): numere pe 32 biti indicind o adresa. Ei sint compusi din doua entitati de 16 biti: un selector, care defineste numarul segmentului, si un offset, indicind deplasamentul in cadrul segmentului;

-siruri: secvente contigue de octeti, cu lungimea de la un octet la 64 kocteti;

-octeti ASCII: octeti continind codul ASCII al unui caracter;

-BCD neimpachetat: octeti reprezentind o singura cifra zecimala;

-BCD impachetat: octeti in care se memoreaza doua cifre zecimale, fiecare in cite un spatiu de 4 biti;

-formatul cu virgula mobila: acest tip de date este utilizat doar in conjunctie cu procesorul matematic 80287. Se folosesc formatele cu 32, 64 si 80 biti, conform standardului IEEE 754. In absenta coprocesorului este necesar un emulator software al acestuia pentru a manipula acest tip de date.

Exista instructiuni de inmultire si impartire (separat -pentru intregii cu semn si fara semn). Adunarea si scaderea se fac prin instructiuni ce pot folosi ambele tipuri de intregi. Exista instructiuni de salt conditionat utilizabile pentru detectarea situatiilor de depasire superioara.

Reprezentarile cererilor in cod BCD neimpachetat si in cod ASCII difera prin continutul celor patru biti mai semnificativi, 0 pentru BCD si 3 pentru ASCII. Adunarea si scaderea numerelor BCD, in ambele formate, se face cu instructiunile adecvate, urmate de ajustare.

5.4. Registre

Programatorului i se ofera un set de 14 registre, in care se includ registre de uz general, registre de comanda si registre pentru calculul adresei. In fig. 5.2. este indicata organizarea fisierului de registre, precum si gruparea lor in cele trei clase mentionate.

Numele registrului Registre pentru functii

de 16 biti speciale

7 0 7 0

____________________

| | |

AX | | | Inmultiri, impartiri

|_________|__________|

Registre | | | Functii I/O

adresabile DX | | |

la nivel |_________|__________| Bucle

de octet | | |

CX | | | Contor

|_________|__________|

| | |

BX | | |

|_________|__________| Registre baza

| |

BP | |

|____________________|

| |

SI | |

|____________________| Registre index

| |

DI | |

|____________________|

| |

SP | | Indicator stiva

|____________________|

15 0

Registre generale

15 0

____________________

| |

CS | | Selector segment cod

|____________________|

| |

DS | | Selector segment date

|____________________|

| | Selector segment

SS | | stiva |____________________|

| | Selector segment date

ES | | suplimentar

|____________________|

Registre de segment 15 0

____________________

| |

F | | Indicator conditie

|____________________|

| | Indicator

IP | | instructiuni

|____________________|

| | Cuvint de stare a

MSW | | masinii |____________________|

Registre de stare si

comanda

Fig. 5.2. Organizarea interna a registrelor

5.4.1. Registre de uz general

Grupul fisierelor de uz general consta din opt registre de 16 biti. Ele sint folosite pentru a pastra datele si adresele manipulate de catre program. Registrele AX, BX, CX, DX pot fi utilizate si ca opt registre independente de 8 biti.

Desi, in mod normal, toate registrele de uz general pot fi utilizate identic pentru a stoca operanzii diferitelor instructiuni, unele moduri de adresare se refera implicit la anumite registre de uz general. Folosirea lor este conditionata de posibilitatea de a utiliza aceste registre pentru accesul prin moduri specifice de adresare la operanzi. De exemplu, registrele BX si BP, numite si registre baza, pastreaza adresa baza a structurilor de date, in timp ce registrele index SI si DI stocheaza offsetul in cadrul unei structuri de date. SP este si mai specializat, deoarece el contine offsetul virfului stivei in cadrul segmentului stivei.

5.4.2. Registre de segment

Cele patru registre de segment pastreaza selectorii pentru patru segmente distincte care definesc spatiul curent adresabil al programului. Pentru realizarea accesului la un cuvint sau un octet in cadrul segmentului este necesara incarcarea prealabila a unuia din registrele de segment cu selectorul segmentului.

Fiecare registru de segment permite calcularea adresei pentru un anumit tip de segment. De exemplu, CS pastreaza selectorul segmentului de cod utilizat la un anumit moment, in timp ce SS identifica segmentul de stiva curent utilizat. Registrele DS si ES contin selectorii pentru doua segmente de date, adresabile direct, fara incarcarea unui alt registru de segment. S-au prevazut doua registre de segment pentru date cu scopul facilitarii transferului de dateintre segmente diferite.

Adresarea memoriei se efectueaza prin utilizarea implicita a segmentelor ai caror selectori sint incarcati in registrele de segment corespunzatoare. Deci, instructiunile sint extrase pe baza informatiilor din CS, operatiile in conjunctie cu stiva folosesc continutul registrului SS, in timp ce continutul registrului DS, daca nu se specifica altfel, este valoarea implicita (default) a selectorului pentru segmentul de date.

In scopul cresterii flexibilitatii privind adresarea operanzilor, sistemul iAPX 286 permite programatorului sa specifice in mod explicit oricare din registrele de segment pentru utilizarea la calculul adresei fizice la care se afla operandul instructiunii. Cu toate acestea, vizibilitatea memoriei este redusa la fereastra definita de continuturile registrelor de segment, cum rezulta si din fig. 5.3. Daca este necesara adresarea unei celule de memorie dintr-un alt segment programatorul trebuie sa incarce, in prealabil, in registrul de segment corespunzator, noua valoare care sa permita accesul la celula in discutie.

Fig.5.3. Utilizarea registrelor de segment pentru accesul la memorie.

Selectorul de segment are formate si roluri diferite, depinzind de modul de adresare in care se afla iAPX 286: modul cu adrese reale (RA-real address) sau modul virtual (VM-virtual mode). In modul RA selectorul contine cei mai semnificativi 16 biti din cei 20 ai adresei segmentului. Cei mai putin semnificativi 4 biti ai adresei segmentului sint 0. Deci,adresa de inceput a oricarui segment este un multiplu de 16. Pentru calculul adresei in modul RA continutul registrului de segment, deplasat spre stinga cu patru pozitii binare, este adunat cu continutul offsetului de 16 biti din cadrul segmentului a celulei de memorie la care se realizeaza accesul (fig. 5.4.). In modul VA selectorul segmentului are o structura mai complexa, indicind un segment de16 Kocteti in spatiul adreselor virtuale.

Fig. 5.4. Calculul adresei fizice in modul RA 5.4.3. Registre de comanda

Registrul IP contine offsetul urmatoarei celule de memorie al carei continut trebuie extras in vederea rularii programului curent. Orice adresa in cadrul sistemului iAPX 286este compusa dintr-un selector si un offset, deci nu exista un contor propriu-zis al programului. In locul lui se foloseste perechea de registre CS:IP, care defineste un registru de 32 biti.

In figura 5.5. se indica structura registrului indicatorilor de conditie. Indicatorii de conditie pot fi divizati in trei clase: indicator de stare (status flags), indicatori de comanda (control flags) si cimpuri speciale (special fields).

__________ ______ ____ _____ _______ ______ _______________

| | | | | | | | | | | | | | | | |

| | NT |IOPL |OF | DF| IF| TF| SF| ZF| | AF | | PF | | CF |

|__|____|__|__|___|___|___|___|___|___|__|____|__|____|__|____|

Fig. 5.5. Registrul indicatorilor de conditie

Semnificatiile indicatorilor de conditie sint urmatoarele:

CF (carry flag) reprezinta transportul (imprumutul) rezultat in urma efectuarii ultimei operatii.

PF (parity flag) constituie bitul de paritate(paritate cu sot) al octetului mai putin semnificativ rezultat in urma ultimei operatii aritmetice sau logice efectuate.

AF (auxiliary carry flag) este bitul de transport auxiliar, rezultat in urma unei operatii de adunare/scadere cu numere in format - BCD. El se refera la cea mai putin semnificativa cifra BCD.

SF (sign flag) indica semnul rezultatului ultimei operatii SF=1 caracterizeaza numarul negativ.

ZF (zero flag) este 1 cind rezultatul ultimei operatii este zero.

IF (interrupt enableflag)estedestinat mascarii/activarii intreruperilor exterioare mascabile. Cind IF=1 cererile exterioare de intreruperi pe linia INT pot fi luate in consideratie.

TF (trap flag ) permite activarea modului de rulare pas cu pas a programului, mod care produce automat o intrerupere interna la terminarea executiei unei instructiuni. Controlul este transferat unei rutine de depanare realizata de catre programator. DF (direction flag) indica sensul transferului de date in operatii cu siruri. Cind DF=1 transferul incepe cu ultimul element al sirului. Cind DF=0 transferul incepe cu primul element al sirului ce se transfera.

OF (overflow flag) indica depasirea capacitatii de stocare a rezultatului ultimei operatii.

IOPL (I/O privilege level) este utilizat in modul privilegiat si indica nivelul minim al privilegiului necesar pentru a executa operatii I/O.

NT (nested task) este folosit tot in modul privilegiat si indica daca exista taskuri imbricate, fapt ce conditioneaza modul efectuarii operatiei de return din taskul curent.

In modul privilegiat de lucru modificarea indicatorilor IF, IOPL si NT se fac doar dupa testarea prealabila a dreptului de acces. In acest mod sint inhibate actiuni asupra lor efectuate de catre programe neautorizate.

Indicatorul TF nu poate fi modificat direct. Intregul registru trebuie transferat in stiva, unde are loc modificarea lui TF, dupa care se face reincarcarea registrului indicatorilor de conditie. La aparitia primei intreruperi pas cu pas TF este facut automat 0, fapt ce creaza posibilitatea rularii normale a rutinei de depanare.

5.5. Moduri de adresare

Instructiunile iAPX 286 pot opera fara nici un operand, cu un operand sau cu doi operanzi. In cazul instructiunilor cu doi operanzi unul din acestia trebuie sa se afle intr-un registrusau intr-o locatie de memorie. Celalalt operand trebuie sa fie de tip imediat sau sa se afle intr-un registru. Exceptiile sint date de instructiunile care opereaza cu siruri, pentru care ambii operanzi sint stocati in memorie.

Mecanismul de evaluare a adresei necesare unei operatii de acces la memorie implica intotdeauna unul din registrele de segment din CPU. Fiecare tip de referire la memorie este asociat unui anumit registru de segment, utilizat in mod implicit la calculul adresei fizice a locatiei la care se face acces. Adresarea operanzilor permite specificarea explicita a unui registru de segment. Deci, este posibil accesul la operanzi aflati nu numai in segmentul de date (optiunea implicita), ci si in segmentul de cod, cel al stivei sau cel de date suplimentare. Pentru aceasta este necesara prevederea unui prefix de un octet, care suprainscrie optiunea implicita (segment override prefix). Regula implicita nu poate fi modificata cind referirea la memorie se face prin operatii specifice stivei sau asupra sirurilor.

In sistemul iAPX 286 se folosesc opt moduri de adresare. Desi accesul la memorie necesita un registru de segment si un offset, discutia modurilor de adresare se va referi doar la calculul offsetului.

Operandul de tip registru este memorat intr-un registru de 8 biti sau de 16 biti. Registrul de 16 biti poate fi de uz general, registru baza sau registru index. Unele instructiuni speciale au acces si la registrele de segment sau la cel al indicatorilor de conditie. Operanzii imediati constituie o parte a instructiunii. In modul de adresare directa in componenta instructiunii intra offsetul de 16 biti al operandului. In modul de adresare indirecta prin registru offsetul operandului este stocat in registrele SI, DI, sau BX.

Modurile de adresare descrise mai sus sint simple si se intilnesc la multe microprocesoare. Urmatoarele moduri de adresare, sintetizate in tabelul 5.2, sint utile pentru adresarea operanzilor in structuri complexe de date.

5.5.1. Modul based

Ca registru baza se foloseste BX sau BP. La continutul acestora se aduna un deplasament, care este preluat din corpul instructiunii.

5.5.2. Modul indexed

Drept registre index se pot folosi SI sau DI. Si in acest caz deplasamentul necesar calcularii offsetului operandului se extrage din corpul instructiunii. Diferenta fata de modul de la 6.5.1. consta doar in numele registrului folosit pentru adresare.

5.5.3. Modul base indexed

Offsetul operandului se obtine adunind continutul unui registru baza (BP sau BX) cu cel al unui registru index (SI sau DI).

5.5.4. Modul base indexed with displacement

Pentru evaluarea offsetului operandului continutul unui registru baza (BP sau BX) se aduna cu cel al unui registru index (SI sau DI), precum si cu un deplasament ce constituie o parte a instructiunii. Este de remarcat ca nu se realizeaza deplsarea continutului registrului index (N=0).

Tabelul 5.2. Moduri de adresare in sistemul iAPX 286

Mod de adresare

Tip Denumirea Intel Adresare

Directa prin registru Register operand G(g)

(register operand)

Cuautoincrementare Directaddress M(M(PC)),PC:=PC+1

(autoincrement)

Imediata Immediate M(PC), PC:=PC+1

(immediate)

Indirecta prin regis- Register indirect M(G(g))

tru

(register indirect)

Indirecta bazata si cu Based M(G(g)+d)

deplasament

(base displacement

indirect)

Indirectabazataindexata Baseindexed M(G(g1)+G(g2).sh.N)

(base indexed indirect) (N=0)

Indirecta indexata Base indexed M(G(g1)+d+G(g2).sh.N) bazata si cu deplasa- with deplasament N=0)

ment

(base displacement

indexed indirect)

5.6. Setul de instructiuni

5.6.1. Instructiuni pentru transferul de date

Instructiunea de baza pentru transferul de date este MOV. Ea poate fi folosita pentru transferul de date intre registre sau intre un registru si o locatie de memorie. Instructiunile IN si OUT transfera cuvinte de 8 biti sau 16 biti in conjunctie cu porturi de intrare/iesire. Asa cum se va vedea, operatiile I/O sint permise doar programelor cu numar de privilegii (CPL) adecvat. Instructiunea MOV nu poate fi folosita pentru orice fel de transfer de date. Pentru operatii in conjunctie cu stiva se folosesc POP si PUSH pentru registre obisnuite sau POPF si PUSHF pentru cel al indicatorilor de conditie. POPA si PUSHA extrag, respectiv inscriu, in stiva toate registrele, ceea ce le face adecvate pentru comutarea contextului in regim multitasking.

Pentru incarcarea registrelor de segment sint necesare instructiuni speciale: LDS si LES incarca registrele DS si, respectiv, ES, cu cuvinte de 16 biti pastrati in memorie.

De mare folos este instructiunea XCHG. Ea interschimba continutul unui registru cu cel al unei locatii de memorie, ambele specificate. Pe durata executiei ei semnalul LOCK este activat, deci executia instructiunii este indivizibila. Deci, XCHG poate fi folosita pentru implementarea procedurii test-and-set ceruta de excluderea mutuala. In acest scop registrul va fi incarcat in prealabil cu 1. La terminarea executiei instructiunii XCHG starea resursei este "ocupata", iar testarea continutului registrului permite evaluarea starii anterioare executiei instructiunii.

XLAT este o instructiune folosita pentru cautarea in tabele. Adresa de inceput a tabelului este data de continutul perechii DS:BX, iar AL serveste ca index. La teminarea executiei in AL se gaseste octetul adresat in tabel.

5.6.2. Instructiuni aritmetice

Setul de instructiuni al sistemului iAPX 286 contine facilitati legate de cele patru operatii de baza. Pentru adunare sint disponibile instructiunile ADD (adunare obisnuita) ADC (adunare cu transport) sau INC (adunare cu 1). Scaderea se poate face in mod normal (SUB), implicind imprumutul (SBB) sau prin decrementarea cu 1 (DEC). NEG inverseaza semnul operandului.

Pentru inmultirea intregilor fara semn s-a prevazut instructiunea IMUL, in timp ce MUL efectueaza inmultirea cu semn. Operanzii pot fi de 8 biti (in care caz rezultatul are 16 biti) sau de 16 biti (cu rezultatul de 32 biti). Unul din operanzii inmultirii se afla in registrul AL sau AX, in functie de lungimea sa. Rezultatul este memorat in AX sau in perechea AX:DX.

Si in cazul impartirii se face distinctia intre operanzii cu semn (DIV) si cei fara semn (IDIV). Deimpartitul trebuie incarcat in AX sau in perechea AX:DX. Impartitorul poate avea 8 sau 16 biti. Citul se depune in AL sau AX, iar restul se stocheaza in AH sau DX,in functie de dimensiunile operanzilor.

Pentru operatii aritmetice cu numere in format BCD, simplu sau impachetat sint necesare si operatii de ajustare, care iau in consideratie transportul/imprumutul rezultat din cifrele BCD cel mai putin semnificative. Pentru ajustare sint folosite instructiunile AAA, DAA (adunare) AAS, DAS (scadere), AAM (inmultire), AAD (impartire). Instructiunile al caror cod incepe cu D se folosesc pentru ajustari in urma operatiilor cu operanzii in format BCD neimpachetat. Cele ale caror coduri incep cu A sint utilizate in conjunctie cu operanzi ACCII.

Setul de instructiuni mai contine posibilitatea de a extinde semnul unui operand: CWD converteste operandul de un cuvint (16 biti) din AX in unul de lungime dubla (32 biti) prin extindere in registrul DX a bitului de semn; CBW converteste operandul de un byte (8 biti) in unul de lungime un cuvint (16 biti) din AL prin extinderea in registrul AH a bitului de semn.

5.6.3. Instructiuni logice si de deplsare.

iAPX 286 ofera instructiunile clasice pentru operatii logice AND,OR,NOT,EXOR. La acestea se adauga TEST, care inscrie indicatorii de conditie conform valorii operandului instructiunii.

Pentru deplasari si rotiri exista instructiuni care efectueaza aceste operatii cu una sau mai multe pozitii binare si in oricare din cele doua sensuri posibile. Se pot efectua deplasari la stinga, aritmetice (SAL) sau logice (SHL), la dreapta, aritmetice (SAR) sau logice (SHR). Instructiunile de rotire ciclica opereaza asupra continutului unui registru (ROL-stinga, ROR-dreapta) sau asupra continutului unui registru concatenat cu bitul CF (RCL-stinga, RCR-dreapta).

5.6.4. Prefixe

O caracteristica a setului de instructiuni ale sistemului iAPX 286 consta in posibilitatea de a utiliza prefixe, care au efecte speciale asupra executarii instructiunii. Sint permise trei tipuri de prefixe de un octet:

- modificarea segmentului implicit (segment override);

- repetare

- blocare.

Primul tip de prefixe specifica in mod expres registrul de segment care se utilizeaza in evaluarea adresei operandului instructiunii. O astfel de prefixare anuleaza folosirea registrului implicit de segment (de exemplu DS pentru accesul la date). Prefixul segment override este generat automat de catre asamblor cind programatorul indica in mod explicit un registru de segment in modul de adresare a operandului.

Prefixul de repetare este permis doar in conjunctie cu un anumit set de instructiuni destinate transferului de date sau compararilor. In fata acestor instructiuni se poate plasa prefixul REP. Ca efect, instructiunea prefixata se executa in mod repetat, pina cind continutul registrului CX devine zero. Exista si alte prefixe, care se folosesc cu unele instructiuni de comparare; ele permit oprirea repetarii fie cind continutul lui CX devine zero, fie cind conditia indicata de prefix nu mai este respectata. Pentru exemplificare, se poate cita :

REPZ - repetitia are loc atita timp cit ZF=1 sau CX <> 0

REPNZ - repetitia are loc atita timp cit ZF=0 sau CX <> 0

Prefixele de repetare permit programatorului sa obtina operatii cu siruri, incarcind in CX inaintea instructiunii prefixate lungimea sirului. De aici decurge necesitatea de a prefixa numai unele instructiuni, si anume pe acelea care executa o anumita operatie si apoi decrementeaza continutul registrului CX.

Prefixul LOCK se foloseste pentru implementarea unor operatii indivizibile citire-modificare-inscriere in structuri multiprocesor. Pe durata executiei instructiunii prefixate cu LOCK semnalul hardware exterior LOCK este activ; pe durata cit este activ, LOCK impiedica pierderea conexiunii microprocesorului cu memoria comuna. Asa cum s-a mai spus, aceasta conditie este esentiala pentru implementarea corecta a operatiilor elementare asupra variabilelor comune. LOCK poate fi folosit doar atunci cind codul privilegiului programului nu este mai mare decit cimpul IOPL din registrul indicatorilor de conditie.

Este permisa prefixarea multipla a unei instructiuni, ceea ce are ca efect executia cu blocarea interventiilor din exterior a instructiunilor cu siruri. Pentru a se evita blocarea pe timp indelungat a magistralei comune, prefixul LOCK are valabilitate doar pe durata operatiei asupra fiecaruia din elementele sirului, si nu si in intervalul intre doua operatii. Din acelasi considerent o cerere de intrerupere externa poate fi acceptata la sfirsitul fiecarei iteratii cerute de operarea cu siruri.

5.6.5. Instructiuni cu matrici si siruri

In cadrul sistemului iAPX 286 operatiile cu siruri sint implementate cu ajutorul unor instructiuni speciale si al unui prefix corespunzator de repetare. Trasatura comuna a acestor instructiuni consta in abilitatea de a efectua operatia asupra unui element al sirului si de a incrementa sau decrementa (in functie de indicatorul DF) registrul index sursa (SI) sau destinatie (DI). Registrele index sint incrementate/decrementate cu 1 sau 2, dupa cum operandul este octet sau cuvint de 16 biti. In plus, fata de incrementarea/decrementarea registrelor index la fiecare operatie, are loc decrementarea cu o unitate a registrului CX, folosit drept contor.

Pentru transferul de siruri se foloseste instructiunea MOVS, care copiaza continutul locatiei indicata de SI in locatia a carei adresa este obtinuta prin combinarea continutului registrului de segment ES cu continutul registrului DI. Prefixarea cu REP a instructiunii MOVS duce la copierea sirului sursa, a carui dimensiune este initial incarcata in CX, in sirul destinatie.

Sistemul ofera o instructiune pentru compararea sirurilor, CMPS. Ea compara operandul indicat prin SI cu cel indicat prin ES:DI. Ambii operanzi ramin neschimbati, dar indicatorii de conditie sint adaptati rezultatului compararii. Prefixul REPE permite evidentierea primei neconcordante intre elementele corespondente ale celor doua siruri, deoarece operatia de comparare inceteaza cind s-a detectat prima inegalitate sau cind continutul contorului CX a devenit zero.

O alta instructiune, SCAS, permite, explorarea unui sir in vederea identificarii eventualei prezente in acesta a unui anumit element. Operatia consta in compararea continutului registrului AL sau AX cu continutul locatiei de memorie de 8 biti (sau 16 biti) indicata prin ES:DI. Prefixul REPNE are ca efect repetarea compararii fie pina la identificarea elementului in discutie, fie pina cind continutul contorului CX devine zero. Daca se utilizeaza prefixul REPE,instructiunea permite depistarea primei neconcordante intre elementul curent al sirului si elementul de referinta.

Operatiile cu siruri pot fi folosite si in conjunctie cu porturile de intrare/iesire. In acest scop au fost prevazute instructiunile INS si OUTS. Si in acest caz sirul este indicat prin ES:DI pentru operatia INS sau ES:SI pentru OUTS, registrul CX folosind drept contor. Se reaminteste ca un program poate folosi porturile doar daca numarul sau de privilegiu este inferior sau cel mult egal cu valoarea cimpului IOPL din registrul indicatorilor de conditie. Mai trebuie remarcat faptul ca nu toate prefixele pot fi utilizate in conjunctie cu INS si OUTS:intrucit aceste instructiuni nu modifica indicatorii de conditie, folosirea prefixelor REPE sau REPNE nu are sens. Deci, INS si OUTS pot fi prefixate prin REP.

Tot in categoria instructiunilor destinate operatiilor cu siruri se incadreaza STOS si LODS. Prima memoreaza in locatia indicata prin ES:DI continutul registrului AL (8 biti) sau AX (16 biti). Cea de a doua inscrie in registrul AL sau in AX continutul locatiei (8 biti sau, respectiv, 16 biti) indicata prin ES:SI. Ambele operatii sint insotite de modificarea adecvata a registrului index. Decrementarea continutului contorului CX are loc numai in cazul STOS. Utilizarea prefixului REP pentru STOS are ca efect umplerea cu aceeasi informatie a unei zone de memorie. In cazul LODS folosirea lui REP nu are sens.

Singura instructiune legata de folosirea matricilor in limbaje de nivel inalt este BOUND, folosita la testarea incadrarii in limitele corecte a indicelui. Se testeaza daca valoarea din registrul specificat ca prin operand este inferioara celei din locatiile de memorie ce constituie al doilea operand. Cind testul esueaza se activeaza TRAP 5.

5.6.6. Instructiuni de comparare si de comanda

In sistemul iAPX 286 exista o serie de indicatori de conditie si stocarea acestora este folosita in conjunctie cu instructiuni de salt, numit salt conditionat, pentru ca valoarea indicatorului permite fie efectuarea saltului, fie executia urmatoarei instructiuni.

Pentru compararea a doi operanzi se foloseste instructiunea CMP. Utilizarea ei nu modifica operanzii, dar afecteaza indicatorii de conditie corespunzator rezultatului scaderii ipotetice a celor doi operanzi. Instructiunea CMP se foloseste atit pentru operanzii cu semn, cit si pentru cei fara semn, deoarece limbajul de asamblare studiat contine instructiuni de salt conditionat referitoare la rezultatul testarii atit a argumentelor cu semn, cit si a celor fara semn.

Instructiunile de salt conditionat folosesc conditii de tipul mai mare (greater than), mai mare sau egal (greater than or equal to), mai mic (less than) sau mai mic sau egal (less than or equal to). In plus, instructiunile de salt conditionat pot folosi drept conditii valorile indicatorilor de conditie ZF, OF, PF si SF, rezultate in urma efectuarii celei mai recente operatii. In fine, exista o instructiune de salt speciala, JCXZ, care permite efectuarea saltului doar atunci cind continutul registrului CX este zero. Se reaminteste ca registrul CX este adesea utilizat drept contor.

Pentru terminarea buclelor se folosesc instructiunile LOOP, LOOPE sau LOOPZ (ele sint echivalente) si LOOPNE sau LOOPNZ (si aceste doua instructiuni sint echivalente). Toate aceste instructiuni folosesc registrul CX, al carui continut este decrementat cu o unitate, dupa care se testeaza continutul LOOP efectueaza saltul daca CX <> 0; LOOPE/LOOPZ efectueaza saltul daca ZF = 1 si CX <> 0; LOOPNE/LOOPNZ efectueaza saltul daca ZF = 0 si CX <> 0. Evident, registrul CX este folosit drept contor al numarului de iteratii.

Instructiunile de apelare de proceduri si returnare a controlului de catre acestea sint doar de forma neconditionata CALL, RET. Instructiunea RET poate fi insotita si de un parametru, specificind numarul par de octeti care trebuie scosi din stiva inainte de returnarea controlului. In acest mod se pot elimina parametrii inscrisi in stiva atunci cind s-a apelat procedura.

Direct legate de utilizarea procedurilor limbajul mai dispune de doua instructiuni, ENTER si LEAVE. Ele sint folosite pentru a stabili in stiva cadrul adecvat in conjunctie cu limbajul de nivel inalt (a se vedea cap 1) la intilnirea unei instructiuni CALL sau RET. ENTER are doi parametri: primul indica volumul de memorie ce se aloca in stiva pentru variabilele locale ale procedurii, iar al doilea indica nivelul de imbricare al declararii procedurii in programul sursa, ceea ce permite construirea corecta a cimpului de afisare. in fig. 5.6. se poate vedea efectul instructiunii ENTER. Programul principal apeleaza procedura A si trebuie sa aloce zona corespunzatoare in stiva pentru variabilele locale, imediat dupa inceperea procedurii. In fig. 5.6.a. s-a ilustrat stiva inaintea executiei instructiunii ENTER, iar fig. 5.6.b. arata situatia dupa executie. Instructiunea LEAVE este folosita pentru dealocarea spatiului in stiva inainte de returnarea controlului de catre procedura si lucreaza in mod opus instructiunii ENTER.

Instructiunile de apelare pot activa o procedura al carei cod se afla in acelasi segment cu programul chemator sau intr-un alt segment. In primul caz in stiva se inscrie un offset de 16 biti, iar, in cel de al doilea, in stiva se inscrie o adresa de 32 biti. In aceeasi idee,sint necesare doua tipuri de instructiuni return: una, de returnare intrasegment, care extrage din stiva un offset de 16 biti; cealalta, de returnare intersegment, care extrage din stiva o adresa de 32 biti. De aici decurge faptul ca modulele de biblioteca apelate de rutine externe sau de alte module de biblioteca sint obligatoriu implementate prin instructiuni call/return cu adrese de 32 biti.

Un caz special de transfer al controlului consta in invocarea rutinelor speciale de manipulare a capcanelor folosite la detectarea exceptiilor sau la implementarea apelurilor sistemului de operare. Actiunea este posibila prin intermediul instructiunilor INT, care folosesc numarul asociat rutinei de tratare ca parametru de activare in tabelul de descriptori ai intreruperilor. Pe de alta parte,conditia de depasire (overflow), poate genera o capcana daca, imediat dupa o instructiune aritmetica al carui rezultat trebuie testat, se executa instructiunea INTO.

Fig. 5.6.Continutul stivei a) inainte, b) dupa executia unei instructiuni ENTER

5.6.7. Instructiuni privilegiate si pentru controlul CPU

In modul de lucru privilegiat este necesara stocarea unor informatii de mare importanta pentru functionarea corecta a sistemului. In aceasta categorie intra, de exemplu, continutul registrelor speciale folosite pentru mecanismele de protectie a memoriei, al indicatorilor de conditie folositi pentru comanda etc. In consecinta devine necesara existenta posibilitatii de a impiedicamodificarea incorecta a acestor informatii de catre programe neprivilegiate. O posibila solutie consta in a permite unui program sa execute instructiuni privilegiate numai daca nivelul privilegiului sau o permite.

Nu toate instructiunile manipulind indicatori de conditie sint privilegiate. Se pot cita cele trei instructiuni pentru indicatorul carry: STC (set carry flag), CLC (clear carry flag) si CMC (complement carry flag). In aceeasi categorie intra si indicatorul de directie DF, care poate fi inscris cu unu (STD) sau cu zero (CLD) indiferent de numarul de privilegiu al programului care o face. In opozitie, indicatorul de activare a sistemului de intrerupere IF nu poate fi inscris cu unu (STI) sau cu zero (CLI) decit de acele programe pentru care nivelul privilegiului nu este mai mare decit continutul cimpului IOPL.

Cimpul IOPL poate fi modificat numai prin secventa inscriere in stiva a registrului indicatorilor de conditie-modificare IOPL- extragere din stiva a registrului indicatorilor de conditie. Acest mod de lucru impune ca si instructiunile PUSHF si POPF sa fie instructiuni privilegiate. In aceeasi clasa intra si instructiunile de incarcare si, respectiv memorare, a continutului registrului de stare a masinii (MSW): LMSW, SMSW.

Instructiunile legate de manipularea registrelor folosite pentru protectia memoriei si comutarea taskurilor se pot executa, de asemenea, numai din modul privilegiat. Se pot face operatii de incarcare sau memorare (instructiunile incep cu litera L-load, respectiv S-store) a tabelului de descriptori globali (GDT-global descriptor table), a tabelului de descriptori locali (LDT-local descriptor table), a tabelului descriptorilor intreruperilor (IDT-interrupt descriptor table) si a registrului de taskuri (TR-task register). Deci, instructiunile LGDT, SGDT; LLDT, SLDT; LIDT, SIDT; LTR,STR permit efectuarea operatiilor descrise mai sus.

Alte operatii legate de manipularea drepturilor de acces pot fi efectuate fara cerinta unui nivel special de privilegiu. Ele pot fi corect executate numai daca operanzii sint vizibili din nivelul curent de privilegiu. In aceasta categorie intra instructiunile LAR (Load access rights - incarcarea drepturilor de acces) pentru incarcarea unui registru, LSL (load segment limit - incarcarea valorii limita a segmentului), ARPL (adjust RPL field - ajustarea cimpului RPL, despre care se va discuta intr-un paragraf urmator). Aceeasi cerinta este valabila si pentru VERR, VERW, instructiuni ce permit verificarea posibilitatii de a citi, respectiv a scrie, in conjunctie cu un anumit segment.

Un ultim cuvint despre instructiunile HLT si WAIT. HLT (halt) opreste functionarea CPU pina la primirea semnalului RESET sau a unei intreruperi. Ea poate fi executata numai de la cel mai ridicat nivel de privilegiu. WAIT suspenda activitatea CPU pina cind linia BUSY se dezactiveaza. Cum WAIT si BUSY sint folosite inconjunctie cuprocesorul matematic, instructiunea nunecesita vreun privilegiu special pentru a fi executata.

5.7. Gestiunea si protectia memoriei

5.7.1. Adrese virtuale

Modul protejat permite fiecarui task sa adreseze pina la 1 Goctet de memorie. Acest spatiu depaseste cu mult spatiul de memorie fizica permis in sistemul iAPX 286 (16 Mocteti). De aceea este prevazut un mecanism care converteste adresele din spatiul virtual, de mai mari dimensiuni, in cel fizic. Evident, doar o parte a spatiului virtual poate fi convertita, la un moment de timp dat, in spatiu fizic. Restul este rezident in memoria de masa, asa cum s-a discutat in cap. 4. Mecanismul de gestiune a memoriei implementat in sistemul iAPX 286 se bazeaza pe filosofia segmentarii.

Spatiul virtual de adrese este compus dintr-un offset de 16 biti in cadrul unui segment definit de un selector de 16 biti. In fig. 5.7. se indica formatul selectorului de segment. Pentru conversia adresei virtuale in adresa fizica se folosesc cei mai semnificativi 14 biti ai selectorului, in timp ce bitii cimpului RPL sint folositi pentru mecanismul de protectie a memoriei, asa cum se va vedea ulterior.

31 16 15 0

__________ ______ ____ ________

| | |

| Selector | Offset |

|_________________|_____ _______ ______ ______|

Indicator de 32 biti

15 3 2 1 0

__________ ______ ____ ________

| | | |

| | TI | RPL|

|_____ _______ ______ _____________|_____|____|

Selector

Fig. 5.7. Formatul unui selector de segment

Spatiul virtual de adrese al unui task este caracterizat de doua segmente: unul global, comun tuturor programelor rulind pe acelasi sistem iAPX 286, si altul local, vizibil doar pentru taskul curent. Aceasta subdivizare a spatiului virtual satisface doua cerinte antagoniste in sisteme care ruleaza in paralel programe cu prelucrare unica si multitasking. Taskurile independente au nevoie de spatii virtuale separate, asa incit fiecare dintre ele sa poata folosi cu maxima libertate intregul spatiu de adrese. Astfel se evita suprapunerea zonelor de memorie apartinind la programe diferite. Pe de alta parte, implementarea taskurilor care coopereaza necesita suprapunerea partiala a memoriei, deoarece inlesneste comunicarea prin utilizarea unor structuri de date comune.

Suprapunerea in cazul masinilor care ofera suport doar pentru spatii virtuale separate este dificila, ea presupunind conversia in aceeasi adresa fizica a doua sau a mai multor adrese virtuale distincte. Operatiile de swapping cerute de gestiunea spatiului fizic conduc la schimbarea adreselor fizice in timpul executiei unui sistem de programe, ceea ce complica foarte mult mecanismul de conversie spatiu virtual-spatiu fizic. Rezulta ca singura solutie viabila este aceea de suprapunere (overlapping) implementata direct la nivelul adreselor virtuale.

In sistemul iAPX 286 s-a adoptat solutia unui dublu mecanism de conversie: primul se refera la spatiul global sau spatiul virtual suprapus, care transfera intotdeauna o anumita adresa virtuala intr-o intotdeauna aceeasi adresa fizica, depinzind de taskul emitent al adresei virtuale. Discriminarea intre cele doua mecanisme este efectuata de catre CPU, pe baza bitului TI din selectorul segmentului. Restul de 13 biti indica unul din segmentele din spatiul de adresare global sau din cel de adresare local.

5.7.2. Descriptori de segment si organizarea lor

In fig. 5.8. se indica modul de evaluare a adresei fizice. Bitul TI selecteaza fie tabelul descriptorilor locali (LDT), fie cel al descriptorilor globali (GDT). Numarul de 13 biti definind segmentul este folosit drept index pentru aceste tabele, memorate in RAM, pentru a gasi descriptorul segmentului adresat. Descriptorul contine adresa fizica a primului octet al segmentului, iar offsetul este folosit pentru a adresa in cadrul segmentului locatia de memorie la care se face acces. Fiecare tabel de descriptori contine pina la 1024 intrari, fiecare avind dimensiunea de 8 octeti.

Asa cum s-a mentionat, descriptorul segmentului este compus din 8 octeti. Structura sa este indicata in fig. 5.9. Adresa baza este un cimp de 24 biti, urmat de un cimp limita, de 16 biti, indicind dimensiunea in octeti a segmentului. Aceasta permite mecanismului de protectie a memoriei sa verifice incadrarea offsetului adresei virtuale in limitele segmentului. Octetul de acces ( access byte) are forma din fig. 5.10., care ilustreza cazurile segmentului de cod si al segmentului de date.

Fig. 5.8. Calculul adresei fizice in modul de lucru protejat

__________ ______ ____ _________________

| |

+7 | Rezervat * | +6

|__________ ______ ____ _________________|

| octetul de acces | |

+5 | P | DPL | 1 | Tip | A | baza 23 - 16 | +4

|___|_____|___|_______|____|_____ _______ ______ ______|

| |

+3 | baza 15,0 | +2

|__________ ______ ____ _________________|

| |

+1 | limita 15,0 | 0

|__________ ______ ____ _________________|

15 0

P - prezent

DPL -nivel de privilegiu al descriptorului (desciptor privilege level)

A - acces realizat la segment (accessed)

* Pentru compatibilitate cu iAPX 386 toti bitii rezervati trebuie sa fie zero

Fig. 5.9. Formatul descriptorului de segment 7 6,5 4 3 2 1 1 7 6,5 4 3 2 1 1

_____ _______ ______ ______________| | | | | | | | | | | | | | | |

| P |DPL| 1 | 1 | C | R | A | | P |DPL| 1 | 0 | ED | W | A |

|___|___|___|___|___|___|___| |___|___|___|___|____|___|___|

A - acces realizat cind A = 1

P - segment prezent in memorie cind P = 1

DPL - nivelul de privilegiu al descriptorului

Bit 4 = 1 segment de date sau cod

Bit 3 = 1 segment executabil

= 0 segment neexecutabil

C - segment conform ED - directia de expandare

R - citibil (readable) W - inscriptibil (writeable)

Fig. 5.10 Formatul octetului de acces din cadrul descriptorului segmentului

Indicatorul P (present) indica daca segmentul adresat se afla in memoria principala (P=1) sau daca trebuie sa fie incarcat in acasta (P=0). Adresarea unui segment absent activeaza o capcana speciala, despre care se va discuta mai tirziu.

Indicatorul A (access - acces realizat) este inscris cu 1 la prima operatie de acces la segmentul care urmeaza unei operatii de inscriere cu 0 a indicatorului A. Acest lucru permite sa se determine daca, pe durata rezidentei sale in memoria primara, un segment a suferit modificari, fapt important in efectuarea operatiilor de evacuare.

Toti ceilalti indicatori si cimpuri sint folositi de catre mecanismele de protectie, care testeaza atit tipul dreptului de acces, cit si nivelul privilegiului.

Insesi tabelele de descriptori ai segmentelor pot fi considerate ca segmente, asa ca si ele au nevoie de descriptori de segment. Descriptorul de segment al segmentului tabelului de descriptori locali (LDT) difera putin de descriptorii normali (fig. 5.11.). Descriptorul segmentului LDT trebuie plasat in tabelul descriptorilor globali (GDT). Accesul la un LDT al carui descriptor de segment se afla intr-un alt LDT constituie o violare a mecanismului de protectie. Continutul LDT ai carui descriptori se gasesc in GDT nu poate fi modificat din greseala. El poate fi doar incarcat intr-un registru destinat gestiunii memoriei, folosind instructiunea LCTR.

__________ ______ ____ _______________

| * |

+7 | Rezervat | +6

|__________ ______ ____ _______________|

| | | | | | |

+5 | P | DPL | 0 | tip | | baza 23-16 | +4

|___|_____|___|______|__|_____ _______ ______ _______|

| |

+3 | baza 15-0 | +2

|__________ ______ ____ _______________|

| |

+1 | limita 13-0 | 0

|__________ ______ ____ _______________|

15 0

P - prezent

DPL - nivelul de privilegiu al descriptorului

tip - tipul descriptorului (include si cel de segment de comanda si segment sistem)

0 - incorect

1 - segmentul starii taskului este disponibil

2 - descriptor LDT

3 - segmentul starii taskului este disponibil

4-7 - descriptor comanda

8 - incorect (rezervat)

9-F - incorect

* Toti bitii 0 pentru compatibilitate iAPX 432

Fig.5.11. Formatul descriptorilor segmentului de comanda

In figura 5. 12. sint indicate relatiile intre diferitele tipuri de segmente si descriptori de segmente.

5.7.3. Incarcarea registrelor de segment

Nu toate referirile la memorie in cadrul sistemului iAPX 286 necesita folosirea dublului mecanism din fig. 5.12. Microprocesorul ofera un set de registre pentru a memora informatiile cu cea mai mare frecventa de acces in procesul de conversie a adresei. Aceste registre sint indicate in fig. 5.13. Cele patru registre CS, DS, SS, ES sint aceleasi din discutiile anterioare. Este, totusi, de remarcat ca, la partea vizibila de 16 biti, care poate fi modificata de catre programator, se adauga una invizibila acestuia, cu dimensiunea de 48 biti. Instructiunile de salt actioneaza doar asupra partii vizibile a CS. Continuturile registrelor de segment sint intotdeauna interpretate drept selector de segment, conform formatului din fig. 5.7.

Fig. 5.12. Procesul complet de evaluare a adresei pentru referirile la segmente locale

Registru de conversie a adresei segmentului

Parte vizibila Descriptor invizibil

16 biti 48 biti

__________ ______ ____ __________

| | |

| | | CS

|____________|_____ _______ ______ _____________|

| | |

| | | DS

|____________|_____ _______ ______ _____________|

| | |

| | | SS

|____________|_____ _______ ______ _____________|

| | |

| | | ES

|____________|_____ _______ ______ _____________|

Registru adresa sistem

Parti vizibile Descriptor invizibil

16 biti 48 biti

__________ ______ ____ _____________

| | |

| | | GDTR

|_______________|_____ _______ ______ _____________|

| | |

| | | LDTR

|_______________|_____ _______ ______ _____________|

Fig.5.13. Formatul complet al registrelor de segment si de comanda

Cind are loc modificarea continutului unui registru de segment, iAPX 286 incarca partea invizibila de 48 biti a registrului respectiv cu partea semnificativa a descriptorului de segment corespunzator selectorului memorat in partea vizibila. Pentru a obtine descriptorul segmentului in cauza se utilizeaza continutul fie al registrului GDTR (global descriptor table register - registrul tabelului descriptorilor globali), fie al registrului LDTR ( local descriptor table register - registrul tabelului descriptorilor locali). Acest continut furnizeaza adresa baza in GDT, respectiv LDT. Partile invizibile ale registrelor nu pot fi explicit manipulate prin program, ele putind fi modificate doar prin incarcarea unui nou descriptor de segment. Acesta trebuie sa corespunda intotdeauna selectorului stocat in partea vizibila a aceluiasi registru.

Cind se emite o cerere de acces la o locatie de memorie in cadrul unuia din cele patru segmente curente, CPU gaseste in registrele interne toate informatiile cerute de evaluarea adresei fizice, fara a mai fi nevoie de alte referiri la memorie. In felul acesta se asigura accesul rapid la memorie in masura in care caracteristicile de localitate a programului permit CPU sa foloseasca aceeasi descriptori de segment.

Registrul LDTR contine informatii in conjunctie cu LDT folosite de catre taskul curent aflat in rulare. El are o parte vizibila de 16 biti, in care este memorat selectorul segmentului LDT, si o parte invizibila de 48 biti. Aceasta din urma contine adresa baza si dimensiunea limita a LDT al carui descriptor coincide cu selectorul indicat in partea vizibila. Nici in acest caz partea vizibila nu poate fi manipulata direct prin program.

GDTR are acelasi format ca LDTR. El este vizibil doar din taskurile cu nivel mare al privilegiului (numar de privilegiu mic) care il incarca cu adresa baza si limita dimensiunii segmentului de memorie servind ca GDT pe durata initializarii. Acest registru este complet invizibil taskurilor neprivilegiate.

5.7.4. Mecanisme de protectie

Mecanismul de conversie a adresei virtuale in adresa fizica ofera o metoda de implementare a mecanismelor de protectie pentru izolarea taskurilor si protectia (limitata) a memoriei.

Izolarea diferitelor spatii de adresare este implementata doar pentru zona proprie fiecarui task din spatiul de memorie virtuala, intrucit toate referirile la memorie sint prelucrate cu ajutorul unor tabele de descriptori locali diferite. Deci, nu este posibil a avea acces la memoria altui task in conditiile in care descriptorii din LDT si continutul registrului LDTR au fost corect inscrise.

LDT poate fi considerat ca o lista a drepturilor de acces pentru diferite segmente (a se vedea cap. 4). Daca un descriptor de segment este continut in tabelul descriptorilor locali (LDT) al unui task, atunci taskul are drepturile de acces ale segmentului, specificate in octetul de acces al descriptorului segmentului. Un caz special este cel al segmentului pentru care bitul P este zero : cind se face referire la un astfel de segment este generata o capcana, indicind violarea protectiei. Mecanismul nu suspenda executarea instructiunii care incearca accesul la un segment care nu este prezent in memoria principala.

Pentru spatiul global virtual nu se implementeaza acest tip de protectie impotriva accesului incorect la memorie, deoarece toti descriptorii segmentelor din acest spatiu sint pastrati in acelasi tabel, GDT (global descriptor table). Izolarea realizata prin utilizarea de adrese diferite de la un spatiu propriu la altul dispare cind se face acces la segmentele globale. De aici pot aparea probleme daca segmentele globale sint folosite de catre diferite grupuri de taskuri pentru memorarea structurilor comune de date. In aceste cazuri accesul eronat al unui task la strcturile de date globale nu poate fi detectat.

Spatiul virtual global contine nu numai zonele comune ale diferitelor taskuri de aplicatii, dar si segmente ale sistemului de operare. Devine necesara utilizarea unui alt mecanism de impiedicare a distrugerii codului si structurilor de date apartinind sistemului de operare. De regula, distrugerea sus mentionata survine in urma operatiilor incorecte de acces ale taskurilor de aplicatii.

Mecanismul utilizat pentru protectia segmentelor sistemului continute in GDT se bazeaza pe recunoasterea prin mijloace hardware a starilor privilegiate, fapt ce permite accesul de catre programe neprivilegiate la segmente privilegiate. In acest fel segmentele de memorie globala pentru date sint protejate impotriva operatiilor de acces eronate ale unor taskuri mai putin privilegiate, dar nu si impotriva operatiilor de acces eronate efectuate de catre taskurile cu acelasi nivel de privilegiu. In aceste conditii ramine de pus in aplicare doar recomandarea ca diferitele taskuri de aplicatii sa nu comunice intre ele prin structuri de date comune memorate in segmente globale. Altfel spus, utilizarea intensa a spatiului virtual global de catre taskurile cu cel mai redus nivel de privilegiu pune in pericol executia programelor.

S-a aratat existenta unor mecanisme de protectie in conjunctie cu procesul de conversie a adresei. In plus fata de protectia intrinseca indusa de separarea spatiilor virtuale proprii, referirea la memoria asociata unui segment global sau propriu declanseaza un set de teste asupra legalitatii accesului. Daca referirea se face la o locatie de memorie continuta in unul din cele patru segmente curent accesibile prin intermediul CPU se intreprinde testarea offsetului in cadrul segmentului adresat. Acesta nu trebuie sa depaseasca valoarea inscrisa in cimpul dedicat limitei in descriptorul segmentului. Tipul de acces trebuie sa fie in concordanta cu tipul inscris tot in descriptorul segmentului. In felul acesta devine posibila interceptarea operatiilor de acces dincolo de limitele segmentului sau incompatibile cu tipul acestuia. De exemplu se pot impiedica operatii spacifice stivei in zone de memorie continute in segmente de tipul read only.

Ori de cite ori programul incarca un nou descriptor de segment in unul din registrele de segment sau in unul din registrele LDTR sau TR (task register), sistemul extrage descriptorul corespunzator segmentului si il incarca in zona invizibila a registrului de segment. Toate aceste operatii sint supuse, in mod automat, unor teste efectuate prin mijloace hardware.

Primul test se executa asupra valorii indexului segmentului, care nu trebiue sa depaseasca limita tabelului LDT sau GDT in care este memorat. Apoi, sistemul hardware testeaza tipul segmentului, asa ca tentativa de a incarca in LDTR un descriptor care nu apartine LDT activeaza o capcana indicind violarea protectiei memoriei. Teste similare au loc si la incarcareea registrelor CS, DS, SS, si ES. Mecanismul hardware verifica daca tipul de acces pentru segment este compatibil cu modul in care se intentioneaza a se utiliza registrul. De exemplu, nu este posibil a incarca in CS un descriptor care nu se refera la cod, sau in SS descriptorul unui segment de cod.

Unele spatii destinate segmentelor in LDT sau GDT pot fi neocupate. Exista teste care impiedica folosirea, in mod eronat, a informatiilor continute de acest spatiu drept descriptori de segment.

5.8. Stari masina privilegiate

Mecanismul starilor privilegiate in sistemul iAPX 286 este o extensie a starilor sistem / utilizator, adesea intilnite la alte microprocesoare. Exista patru niveluri de privilegiu si patru stari corespondente ale masinii, recunoscute prin mijloace hardware. Aceste niveluri sint numerotate cu 0, 1, 2, 3, 0 fiind nivelul cel mai inalt de privilegiu. Deci numarul mai mare corespunde nivelului de privilegiu mai mic si invers. Fiecare descriptor de segment din sistem areinscris un cod al privilegiului (DPL), care determina restrictiile privind accesul la continutul segmentului.

Regulile de baza privind accesul asociate nivelului de privilegiu sint urmatoarele:

a) segmentele de date sint accesibile doar taskurilor cu acelasi nivel de privilegiu sau cu nivel de privilegiu superior

b) subrutinele pot fi apelate doar de taskuri cu nivelul de privilegiu cel mult egal,daca nu inferior, celui al subrutinei apelate.

Aceste reguli decurg din ipoteza ca fiabilitatea unui program este mai mare cind numarul privilegiului sau este mai mic, fapt ce este o consecinta a politicii de acordare a unei game mai largi de privilegii programelor "de incredere", bine verificate. Aceste programe pot manipula si structurile de date folosite de taskurile mai putin privilegiate. Pe de alta parte, apelarea rutinelor mai putin privilegiate si, deci, potential mai nesigure, poate genera executia unor actiuni incorecte, cu repercusiuni negative asupra integritatii sistemului, asa ca sistemul hardware iAPX 286 interzice asemenea apelari.

Dupa cum s-a mentionat in cap. 4, utilizarea starilor masina privilegiate violeaza principiul conform caruia fiecare proces ar trebui sa dispuna de drepturile de acces strict impuse de indeplinirea functiilor sale. In cadrul sistemului iAPX 286 nivelurile de privilegiu ofera protectie impotriva erorilor software, deoarece programelor bine testate li se acorda mai multe privilegii, fapt ce nu permite folosirea eronata a drepturilor suplimentare pe care aceste programe le confera proceselor ce le apeleaza. Totusi, daca se iau in consideratie erorile hardware, nu se poate afirma ca executia programelor privilegiate este mai sigura pentru integritatea sistemului. De exemplu, daca la un nivel ridicat de privilegiu se utilizeaza un selector de segment neadecvat, mecanismele de protectie nu pot detecta o astfel de eroare.

Acest mod de protectie partiala nuconstituie o trasatura caracteristica sistemului iAPX 286, ci decurge din introducerea nivelurilor de privilegiu. Pe de alta parte, starile privilegiate constituie o solutie comoda pentru mai multe metode in conjunctie cu protectia.

5.8.1. Testarea codului privilegiului

Codurile de privilegiu sint memorate in mai multe locuri in cadrul structurilor informatiilor de comanda ale sistemului. Descriptorul de segment contine un cimp DPL al codului programului; un alt cod al privilegiului, RPL (requestor privilege level - nivelul privilegiului solicitantului), este memorat in cei doi biti mai putin semnificativi ai selectorului de segment. In descriptorii segmentelor CS si SS se afla cimpul CPL, indicind nivelul de privilegiu al programului aflat in executie.

Cind un registru de segment al CPU se incarca cu o noua valoare, au loc teste hardware privind cimpul DPL al descriptorului asociat, precum si teste privind dimensiunea limita si tipul segmentului. In cazul unui descriptor pentru segmentul de date testul este trecut numai daca DPL > = CPL, in comformitate cu regula privind accesibilitatea datelor . In cazul unui segment de cod, testul este trecut numai daca DPL = CPL, deoarece salturile si apelurile interniveluri sint supuse altor mecanisme de testare, care se vor discuta mai tirziu.

Programele mai putin fiabile pot apela rutine mai privilegiate, transferindu-le parametrii prin intermediul indicatorilor. Se creaza posibilitatea ca un task nesigur sa manipuleze un segment situat in afara domeniului sau de acces, lucru realizabil prin comanda data rutinei mai fiabile de a manipula un segment al carui indicator i-a fost transferat de catre taskul apelant.

iAPX 286 realizeaza validarea indicatorului catre o locatie de memorie prin utilizarea cimpului RPL din descriptorul segmentului. Acesta constituie o parte a unui indicator de 32 biti. Cimpul RPL contine privilegiul rutinei care a generat segmentul . In acest mod, chiar daca indicatorul este transferat prin intermediul mai multor apeluri de proceduri, cimpul sau RPL va continua sa contina informatii despre rutina de origine.

Cind se incarca un segment de date intr-un registru intern, are loc testarea RPL in raport cu CPL. Daca RPL > CPL se activeaza o capcana indicind violarea protectiei.

5.8.2. Operatii de transfer al controlului

In clasa operatiilor de transfer al controlului si care prezinta interes in problemele legate de sistemul de protectie sint salturi sau apelari la adrese din segmentul de cod cu acelasi niveluri inferioare de privilegiu. (Nu sint permise salturi in acesta ultima situatie).

Toate mecanismele de protectie, care testeaza corectitudinea transferului controlului, implementate in sistemul iAPX 286 se bazeaza pe asa numita poarta de apelare (call gate), utilizata pentru a stabili daca transferul solicitat satisface urmatoarele conditii:

- adresa de destinatie a transferului este accesibila taskului;

- sint satisfacute restrictiile privind nivelurile de privilegiu;

- adresa de destinatie a transferului constituie un punct corect de intrare.

Cind adresa de destinatie a transferului este in exteriorul segmentului curent de cod, offsetul este lipsit de semnificatie, in conjunctie cu poarta, deoarece poarta de apelare este identificata si extrasa (fie din LDT, fie din GDT) doar cu ajutorul selectorului segmentului.

Fig. 5.14. prezinta formatul descriptorului portii. Este de remarcat ca tipul portii nu se refera numai la apelare (call), ci si la capcane si intreruperi. Utilizarea portilor de acest tip se va descrie ulterior.

__________ ______ ____ ______________

| |

| Rezervat ( 0 pentru iAPX 386) |

|__________ ______ ____ _____________|

| | | | | | Contor |

| P | DPL | 0 | tip | XXX |cuvinte 4-0 |

|____|_________|___|______|_____|____________|

| | |

| Selector destinatie 15-2 | XX |

|__________ ______ ____ ____|________|

| |

| offset destinatie 15-0 |

|__________ ______ ____ _____________|

Semnificatii :

tip : 4 - call gate

5 - task gate

6 - interrupt gate

7 - trap gate

P : 0 - continut invalid al descriptorului

1 - continut corect al descriptorului

DPL: nivelul principal al descriptorului contor cuvinte: Numarul de cuvinte de copiat din stiva apelantului in cea a procedurii apelate. Se foloseste doar cu call gate (tip=4).

selector destinatie : Selector al segmentului de cod de destinatie (16 biti) ( call, intrerupere sau trap ). Selector al segmentului starii taskului de destinatie (task).

offset destinatie : Punct de intrare in segmentul de cod de destinatie

Fig. 5.14. Formatul descriptorului portii

Poarta de apelare contine adresa reala de destinatie la care se va face transferul controlului. Adresa are forma obisnuita : selector de segment si offset. Deci, pentru a ajunge la segmentul de destinatie , este necesar a extrage descriptorul de segment indicat de catre selectorul de segment continut in poarta de apelare. In continuare are loc calcularea adresei punctului de intrare, operatie la care se utilizeaza offsetul memorat in poarta de apelare si adresa baza, memorata in descriptorul segmentului de cod. Procesul de adresare este indicat, schematic, in fig. 5.15.

Fig. 5.15. Calculul adresei de destinatie utilizind poarta de apelare

Este interesant de remarcat ca programatorul nu cunoaste nici macar adresa virtuala a locatiei la care se transfera controlul. De aici decurge posibilitatea ca o rutina, folosita de mai multe taskuri, sa poata fi relocata in spatiul de adrese globale, fara a fi necesara modificarea programelor care apeleaza acea rutina.

Folosirea portii de apelare mai introduce un nivel de adresare indirecta, avind ca efect o mica pierdere in viteza de executie. Ea trebuie cintarita in raport cu avantajul oferit de accesul protejat la anumite portiuni de cod. Formele de protectie sint diverse. De exemplu se doreste ca o rutina, folosita in comun de doua taskuri, sa fie invizibila celorlalte taskuri din sistem. Portile de apelare se pot afla si in spatiul de adrese propriu (local). Deci, spatiul de adrese local al fiecareia din cele doua taskuri se plaseaza cite o poarta de apelare, care ofera indicatori spre codul utilizat in comun. Codul propriu- zis la care se face accesul se afla in spatiul de adrese global, asa ca la el pot avea acces acele taskuri ce poseda poarta de acces corespunzatoare. Pentru celelalte taskuri codul in discutie este invizibil.

Portile de acces sint similare descriptorilor de segment, fapt ce permite aplicarea acelorasi reguli privind testarea privilegiilor. Pentru a se efectua un transfer corect al controlului este necesar ca

max (CPL,RPL) = < DPL

DPL este cimpul omonim al portii de apelare adresate. Mecanismul descris permite stabilirea nivelului minim de privilegiu necesar pentru salt sau apelare prin intermediul portii de apelare. Deci, rutinele sistemului care nu sint necesare programelor utilizator nu sint accesibile utilizatorilor neprivilegiati.

Pentru verificarea respectarii celei de a doua reguli de protectie este necesar un alt fel de test asupra nivelurilor de privilegiu. Acest test foloseste cimpul CPL al programului apelant si cimpul DPL din descriptorul de cod de destinatie, fara a implica si descriptorul portii de apelare. Pentru transferul corect al controlului este necesara indeplinirea conditiei CPL >= DPL. Daca CPL = DPL (ceea ce inseamna ca nu are loc modificarea nivelului de privilegiu), poarta de apelare accepta si instructiuni de salt (jump). In caz contrar doar instructiunilor CALL li se permite sa modifice, in mod implicit, nivelul de privilegiu curent.

Pentru pastrarea integritatii sistemului se mentin stive separate pentru fiecare nivel de privilegiu in cadrul aceluiasi task. O modificare de nivel de privilegiu cauzata de un transfer al controlului conduce si la comutarea de stive. Pot lua nastere probleme, intrucit una din cele mai des utilizate metode de transfer al parametrilor catre o subrutina consta in plasarea acestora in stiva. Sistemul iAPX 286 rezolva aceasta problema prin specificarea unui numar de cuvinte ( 0 pina la 31) care se vor copia, in cazul unei instructiuni CALL, din vechea in noua stiva. Acest numar este stocat in cimpul WORD COUNT (contor de cuvinte) al descriptorului portii. Prin intermediul acestui mecanism vechile valori ale registrelor SS, SP, CS, si IP sint salvate in noua stiva, suplimentar cuvintelor, al caror numar este specificat de WORD COUNT, copiate din vechea stiva.

Cimpul CPL al programului chemator este, de asemenea, salvat in cei doi biti mai putin semnificativi ai lui CS.

Cind are loc executia instructiunii RETURN se efectueaza teste hardware care stabilesc daca valoarea actuala CPL este mai mica sau egala cu valoarea RPL a programului apelant, valoare salvata in CS. In caz afirmativ operatia este considerata corecta; incaz contrar se activeaza o capcana indicind violarea protectiei.

Daca registrele DS si ES ale procedurii apelate contin descriptori cu numarul DPL inferior celui al noului CPL, ceea ce inseamna ca datele la care se face referire prin ele sint mai privilegiate decit programul ce a apelat procedura, aceste registre sint incarcate cu un segment nul, asa ca orice tentativa de a le utiliza are ca efect generarea unei capcane indicind violarea mecanismului de protectie. In acest mod se impiedica manipularea de catre programe neprivilegiate a datelor privilegiate, furnizate fortuit prin returnarea controlului de catre procedura apelata (mai privilagiate) prin intermediul registrelor mentionate.

5.8.3. Segmente conforme

Sistemul iAPX 286 accepta un tip special de segmente, segmentele conforme (conforming segments) necesare implementarii procedurilor ce, in loc de a dispune de propriul CPL, imprumuta codul de privilegiu de la programul chemator.

Desigur, unele din testele enumerate nu se pot aplica acestor segmente. De exemplu, procedurile din segmentele conforme pot fi chemate de catre orice program, indiferent de privilegiu sau; ele sint executate fara a schimba CPL sau stiva. Sint permise exceptii similare de la regulile de protectie daca segmentul conform este citibil; in acest caz, continutul sau este accesibil de la orice nivel de privilegiu. Calitatea de segment conform se indica printr-un bit special in descriptorul segmentului si reprezinta singura exceptie de la regulile de baza guvernind mecanismele de protectie implementate.

5.9. Informatii de comanda a taskurilor si comutarea taskurilor

5.9.1. Descriptorul starii taskului

Simpla prezenta a unor mecanisme de protectie, care controleaza operatiile de acces efectuat de catre taskuri la segmentele de date sau cod, nu este suficienta pentru a oferi un mediu de executie protejat in adevaratul inteles al cuvintului. Aceste mecanisme trebuie extinse pentru a comanda executia si comutatia taskurilor. iAPX 286 realizeaza acest lucru prin utilizarea unor structuri de date de comanda, in care se pastreaza toate informatiile de comanda cerute de gestionarea corecta a taskurilor. Structura lor este similara cu a altor structuri de comanda adoptate pentru protejarea accesului la date si proceduri.

Principalele structuri intrebuintate sint segmentul de stare a taskului TSS (task state segment) si descriptorul de segment asociat lui, al carui format este ilustrat in fig. 5.16. __________ ______ ____ ________________

| |

+7 |Rezervat (0 pentru compabilitate cu iAPX 386)| +6

|__________ ______ ____ ______________|

| | | | | |

+5 | P| DPL| 0 | 0101 | nefolosit | +4

|__|____|___|_______|_____ _______ ______ __________|

| |

+3 | Selector TSS | +2

|__________ ______ ____ ______________| | |

+1 | nefolosit | 0

|__________ ______ ____ ______________|

15 0

Fig. 5. 16. Formatul descriptorului segmentului TSS

Bitul P arata daca descriptorul contine informatii corecte. Cimpul de doi biti DPL controleaza accesul la descriptor. Cimpul de tip estefie 1, fie 3, in functie de faptul ca taskul corespunzator este activ sau nu. Aceasta indicatie este folosita pentru a impiedica activarea imbricata a aceluiasi task, deoarece taskurile sint considerate ca nefiind reentrante.

In fig. 5.17. este indicata structura unui segment TSS.El este compus dintr-o sectiune statica, care nu se poate schimba pe durata de viata a taskului , si o sectiune dinamica, al carei continut este, in general, modificat de catre operatiile de comutare a taskurilor. Sectiunea statica pastreaza informatii care trebuie protejate impotriva manipularii ilegale; deci, cimpurile statice din TSS sint cele indicind segmentul si offsetul stivei utilizate cind taskul se afla in una din cele trei stari mai privilegiate (0, 1 sau 2). Tot static este si descriptorul selectorul tabelului descriptorilor locali ai taskului. Toate aceste date sint esentiale pentru efectuarea corecta a operatiilor, deoarece informatiile din tabelul descriptorilor locali foloseste pentru separarea spatiului datelor locale ale taskului curent de spatiile de adresare ale tuturor celorlalte taskuri din sistem. Pe de alta parte, indicatorii taskurilor cu nivelul de privilegiu 0,1 sau 2 sint esentiali pentru comportarea corecta a programelor privilegiate.

Sectiunea dinamica a TSS foloseste, in principal, pentru a salva starea taskului la suspendarea executiei sale. Deci TSS din cadrul sistemului iAPX 286 are rolul descriptorului procesului, introdus in cap.3, in care se memoreaza toate registrele si celelalte informatii cerute de eventuala reluare corecta a rularii taskului. Un cimp aparte este selectorul TBS (task back link segment), folosit pentru returnarea controlului catre taskul chemator atunci cind cel curent si-a incheiat executia.

__________ ______ ____ _______

|_Rezervat (0 pt. compat. cu iAPX386)_|

|_P DPL Tip Baza 23-16 _|

|_ Baza 15-0 _|

|_ Limita _|

| |

| |

| |

S | Selector LDT Task | 42

D | Selector DS | 40

D | Selector SS | 38

D | Selector CS | 36

D | Selector ES | 34

D | DI | 32

D | SI | 30

D | BP | 28

D | SP | 26

D | BX | 24

D | DX | 22

D | CX | 20

D | AX | 18

D | FLAGS | 16

D | IP (pct intrare) | 14

S | SS pentru CPL 2 | 12

S | SP pentru CPL 2 | 10

S | SS pentru CPL 1 | 8

S | SP pentru CPL 1 | 6

S | SS pentru CPL 0 | 4

S | SP pentru CPL 0 | 2

D | Selector spre TBS | 0

|__________ ______ ____ ______|

Tip=1 task disponibil; Tip=0 task ocupat

P=1 date valide; P=0 date incorecte

S Informatie statica; D Informatie dinamica

Fig. 5.17 Formatul segmentului starii taskului

5.9.2. Comutarea taskurilor

Operatia de comutare a taskurilor este declansata cind apare unul din urmatoarele evenimente:

- se executa o instructiune de salt sau call, iar selectorul destinatiei face referire la un TSS;

- se executa return in urma intreruperii, iar indicatorul de conditie NT este 1. In acest caz controlul este transferat taskului indicat de catre ciimpul TBF al taskului care isi termina executia;

- selectorul destinatie a unei instructiuni de salt sau call face referire la o poarta a taskului;

- survine o intrerupere.

Desi instructiunile CALL si JMP pot fi folosite pentru activarea unui task, ele au efecte diferite. Cind se foloseste CALL, este de asteptat o instructiune RETURN in cadrul taskului apelat, ceea ce nu se intimpla in cazul instructiunii JMP.

Daca procesul de comutare a taskurilor are loc prin intermediul unei porti a taskului, comenzile efectuate sint identice cu cele cerute de testele declansate cind se apeleaza o subrutina printr-o poarta de apelare. Totusi nu sint restrictii privind nivelurile de privilegiu ale taskului chemator si taskului apelat, intrucit fiecare task este considerat ca autonom. Formatul unei porti a taskului a fost indicat in fig.5.14.

Dupa toate testele de accesibilitate si de existenta a modulului task, are loc salvarea in zona adecvata a starii taskului ce se va suspenda, zona rezervata in propriul TSS; noul task este marcat drept "ocupat" (busy). Descriptorul sau este plasat in registrul TR, ceea ce face ca noul TSS sa fie usor accesibil utilizind un registru intern al CPU. De asemenea, are loc inscrierea informatiei in cimpul TBS al noului task : daca el a fost activat prin instructiunea CALL, cimpul TBS contine un indicator catre descriptorul TSS al taskului suspendat; in caz contrar indicatorul face referire la o intrerupere sau capcana.

iAPX 286 poate efectua comutarea taskurilor intr-o singura instructiune, incluzind si operatiile de salvare si restaurare a starii taskului suspendat si a celui activat.

Trebuie avut in vedere ca starea salvata si restaurata in mod automat se refera doar la CPU si nu si la procesorul matematic. Starea completa a sistemului trebuie sa tina cont si de starea interna a coprocesorului aritmetic, daca este prezent.

Dupa comutarea unor taskuri un indicator intern este inscris cu 1. Cind taskul curent incearca a efectua o operatie implicind procesorul matematic se activeaza automat o capcana (7), indicind imposibilitatea accesului la coprocesor. Rutina de servire a cacestei capcane pastreaza informatii despre ultimul task utilizind coprocesorul aritmetic. Daca actualul solicitant este si ultimul utilizator, nu este nevoie de nici o actiune speciala. In caz contrar starea coprocesorului. Trebuie salvata in segmentul de stare a taskului care a utilizat anterior coprocesorul. In descrierea din fig. 5.17. a TSS s-au indicat doar elementele obligatorii, dar nu exista restrictii in utilizarea TSS pentru a salva starea coprocesorului sau a oricarei alte informatii necesare utilizatorului. Spre deosebire de informatiile obligatorii, manipulate automat, informatiile suplimentare trebuie gestionate in mod explicit prin programe privilegiate.

Indicatorul intern de care s-a vorbit, indicind o comutare de taskuri, este reinscris cu 0 la aparitia capcanei generate de tentativa de utilizare a coprocesorului. Deci, orice operatii ulterioare implicind coprocesorul se vor executa in mod normal, deci fara influente asupra performantelor sistemului.

Mecanismul descris evita efectele neplacute ale comutarii taskurilor. Un exemplu de astfel de efect este acela al modificarii nedorite a continutului registrului coprocesorului ; cu mult mai daunator este efectul unui rezultat de execptie, cum este depasirea superioara, asupra taskului suspendat. In acest caz un task este fortat sa serveasca o intrerupere survenita in urma functionarii unui alt task, in timp ce taskul suspendat, care este "beneficiarul" logic al exceptiei, nu va realiza aparitia unei exceptii in functionarea coprocesorului.

La terminarea unui task se executa instructiunea IRET. Daca indicatorul NT (nested task) este 1, procesul de comutare a taskurilor transfera comanda taskului al carui descriptor TSS este indicat de catre cimpul TBS din segmentul de stare a taskului care si-a terminat executia. Cind NT = 0 are loc o revenire normala dupa intrerupere, utilizindu-se continutul curent al stivei. Pentru un task activat prin CALL, intrerupere sau capcana bitul NT este inscris automat cu 1 de catre mecanismul de comutare.

Cimpurile TBS ale diferitelor TSS ale sistemului pot fi modificate, daca se dispune de programe bine testate. Acest tip de operatie este necesar cind utilizatorul nu doreste sa tina seama de regulile implicite de planificare a taskurilor in conjunctie cu cimpurile TBS. In particular, problema se pune in cazul unui planificator software de tipul celui descris in cap. 3.

5.9.3. Planificarea taskurilor

Planificarea pentru executia de catre CPU a unui nou task este determinata de un numar de evenimente diferite. Un task poate elibera CPU fie pentru ca si-a terminat activitatea, fie pentru ca trebuie sa astepte pina la indeplinirea unei anumite conditii. Daca, de exemplu, ele incearca sa extraga date dintr-o cutie postala vida, taskul va apela, chiar inainte de suspendare, o rutina speciala a sistemului de operare. Acesta modifica valoarea TBF din descriptorul taskului curent pentru a indica primul task din lista celor gata de rulare. In acest fel simpla executie a instructiunii IRET transfera controlul asupra CPU primului task din lista mentionata. Taskul curent poate fi fortat sa cedeze controlul asupra CPU cind activeaza un task de prioritate superioara. Un exemplu il constituie trimiterea unui mesaj spre o cutie postala la care asteapta alte taskuri. In acest caz, rutina sistemului de operare folosita pentru activarea taskului insereaza descriptorul corespunzator in lista taskurilor gata de rulare, in concordanta cu prioritatea. Daca exista un task in asteptare si care are prioritatea superioara celei a taskului curent, cimpul TBS este modificat astfel incit sa indice inceputul listei taskurilor gata de rulare; o instructiune IRET transfera noului task controlul asupra CPU. Daca taskul activat are o prioritate inferioara, singura operatie ceruta este aceea de inserare a TBS corespunzator in lista taskurilor gata de rulare.

Planificarea taskurilor poate fi initiata si prin intreruperi si capcane. Activarea rutinei de tratare asociate produce o comutare de taskuri, cu planificarea realizata prin mijloace hardware. Prin implementarea adecvata a mastilor sistemului de intreruperi devine posibila planificarea corecta a rutinelor de tratare.In plus, fiecare rutina de tratare poate activa sau reactiva taskuri cu prioritate superioara celei a taskului intrerupt. In aceste cazuri rutina de tratare apeleaza o rutina a sistemului de operare care plaseaza descriptorii taskurilor activate in lista celor gata de rulare, in functie de prioritatile lor. In cazul intreruperilor imbricate se efectueaza aceeasi operatie asupra TSS ale celorlalte rutine de tratare intrerupte, care, de asemenea,sint plasate in lista taskurilor gata de rulare. In fine, cimpul TBS al taskului curent este midificat pentru a indica inceputul listei taskurilor gata de rulare, asa ca o instructiune IRET transfera controlul asupra CPU taskului activ cu prioritatea imediat urmatoare.

5.10. Intreruperi si capcane

5.10.1. Porti pentru intreruperi si capcane

In cadrul sistemului iAPX 286 intreruperile si capcanele pot fi considerate ca mecanisme speciale utilizate pentru activarea taskurilor. Intreruperile sint cauzate de semnale speciale externe microprocesorului, indicind aparitia unui eveniment in lumea exterioara. Capcanele sint evenimente interne, produse de executia unei instructiuni, instructiune ce necesita activarea capcanei.

Intreruperile externe sint produse de activarea liniilor INT sau NMI. Diferenta intre cele doua linii este creata de posbilitatea de a masca linia INT prin inscrierea cu 0 a indicatorului de conditie IF.

Intreruperile nemascabile, semnalate pe linia NMI, sint intotdeauna servite de catre CPU. De aceea, NMI este activata de aparitia unor evenimente importante, cu efecte catastrofale asupra sistemului, cum este pierderea iminenta a tensiunii de alimentare.

In cazul aparitiei unei intreruperi nemascabile sau a unei capcane se foloseste un cod adecvat, denumit rutina de tratare (handler), care executa actiunile cerute de evenimentul pe care il semnaleaza. Cum numarul de surse de intreruperi sau de capcane este mare, fiecareia i se asociaza un numar intre 0 si 255, folosit ca identificator al rutinei de tratare.

Sistemul dispune de un tabel special, IDT (interrupt descriptor table -tabelul descriptorilor intreruperilor ), care contine portile intreruperilor, capcanelor sau taskurilor corespunzatoare rutinelor de tratare respective. Portile de intreruperi si capca­ne au formatul indicat in fig. 5.14, iar rolul lor este analog celui al portilor pentru taskuri. Exista, insa, si diferente importante, intrucit activarea rutinei de tratare prin utilizarea unei porti pentru taskuri produce o comutare completa de taskuri. In antiteza, activarea printr-o poarta de intrerupere sau de capcana are ca efect transferarea controlului catre rutina de tratare, fara salvarea starii taskului intrerupt. Din acest motiv portile de intreruperi si de capcane raspund mai rapid la eveni­mente ce reclama actiuni simple, in timp ce portile pentru taskuri efectueaza operatii de salvare/restaurare a continutului registrelor CPU.

O alta deosebire este data de nivelul de privilegiu : rutinele de tratare activate prin capcane sau intreruperi trebuie sa fie cel putin la fel de privilegiate ca taskul intrerupt, iar segmentele lor de cod si de stiva trebuie plasate in tabelul GDT.

Exista o diferenta si intre o poarta de intreruperi si una de capcana: activarea rutinei de tratare prin poarta de intreruperi inscrie cu 0 indicatorul IF, ceea ce dezactiveaza activarea ruti­nelor de tratare a altor intreruperi mascabile. O rutina de tratare activata prin intermediul unei porti de capcana poate fi intrerupta de aparitia unei intreruperi mascabile. Orice rutina de tratare poate fi intrerupta de catre capcane.

5.10.2. Tratarea intreruperilor

Tabelul IDT contine toate portile de capcane, intreruperi si taskuri. Descriptorul acestui tabel se gaseste in registrul IDTR al unitatii centrale de prelucrare. Descriptorul contine adresa baza si offsetul maxim al tabelului descriptorilor de intreruperi, ceea ce permite testarea prezentei in tabel a portii adresate. Valoarea inscrisa in cimpul limita este de minimum 255, deoarece sistemul necesita 32 rutine de tratare a intreruperilor si capcanelor definite in cadrul sau. Restul de 224 identificatori sint disponibili pentru intreruperi si capcane definite de catre utilizator. La aparitia unei intreruperi sau a unei capcane cu un identificator care nu figureaza in tabelul IDT este activata o capcana de protectie. Ea primeste un cod de eroare al carui format este indicat in figura 5.18.

Rutinele de tratare activate de catre porti de capcana sau de intrerupere nu produc comutarea de taskuri, asa ca, pentru prelu­crarea lor, se foloseste acelasi spatiu ca pentru taskul intrerupt. Pentru protejarea sistemului impotriva folosirii necorespunzatoare a acestor porti ele sint tratate aproape la fel cu portile de apelare. De exemplu, cind se executa instructiunea INT, care solicita in mod explicit o capcana, rutina de tratare asociata este activata numai daca valoarea codului CPL al progra­mului este cel putin egala cu valoarea codului DPL, memorat in poarta corespunzatoare utilizata pentru accesul rutinei de trata­re. Pe de alta parte, rutina de tratare trebuie sa fie cel putin la fel de privilegiata ca programul care a invocat-o.

15 11 10 3 2 1 0

__________ ______ ____ ________________

| | | | | |

| | | | | |

| 0 0 0 0 | Vector IDT | 0 | 1 | EXT |

|___________|___________________|____|____|_____|

EXT = 0 : aparitia unei executii la prelucrarea unei instructiuni

EXT = 1: exceptie produsa de un eveniment extern programului (intrerupere, pas cu pas, eroare in zona de extensie a procesorului)

Fig. 5.18. Cod de eroare la adresarea incorecta a IDT

Cind activarea rutinei de tratare este insotita de o modificare de privilegiu, tabelul TSS furnizeaza date despre valorile SS si SP rezervate pentru noul nivel de privilegiu. ca si in cazul apelarii subrutinelor, acest fapt produce o comutare de stive; mai mult, ca si in cazul portilor de apelare, in noua stiva se salveaza vechile valori pentru CS, IP, F, SP si SS. Rutinei de tratare nu i se transfera, in mod explicit, parametrii. Unele capcane si intreruperi folosesc un cod de eroare pentru indicarea sursei intreruperii. In acest caz, codul de eroare este inscris in noua stiva. Daca activarea rutinei de tratare nu cauzeaza o modificare de privilegiu, are loc o operatie CALL normala, codul de eroare fiind inscris in vechea stiva.

Executia oricarei rutine de tratare se incheie cu executia instructiunii IRET. Daca rutina a fost activata printr-o poarta de task, indicatorul NT devine 1, iar IRET cauzeaza comutarea cu taskul indicat prin cimpul TBS din TSS curent. In caz contrar, se executa instructiunea IRET normala. Totusi, este posibila reali­zarea, si in acest caz, a efectuarii unei comutari de taskuri, cu conditia ca, anterior, sa se fi inscris cu 1 bitul NT din regis­trul indicatorilor de conditie. Aceasta constituie o modalitate de implementare a activitatilor de planificare descrise anterior.

5.10.3. Numere de vectori rezervate

Numerele rezervate folosesc pentru identificarea capcanelor generate de esecul unor teste efectuate de catre iAPX 286 pe durata executiei unei instructiuni ca si pentru identificarea intreruperilor generate de catre coprocesorul aritmetic. In tabelul 5.3. se indica o lista completa a intreruperilor si capcanelor sistem, definite in cadrul acestuia. In acelasi tabels-a indicat daca o anumita capcana sau intrerupere poate fi relansata cind rutina de tratare si-a incheiat executia, precum si existenta sau absenta unui cod de eroare precizind cauza intreruperii sau capcanei.

Tabelul 5.3. Intreruperi si capcane sistem

Nr. vector Descrierea Relansabil Cod eroare __________ ______ ____ __________ ______ ____ __

0 Divide error exception DA NU

1 Single step interrupt DA NU

2 NMI interrupt DA NU

3 Breakpoint interrupt DA NU

4 INTO detected overflow

exception DA NU

5 BOUND range exceeded

exception DA NU

6 Invalid opcode exception DA NU

7 Processor extension not

avaible exception DA NU

8 Double exception detected NU DA(0)

9 Processor extension segment

overrun interrupt NU NU

10 Invalid task state segment DA DA

11 Segment not present DA DA

12 Stack segment overrun or

not present DA DA

13 General protection Depinde de codul

de eroare DA

In continuare se dau unele detalii :

0 Divide error (eroare la impartire)

Capcana este activata cind se executa instructiunile DIV sau IDIV si rezultatul este prea mare pentru a fi reprezentat in spatiul disponibil, sau impartitorul este 0. Capcana repeta instructiunea ce a cauzat-o, dupa terminarea tratarii.

5 Bound range exceeded (depasirea limitei de adresare)

Capcana este activata cind se executa instructiunea BOUND pentru a testa incadrarea indexului unei matrici fata de limita admisa si testul esueaza. Si acesta capcana repeta instructiunea ce a cauzat-o, dupa ce rutina de tratare si-a incheiat operatia.

1 Single step (rulare pas cu pas)

Capcana single step permite executare in regiuni pas cu pas a programului ce se testeaza. Ea este activata dupa fiecare instructiune, daca TF=1. Capcana transfera controlul unei rutine de tratare, care isi incepe executia cu TF=0. La terminarea rutinei controlul este transferat altui task, de regula celui aflat sub test. Daca TF ramine zero, rularea taskului continua normal. Daca TF este facut 1 in rutina de tratare, executia pas cu pas continua.

6 Invalid opcode (cod de instructiune necunoscut)

Capcana este asociata cu detectarea de catre unitatea de decodificare a instructiunii a unui cod inexistent de instructiune. Aceeasi actiune are loc si cind modul de adresare continut in codul instructiunii nu este corect. Trebuie precizat ca activarea capcanei are loc la tentativa de executare a unei instructiuni ca mai sus, si nu doar la simpla ei extragere din memorie.

Double exception (detectarea unei duble erori)

Este posibil ca pe durata executiei unei instructiuni sa apara doua violari diferite ale mecanismului de protectie a memoriei. Ea nu este relansabila. Daca mai apare o violare a protectiei pe durata executiei rutinei de tratare, iAPX 286 se blocheaza si nu mai poate fi repornit decit prin resetare sau o intrerupere de tip NMI. Pentru aceasta capcana trebuie folosita o poarta care sa impiedice utilizarea neadecvata.

9 Processor extension segment overrun (depasirea limitei segmentului de catre un coprocesor)

Activarea acestei capcane are loc pentru a semnala CPU ca, in timpul unei operatii de citire sau inscriere efectuata de catre coprocesor, a avut loc tentativa de adresare dincolo de limita stabilita a segmentului curent. Coprocesorul contine toate informatiile legate de acest eveniment. Pentru a impiedica unitatea centrala de prelucrare sa foloseasca procesorul fara a reseta, in prealabil, conditia de intrerupere, nu este permisa executarea instructiunii WAIT sau ESCAPE (cu exceptia instructiunii FNINIT) pina cind coprocesorul este resetat sau conditia ce a cauzat intreruperea a disparut.

10 Invalid task state segment (segment TSS incorect)

Daca un task nu poate fi comutat (pentru ca unul din mecanismele de protectie este violat sau se depaseste o limita inscrisa in tabel) se activeaza capcana sus mentionata. Conditia se refera atit la TSS si descriptorul asociat, cit si la selectoarele incarcate in registrele interne.

11 Segment not present (segment absent)

Orice incercare de a utiliza segmente absente sau descriptori de comanda genereaza capcane cu numarul 11. Instructiunea care o provoaca poate fi reluata de la punctul la care a aparut situatia de exceptie imediat dupa ce rutina de tratare si-a terminat executia. Acest tip de capcana este esential pentru implementarea politicii de gestiune a memoriei, de tipul swapping automat al segmentelor sau cerere de pagini.

12 Stack segment overrun or not present (eroare de stiva)

Capcana este declansata de o eroare in conjunctie cu stiva (su­prainscriere, supracitire). Ea este relansabila; fapt ce permite, ca si pentru capcana numarul 11, implementarea paginarii automate sau a mecanismului de swapping automat. Erorile de stiva pot fi facute transparente pentru utilizator ca urmare a proprietatii capcanei de a fi relansabila, asa ca rutina de tratare poate comuta segmentele de stiva, fara consecinte asupra executiei programului.

13 General protection (protectie generala)

Orice tip de violare a protectiei neluat in consideratie de catre celelalte capcane o activeaza pe cea cu numarul 13. Cauza ce a generat-o este indicata de un cod de eroare. Daca acesta are bitul 0 egal cu zero si bitii 2-15 contin un numar nenul, capcana este relansabila. Bitul 1 indica prezenta selectorului in IDT sau GDT/LDT, iar bitul 2 permite discriminarea intre LDT si GDT (cind selectorul nu se afla in IDT).

5.11. Coprocesorul aritmetic

5.11.1. Arhitectura interna

Unitatea centrala de prelucrare 80286 descrisa in paragraful 5.6 poate prelucra eficient doar intregi sau numere BCD mici.Pentru aplicatiile ce necesita prelucrari in formatul cu virgula mobila se foloseste coprocesorul aritmetic 80287, capabil sa extinda capacitatile de prelucrare aritmetica a sistemului.

Fig. 6.19. Schema bloc a circuitului 80287.

Coprocesorul matematic poate fi considerat ca o unitate centrala de prelucrare separata, avind organizarea interna si setul de instructiuni astfel gindite incit sa permita executia rapida a operatiilor aritmetice. In fig. 6.19. se ilustreaza schema sa bloc. Se poate vedea adoptarea aceleiasi filosofii ca in cazul unitatii centrale principale de prelucrare, existind doua unitati care functioneaza asincron: BIU (bus interface unit), pentru gestiunea magistralei, si NEU (numerical execution unit), pentru prelucrari numerice.

NEU contine stiva de registre si diferitele subrutine care executa variate tipuri de prelucrare. Aceasta unitate executa toate instructiunile de manipulare a stivei de registre si de efectuare a operatiilor aritmetice.

BIU gestioneaza toate comunicatiile externe si, in particular, primeste si decodifica instructiunile destinate coprocesorului. Ea asigura transferul de date intre circuit si lumea exterioara lui, dar executa si acele instructiuni care nu necesita utilizarea ALU sau a stivei de registre. Toate aceste operatii se efectueaza in paralel cu calculele ce se desfasoara in unitatea de prelucrare numerica.

Unitatea de interfata cu magistrala detine controlul asupra sem­nalelor care interfateaza coprocesorul cu CPU. In acest scop se foloseste semnalul BUSY, care se activeaza cind NEU incepe execu­tia unei noi instructiuni si care se dezactiveaza la terminarea executiei. Semnalul BUSY este testat de catre CPU la executia instructiunii WAIT. Cind BUSY este activ CPU suspenda executia programului pina cind coprocesorul semnaleaza terminarea instruc­tiunii. Acest protocol intre CPU si coprocesorul aritmetic permi­te utilizatorului sa poata executa, in paralel cu coprocesorul, alte sectiuni ale programului. De exemplu, un program poate co­manda coprocesorului executia unei anumite instructiuni efectuind o operatie aritmetica. Daca programul nu are nevoie imediat de rezultatul operatiei aritmetice, el poate continua cu executarea de instructiuni de catre CPU, in timp ce coprocesorul lucreaza la indeplinirea sarcinii primite. Cind programul are nevoie de re­zultatul operatiei aritmetice, efectueaza instructiunea WAIT, al carei efect este acela de a stopa programul pina cind rezultatul asteptat devine disponibil. In fig. 5.20. este indicata schema logica a activitatilor desfasurate in paralel de catre CPU si coprocesor. Executia instructiunii WAIT poate fi evitata daca programatorul este convins ca durata executiei instructiunilor de catre CPU este mai mare decit cea de efectuare a operatiei arit­metice de catre coprocesor.

5.11.2. Registre

80287 are opt registre de date, de cite 80 biti fiecare. Fiecarui registru ii este asociat un calificator de doi biti (tag), care arata ca registrul are continut corect, infinit, zero sau ca registrul este vid.

Registrele de date nu sint direct adresabile, ca in cazul CPU, ci sint gestionate printr-un mecanism de stiva. Deci, ele sint adresabile doar prin referire la registrul din virful stivei. Deplasamentul acetuia este zero, iar numarul sau este memorat in registrul de stare.

Toate datele din registre reprezinta numere in formatul cu virgula mobila, avind structura din fig. 5.21. Se constata concordanta cu formatul dublu extins al standardului IEEE 754.

80286 | 80287

|

___________________ |

| | |

| Instructiune | |

| escape | |

|___________________| |

| |

| |

| |

________|__________ | ___________________

| | | | |

| Executia altor | | | Executia |

| instructiuni | | | instructiunii |

| normale | | | escape |

|___________________| | |___________________|

| | |

| | |

| _________|_________________|

| | |

| | |

___|_________|_____ |

| | |

| W A I T | |

|___________________|

Fig. 5.20. Exemple de prelucrare paralela cu 80287

Cimp calificator

(tag)

79 78 64 63 0 1 0

__________ ______ ____ _____________ _____________

|semn | exponent | mantisa | | |

|_____|________________|_____ _______ ______ ______| |_____________|

| | | | | |

|_____|________________|_____ _______ ______ ______| |_____________|

| | | | | |

|_____|________________|_____ _______ ______ ______| |_____________|

| | | | | |

|_____|________________|_____ _______ ______ ______| |_____________|

| | | | | |

|_____|________________|_____ _______ ______ ______| |_____________|

| | | | | | |_____|________________|_____ _______ ______ ______| |_____________|

| | | | | |

|_____|________________|_____ _______ ______ ______| |_____________|

| | | | | |

|_____|________________|_____ _______ ______ ______| |_____________|

15 0

__________ ______ ____ _______

| |

| reg. comanda |

|__________ ______ ____ _______|

| |

| reg. stare |

|__________ ______ ____ _______|

| |

| cuvint TAG |

|__________ ______ ____ _______|

| |

|____ indicator instructiune ____|

|__________ ______ ____ _______|

| |

|____ indicator date ____|

|__________ ______ ____ _______|

Fig. 5.21. Registrele intern ale coprocesorului 80287

Desi reprezentarea interna este identica pentru toate datele, 80287 poate manipula intregi de 16, 32 si 64 biti, numere in formatul cu virgula mobila cu 32 si 64 biti, precum si numere in format BCD impachetat, cu 18 cifre zecimale si semn. Conversia intre formatele extern si intern se face automat, la incarcarea in 80287 a operanzilor sau la stocarea in memoria sistemului a rezultatelor. Deci, conversia este invizibila pentru utilizator.

Cuvintele de stare si de comanda sint folosite pentru citirea starii coprocesorului si pentru alegerea diferitelor optiuni de operanzi. Fig. 5.22. ilustreaza aceste registre. Bitii mai putin semnificativi ai cuvintului de stare sint fanioane indicind apa­ritia unei exceptii, care este facuta cunoscuta CPU prin transmi­terea semnalului de intrerupere asociat. Indicatorul ES este facut 1 daca cel putin unul din indicatorii de exceptie este 1. Bitii C0 - C3 contin codurile de conditie obtinute ca rezultat al diferitelor operatii. Cimpul TOP contine numarul registrului de date aflat la virful stivei, in timp ce B este copia interna a semnalului BUSY. Cuvintul de comanda contine toti bitii de acti­vare pentru detectarea diferitelor tipuri de exceptie, precum si cimpurile de comanda folosite la definirea tipului de rotunjire, control al preciziei, infinit, folosite in calcule.

_______

| |

0 |__IE___| operatie incorecta

| |

1 |__DE___| operandul nu are forma normalizata

| |

2 |__ZE___| impartire cu zero

| |

3 |__OE___| depasire superioara (overflow)

| |

4 |__VE___| depasire inferioara (underflow)

| |

5 |__PE___| precizia

| |

6 |___X___| rezervat

| |

7 |__ES___| stare eroare

| |

8 |__C0___| cod conditie

| |

9 |__C1___|

| |

10 |__C2___|

| |

11 | |

| TOP | indicator al virfului stivei

12 | |

| |

| |

14 |__C3___| cod conditie

| |

15 |___B___| NEU ocupata (busy) (continua in pagina urmatoare) _______

| |

0 |___IM__| operatie invalida

| |

1 |___DM__| operandul in forma nenormalizata

| |

2 |___ZU__| impartire cu zero

| |

3 |___OM__| depasire superioara

| |

4 |___VM__| depasire inferioara

| |

5 |___PM__| precizie

| |

6 | |

| X | rezervat

7 |_______|

| |

8 | | comanda preciziei (00 - 24 biti; 10 - 53 biti;

| PC |

9 | | 11 - 64 biti)

|_______|

| |

10 | | comanda rotunjirii (00 - la cel mai apropiat;

| RC | 01 - spre - ; 10 - spre + ; 11 - trunchiere)

11 | |

|_______|

| |

12 | IC | tip de (0 - proiectiv ; 1 - afin)

|_______|

| |

13 | |

| |

14 | X | rezervat

| |

Fig. 5.22. Registrele de stare si de comanda

Registrul TAG contine calificatorii registrelor de date, in timp ce restul de doua registre (indicatorul instructiunii si indica­torul datelor) folosesc la memorarea adreselor instructiunii si datelor la generarea de catre 80287 a unei intreruperi.

5.11.3. Setul de instructiuni si adresarea datelor

Programatorul vede simbioza 80286 - 80287 drept o singura unita­te programabila, deoarece instructiunile necesitind interventia coprocesorului matematic pot fi inserate in fluxul normal de instructiuni ca orice alte instructiuni ale programului. Singura caracteristica distinctiva a instructiunilor coprocesorului este un anumit model de biti mai semnificativi in codului operatiei, numiti escape (ESC).

Cind CPU intilneste o instructiune ESC, codul si operanzii cores­punzatori sint transferati coprocesorului; acesta va transfera catre CPU rezultatul operatiei care trebuie stocat in memorie. Toate transferurile de date si de instructiuni in conjunctie cu coprocesorul sint, deci, efectuate prin intermediul CPU. Mai precis, unitatea de interfata cu extensia procesorului, care actioneaza intr-un mod similar mecanismului DMA, este cea care asigura transferul de informatii. Rezulta necesitatea unui ciclu suplimentar pe magistrala pentru acces la date si instructiuni, pentru a transfera spre coprocesor instructiunile sau datele citite de catre CPU sau a transfera spre CPU rezultatul pe care acesta il va depozita in memorie. Toate functiile de gestiune a memoriei fiind efectuate in interiorul CPU, mecanismul protejeaza si referirile la memorie ale coprocesorului.

CPU are acces, printr-o zona a spatiului I/O dedicata coproceso­rului aritmetic, la toate registrele interne ale acestuia.

Setul de moduri legale de adresare al coprocesorului indica toate modurile folosite de catre CPU pentru adresarea unui operand din memorie; registrele interne sint adresate numai relativ la regis­trul din virful stivei. Unul din operanzi este intotdeauna conti­nut in registrul din virful stivei, in timp ce al doilea este continut fie de un alt registru, fie de o locatie de memorie. Decurge de aici o puternica trasatura de masina cu organizare de tip stiva a coprocesorului 80287.

Instructiuni pentru transferul de date.

Instructiunile pentru transferul de date muta operanzi si con­stante dintr-o locatie a memoriei in virful stivei (notata ST0) si invers, sau intre ST0 si un alt registru al stivei. FLD, FILD, FBLD incarca ST0 cu un operand din memorie sau din alt registru. FSTP, FISTP, si FBSTP fac operatia inversa. Prima clasa de in­structiuni este de tipul push, iar a doua - din clasa pop. Infor­matia din ST0 poate fi copiata ca intreg sau real, in memorie sau registru, fara efectele specifice poeratiei pop, folosind in­structiunile FST, FIST, FBST. Pentru incarcarea in ST0 a constan­telor se folosesc instructiuni speciale; FLDZ (pentru a incarca 0.0), FLD1 (pentru 1.0), FLDPI (pentru a incarca numarul pi), FLDZT (log 10), FLDZE (log e), FLD LG 2 (lg 2), FLD LN 2 (ln 2) etc. Instructiunea FXCH interschimba continuturile STO si al registrului specificat ca operand.

Instructiuni de comparare.

Instructiunile de comparare inscriu codul de conditie C3 - C0, conform caracteristicilor operanzilor. Sint reflectate conditii de tipul ST > 0 (ST - virful stivei), ST > sursa, ST necomparabil (la instructiunea de tip comparare, testare); rezultatul valid, pozitiv, nenormalizat,+,-, etc. (la instructiunile de tip exami­nare).

Compararea simpla a numerelor reale se face cu ajutorul instruc­tiunii FCOM; FCOMP face aceeasi operatie, insotita de operatia pop. FCOMPP face comparatia celor doua registre de la virful stivei, urmata de doua operatii pop.

FICOM si FICOMP permite compararea intregilor, fara si cu insoti­rea de operatia pop. FTST face exeminarea continutului unui re­gistru operand. Comparatia se face cu numarul 0 si codurile de conditie sint inscrise corespunzator rezultatului.

Instructiuni aritmetice

Aici sint incluse cele patru operatii de baza (FADD, FSUB, FMUL, FDIV) cu intregi sau numere reale. Unul din operanzi este in STO, al doilea putind fi in memorie sau intr-un alt registru intern.

Exista si instructiuni cu un singur operand, aflat in STO:FS0RT (radical de ordinul 2), FABS (valoarea absoluta, modulul), FCHS (schimbarea semnului), FRNDINT (rotunjirea la valoarea intreaga).

Functii transcendente

In aceasta clasa intra doua functii trigonometrice : FPTAN (tan­genta) si FPATAN (arctg). Operandul primei functii este ST0, iar cel al celei de a doua - ST0/ST1. De asemenea, coprocesorul poate evalua logaritmul in baza 2 al valorii absolute a continutului lui ST0 (cu instructiunea FYL2X) sau al urmatorului registru din stiva (ST0+1) (cu instructiunea FYL2XP1). In ambele cazuri loga­ritmul este inmultit cu continutul lui ST1, ceea ce permite obti­nerea logaritmului natural sau zecimal prin incarcarea cu cons­tanta corespunzatoare a lui ST1. In fine, se mai poate calcu­la 2m-1 (instructiunea F2XM1), cu m memorat in ST0.

Instructiuni de control

In acesta categorie sint incluse instructiunile care influenteaza comportarea coprocesorului. FLDCW si FSTCW incarca, respectiv memoreaza, continutul registrului de comanda. Cuvintul de stare poate fi doar memorat, cu instructiunea FSTSW.

Exista instructiuni de salvare si restaurare a starii (FSAVE, FRSTOR) si a contextului (FSTENV, FLDENV), necesare in conditiile comutarii de taskuri. Alte instructiuni reseteaza indicatorii de exceptie (FCLEX), incrementeaza si decrementeaza indicatorul stivei de registre (FINCSTP si FDALSTP), sau initializeaza copro­cesorul (FINIT).

5.11.4. Exceptii

Executia instructiunilor escape poate crea diferite tipuri de conditii ilegale. Unele sint generate de catre 80287, in timp ce altele constituie situatii tipice detectate si in desfasurarea instructiunilor obisnuite. Exceptiile "normale" sint cele cauza­te de adresare dincolo de limita permisa a operandului sau a codului operatiei, sau de violare a protectiei pe durata execu­tiei instructiunii escape. Astfel de exceptii sint detectate direct de catre CPU, intrucit toate referirile la memorie trec prin unitatea de interfata cu extensia procesorului.

Coprocesorul detecteaza exceptii legate de operatii aritmetice; acestea sint:

- operatie incorecta: exceptia corespunde aparitiei unor conditii de forma 0/0, - , depasirii superioara sau inferioara a stivei, tentativei de utilizare de operanzi care nu au valori numerice (ele sint recunoscute dupa aspectul special al structurii de biti);

- depasire superioara (overflow): produsa de un rezultat prea mare pentru a putea fi reprezentat in formatul dorit: rezultatul este "set-to-infinity";

- depasire inferioara (underflow): produsa de un rezultat nenul, dar prea mic pentru a putea fi reprezentat in for­matul dorit. Rezultatul este reprezentat in forma nenor­malizata;

- impartitor nul: exceptia apare cind impartitorul este zero, iar deimpartitul nu este zero sau infinit. Rezulta­tul este "set-to-infinity";

- operand in format nenormalizat: cel putin unul din ope­ranzi este reprezentat in forma nenormalizata;

- rezultat imprecis: indicatorul respectiv este inscris cu 1 si exceptia semnalata (daca nu este marcata) cind rezul­tatul nu este reprezentat in formatul prescris.

Toate exceptiile listate sint mascabile prin indicatorii corespunzatori in cuvintul de comanda. Daca este activata, aparitia unei exceptii produce activarea semnalului ERROR folosit pentru a intrerupe CPU. Rutina de tratare a intreruperii va citi cuvintul de stare, ce permite identificarea exceptiei.

5.1.2. Concluzii

Din analiza efectuata rezulta ca iAPX 286 dispune de facilitati deosebite de gestiune si protectie a memoriei. In comparatie cu alte microprocesoare din aceeasi clasa, iAPX 286 se distinge prin absenta unei unitati hardware, exterioare microprocesorului, care sa efectueze operatiile cerute de conversia adreselor virtuale in adrese fizice, ca si de testare a drepturilor de acces. In aceeasi ordine de idei, tabelele de conversie sint potential sub controlul programului, deoarece CPU poate adresa, la un anumit moment, numai segmentele ale caror selectoare sint memorate in cele patru registre de segment vizibile de catre programator. Acest fapt poate complica, intr-o anumita masura, gestiunea seg­mentelor, dar, pe de alta parte, poate oferi sansa utilizarii optime a celor patru registre in operatiile de gestiune a memoriei.

iAPX 286 implementeaza patru niveluri de privilegiu, comparativ cu numai doua in alte microprocesoare. Ele sint insotite de un puternic set de teste, implementate prin microprogramele instruc­tiunilor, cu care se pot implementa toate regulile de protectie indicate in cap. 4. Este de remarcat ca mecanismele de tratare a intreruperilor si capcanelor sint supuse acelorasi legi de pro­tectie folosite pentru gestiunea taskurilor si apelarea procedu­rilor.

Exista o slaba ortogonalitate a organizarii registrelor si setu­lui de instructiuni, desi unele registre (cum este CX) au volume deosebit de importante in executia unor instructiuni. Se pare ca o astfel de optiune a fost impusa si de necesitatea pastrarii compatibilitatii cu produse anterioare ( iAPX 86/88/186/188), si, cum iAPX 286 poate rula si in modul cu adrese reale, el poate fi considerat ca un super - iAPX 86.

In concluzie, forta sistemului iAPX 286 este datorata suportului oferit pentru protectia memoriei si gestiunea taskurilor, imple­mentate prin microprogram. Slaba ortogonalitate intre registre si setul de instructiuni constituie un punct slab al sistemului, partial compensat de compatibilitatea cu microprocesoarele ce l-au precedat.


Document Info


Accesari: 2137
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )