Sistemul iAPX 386 (Intel)
6.1. Introducere
Sistemul iAPX 386 este o continuare logica a dezvoltarii familiei de microprocesoare produse de catre firma Intel. El contine microprocesorul 80386, o structura evoluata, cu lungimea de 32 biti a cuvintului de date. Principalele obiective avute in vedere de realizatori sint legate de aplicatii cu ridicate cerinte privind viteza, precum si de oferirea de facilitati de optimizare a functionarii in regim multitasking.
Fata de iAPX 286, sistemul discutat in acest capitol are un spatiu de adresare considerabil marit ( 232 sau 4 Gocteti de memorie fizica si 2 46 sau 64 teraocteti de memorie virtuala). S-au perpetuat mecanismele anterior elaborate de gestiune si protectie a memoriei, la care s-au adaugat noi structuri arhitecturale menite sa imbunatateasca functionarea in regim multitasking, precum si sa ofere suport adecvat pentru multiple sisteme de operare.
O atentie speciala a fost acordata posibilitatilor de testare si depanare a programelor. In acest scop s-au introdus registre suplimentare de breakpoint si moduri speciale de lucru.
Nu este de neglijat nici preocuparea proiectantilor de a pastra compatibilitatea microprocesorului 80386 cu intrega familie 8086, fapt ce permite rularea in conditii sporite de eficienta a unor programe indelung testate.
6.2. Principalele caracteristici arhitecturale
6.2.1. Introducere
Microprocesorul 80386 este compus din trei unitati principale:
- unitatea centrala de prelucrare;
- unitatea de gestiune a memoriei;
- unitatea de interfata cu magistrala.
Schema bloc a microprocesorului (fig. 6.1.) permite evidentierea unor componente ale acestor unitati.
Astfel, unitatea centrala de prelucrare este alcatuita din unitatea instructiunii si unitatea de executie. Unitatea instructiunii are ca obiectiv decodificarea codurilor operatiilor si stocarea acestora in sirul instructiunilor decodificate, in vederea utili
Fig. 6.1. Schema bloc a microprocesorului 80386 zarii lor imediate de catre unitatea de executie. Aceasta are in componenta sa cele opt registre de uz general (fiecare avind dimensiunea de 32 biti), folosite pentru manipularea datelor si evaluarea adreselor. Lor li se adauga un dispozitiv special de deplasare / rotire (barrel shifter), operind cu cuvinte de 64 biti, care permite executia rapida a operatiilor de deplasare, rotire, inmultire, impartire. Astfel, inmultirea a doi operanzi de 32 biti fiecare dureaza mai putin de o microsecunda.
Unitatea de gestiune a memoriei (MMU) are in structura sa o unitate de segmentare si o alta de paginare. Segmentarea este utilizata in gestionarea spatiului de adrese virtuale prin oferirea unei componente suplimentare a adresarii (echivalenta cu un nivel de indirectare), indispensabila pentru asigurarea caracteristicii de relocare a codului si datelor, precum si pentru utilizarea in comun de catre programe, proceduri, taskuri etc. de date si cod. Mecanismul de paginare este suprapus peste cel de segmentare. El este transparent fata de segmentare si eeste destinat gestionarii spatiului de memorie fizica. Fiecare segment este divizat in una sau mai multe pagini de 4Ko.
Unitatea de interfata cu magistrala asigura comunicatia microprocesorului cu restul componentelor folosite pentru realizarea unui sistem de calcul.
6.2.2. Registre.
Microprocesorul 80386 dispune de 32 registre, grupate in urmatoarele categorii:
- registre de uz general;
- registre de segment;
- indicatoare de conditie (flags);
- indicator al instructiunii (instruction pointer);
- registre de comanda;
- registre de adresa sistem ;
- registre de depanare;
- registre de testare.
Intregul sistem a fost astfel gindit incit sa se pastreze compatibilitatea cu microprocesoarele din generatiile anterioare. In consecinta, registrele de 16 biti ale microprocesoarelor 8086, 80286 etc. se regasesc in setul de registre ale sistemului iAPX 386.Registrele de uz general au primit prefixul E la numele "clasic" : EAX ca extensie de 32 biti a registrului de 16 biti AX s.a.m.d. Fig.6.2. prezinta aceste registre considerate ca aprtinind arhitecturii de baza a sistemului. Ele sint considerate ca definind starea unui task, asa ca ele sint automat incarcate/salvate in cadrul operatiilor de comutare a taskurilor.
31 16 15 0
__________ ______ ____ _____ _______ ______ _______
| | |
| | AH AX AL | EAX
|____________________|__________ ______ ____ _|
| | |
| | CH CX CL | ECX
|____________________|__________ ______ ____ _|
| | |
| | DH DX DL | EDX
|____________________|__________ ______ ____ _|
| | |
| | BH BX BL | EBX
|____________________|__________ ______ ____ _|
| | |
| | BP | EBP
|____________________|__________ ______ ____ _|
| | |
| | SP | ESP
|____________________|__________ ______ ____ _|
| | |
| | SI | ESI
|____________________|__________ ______ ____ _|
| | |
| | DI | EDI
|____________________|__________ ______ ____ _|
Registre generale pentru date si adrese
15 0
__________ ______ ____ ___
| |
|__________ ______ ____ __| CS Cod
| |
|__________ ______ ____ __| SS Stiva
| |
| | DS
| |
|__________ ______ ____ __| ES Date
| |
|__________ ______ ____ __| FS
| |
|__________ ______ ____ __| GS
(continua in pagina urmatoare)
Registre de segment
_31_____________16___15______________0_
| | | EIP Indicator |__________________|___________________| instructiune
| | |
|__________________|___________________| EFLAGS Indicatori
de conditie
Fig.6.2. Registrele arhitecturii de baza
Se constata adaugarea (fata de iAPX 286) a doua noi registre de segment (FS si GS), ceea ce confera o mai mare flexibilitate manipularii datelor. Toate aceste registre au o parte "vizibila", de 16 biti, si una invizibila, manipulata automat de catre sistem. Registrul indicatorilor de conditie (EFLAGS) are cai mai putin semnificativi biti (0 - 15) identici cu cei ai registrului corespondent al microprocesoarelor anterioare. Bitii 16 (RF) si 17 (VM) constituie elemente noi ale sistemului iAPX 386. RF (resume flag - indicator de reluare) este utilizat in scopuri de depanare, in conjunctie cu registrele de breakpoint. VM (virtual memory) permite introducerea microprocesorului 80386 in modul de functionare numit "virtual 8086 mode" (mod de operare 8086). VM poate fi inscris cu 1 doar cind 80386 functioneaza in modul protejat. In acest caz, microprocesorul se comporta ca un microprocesor 8086, in sensul ca manipularea segmentelor se face dupa aceleasi reguli. Totusi, opereaza exceptia 13 (a se vedea cap.5) la tentativa de utilizare a instructiunilor privilegiate.
Registrele descriptorilor de segmente sint folosite in conjunctie cu mecanismele de gestiune a memoriei si de protectie. Ele nu sint vizibile programatorului, fiind manipulate de catre sistemul iAPX 386. Ele constituie partea "invizibila" a registrelor de segment si sint compuse din urmatoarele cimpuri:
- un cimp al adresei baza a segmentului (32 biti)
- un cimp al limitei segmentului (32 biti)
- un cimp al atributelor segmentului
Cind programul incarca intr-un registru de segment valoarea selectorului, sistemul incarca automat in registrul de descriptori informatia corecta in legatura cu segmentul specificat. Aceste informatii sint utilizate la evaluarea adresei fizice de memorie la care se face referirea prin program. Adresa baza permite evaluarea adresei fizice la care este incarcat segmentul, limita permite testarea incadrarii adresei in dimensiunea predefinita a segmentului, iar atributele permit validarea tipului de acces la memorie solicitat. Dupa cum se va vedea, iAPX 386 functioneaza in unul din doua moduri principale: real address mode (mod de lucru cu adrese reale) si protected mode (mod de lucru protejat sau mod de lucru cu adrese virtuale). In primul caz dimensiunea maxima a unui segment este de 64 Kocteti, iar adresa baza se obtine prin simpla deplasare la stinga cu 4 pozitii a selectorului segmentului. In felul acesta, modul real de functionare asigura compatibilitatea cu 8086. Evident, in modul real actualizarea cimpului adresei baza a segmentului se face exclusiv pe baza informatiilor din selectorul segmentului, iar celelalte doua cimpuri ale registrului descriptorilor sint fixe in modul real.
In cadrul sistemului iAPX 386 exista trei registre de comanda (control registers), numite CR0, CR2 si CR3. Dimensiunea acestor registre este de 32 biti. Ele contin informatii globale referitoare la starea sistemului (deci - nu in conjunctie cu un anumit task). Denumirea registrelor poate parea logica, dar CR1 este rezervat pentru dezvoltari ulterioare ale familiei Intel.
Registrul CR0 (machine control register) contine informatii de stare si comanda. Jumatatea sa mai putin semnificativa este identica cu MSW din cadrul sistemului iAPX 286. Doar 6 din cei 32 biti sint utilizati,in functiile lor sint descrise in continuare. PE (protection enable): foloseste la activarea modului protejat de functionare (PE = 1). Cind PE = 0 modul de functionare este cel cu adrese reale.
ET (processor extension type): este utilizat la stabilirea tipului de coprocesor matematic existent in sistem : 80287(ET=0) sau 80387 (ET = 1).
EM (emulate coprocessor): acest bit permite generarea exceptiei 7 (a se vedea cap.5) cind EM = 1 si s-a facut tentativa de utilizare a coprocesorului. El este inscris cu 0 de catre rutina de tratare a exceptiei mentionate (in urma salvarii contrxtului coprocesorului).
TS (task switched): bitul TS este inscris automat cu 1 cind are loc o comutare de taskuri. Acest fapt permite salvarea completa a contextului unui task incluzind si pe cel al procesorului matematic) atunci cind un altul incearca a folosi coprocesorul.
MP (monitor coprocesor): si acest bit foloseste la optimizarea procesului de salvare a contextului in regim multitasking. Daca TS=1 si MP=1, executarea de catre microprocesor a instructiunii WAIT (care indica asteptarea unui rezultat de la coprocesor) genereaza o capcana de tip 7. In caz contrar generarea capcanei nu are loc.
PG (paging enable): acest bit, specific sistemului iAPX 386, permite comanda activarii/dezactivarii unitatii de paginare din circuitul ce contine microprocesorul. Registrul CR2 (page fault linear address) permite evidentierea situatiilor in care s-a solicitat acces la o pagina inexistenta in memoria sistemului (actiune caracterizata prin page fault - eroare de pagina sau pagina absenta). In acest registru se inscrie adresa de 32 biti a paginii absente cel recent adresata (cum s-a mai aratat, tentativa de adresare a unei pagini absente declanseaza o capcana). Rutina de tratare a capcanei activate permite incarcarea paginii solicitate.
Registrul CR3 contine adresa fizica baza in tabelul cu directorul de pagini (page directory table). Intrucit paginile au dimensiuni de 4 Ko (212), adresa fizica a unei pagini are cei 12 biti mai putin semnificativi egali cu 0.
Este de mentionat faptul ca unitatea de paginare dispune de o memorie cache operand in conjunctie cu registrul CR3. Deci, modificarea continutului acestuia (prin comutare de taskuri sau altfel) face inutila informatia continuta de unitatea de paginare; care trebuie reactualizata corespunzator noii valori din CR3.
In clasa registrelor pentru adrese sistem intra patru registre speciale, care exista si in cadrul sistemului iAPX 286:
GDTR (global descriptor table register, referitor la tabelul descriptorilor globali)
LDTR (local descriptor table register; referitor la tabelul descriptorilor locali)
IDTR (interrupt descriptor table register; referitor la tabelul descriptorilor intreruperilor)
TR (task register, referitor la segmentul de stare a taskului, TSS)
Rolul lor este acelasi cu cel al registrelor omonime ale microprocesorului 80286, despre care s-a discutat in cap.5.
Registrele de depanare DR0 - DR7 ofera programatorului sprijinul necesar depanarii programelor. Doar 6 din cele 8 registre de 32 biti sint accesibile (DR4 si DR5 sint rezervate pentru dezvoltari ulterioare). DR0, DR1, DR2, DR3 contin adrese de intrerupere a executiei, iar DR6 (breakpoint status) furnizeaza informatii de stare. Aceste registre sint utilizate in conjunctie cu capcana 3 (breakpoint); DR0 - DR3 contin adrese de oprire. In DR7 se indica lungimea cimpului rezervat punctului de intrerupere (1, 2, sau 4 octeti), ca si alte conditii specifice ce pot produce intreruperea :executia unei instructiuni (instruction execution only), inscrierea unei informatii (data write only) sau citirea / inscrierea unei informatii (data reads and writes only).
In fine, registrele de testare (TR6 si TR7) folosesc pentru comanda testarii memoriilor RAM si CAM (content addresabile memory - memorie adresabila prin continut) folosite in mecanismul de conversie a adreselor TR6 este registru de comanda a testarii, iar TR7 contine informatii privind rezultatele testarii. Este de mentionat ca mecanismul de conversie mentionat este specific microprocesorului 80387 si producatorul nu garanteaza utilizarea lui in aceeasi structura si la generatii ulterioare.
6.3. Principalele tipuri de date
Sistemul iAPX 386 a fost proiectat pentru a putea opera cu toate tipurile de date cerute de implementarea limbajelor de programe de nivel inalt. Structurile de date de baza sint octetul (8 biti) cuvintul (16 biti) si cuvintul lung (32 biti). Toate aceste unitati pot fi citite sau inscrise intr-un singur ciclu. Exista si instructiuni care manipuleaza date cu un numar de biti mai mare de 32. In continuare sint indicate tipurile de date direct manipulate de catre iAPX 386.
- bit : entitate compusa dintr-un singur bit;
- cimp de biti: un grup de maximum 32 biti, situati intr-o zona contigua ce se intinde pe maximum 4 octeti;
- sir de biti: o multime contigua compusa din maximum 4 giga biti (232);
- intregi de 8 biti octeti (fara semn sau cu semn) : un octet. Numerele negative se exprima prin complementul fata de 2, conventie folosita si pentru celelalte tipuri de intregi
- intregi de 16 biti (cuvint) (fara semn sau cu semn): o entitate de doi octeti consecutivi (16 biti)
- intregi de 32 biti (cuvint dublu) (fara semn sau cu semn): o entitate de patru octeti consecutivi
- intregi de 64 biti (cuvint cvadruplu) (fara semn sau cu semn): o entitate de opt octeti consecutivi
- offset: o entitate de 16 sau 32 biti care, in mod indirect, face referire la o locatie de memorie
- indicator: un numar folosit pentru a face referire la o locatie de memorie. El este dat de un selector de 16 biti si un offset de 16 sau 32 biti
- octeti ASCII: octeti care contin codul ASCII al unui caracter alfanumeric sau de comanda
- BCD neimpachetat: octeti reprezentind o singura cifra zecimala (in cei 4 biti mai putin semnificativi)
- BCD impachetat: octeti reprezentind doua cifre zecimale, cite una in cite 4 biti
- formatul cu virgula mobila: acest tip de date este utilizat doar in conjunctie cu procesorul matematic 80387 sau 80287. Se folosesc formatele cu 32, 64 si 80 biti, in conformitate cu standardul IEEE 754. Daca sistemul hardware nu contine coprocesor, este necesara emularea lui prin program.
6.4. Moduri de adresare.
Sistemul iAPX 386 ofera aceleasi 7 moduri de adresare, ca iAPX 286 (cu mici variatii) alese astfel incit sa acopere, practic toate cerintele impuse de utilizarea limbajelor de nivel inalt. Fata de sistemul anterior, iAPX 386 foloseste indexarea cu N = 0, 1, 2 sau 3, corespunzind inmultirii cu ceea ce Intel numeste factor de scala, cu valorile 1,2,4 sau 8. In felul acesta se imbunatatesc performantele privind accesul la structuri de date complexe. Modurile de adresae ale sistemului iAPX 386 sint sintetizate in Tabelul 6.1.
Tabelul 6.1. Moduri de adresare in sistemul iAPX 386
__________ ______ ____ __________ ______ ____
Tip Denumirea Intel Adresare
__________ ______ ____ __________ ______ ____
Directa prin registru Register operand G(g)
(register operand)
Cu autoincrementare Direct address M (M(PC),PC:=PC+1
(autoincrement)
Imediata Immediate M(PC), PC:=PC+1
(immediate)
Indirecta prin registru Register indirect M(G(g))
(register indirect)
Indirecta bazata si cu Based, indexed (g M(G(g)+d)
deplasament este fie registru
(base displacement baza, fie registru
indirect) index)
Indirecta bazata Based index,
indexata Basedscaled index M(G(g1)+G(g2).sh.N In realizarea microprocesorului iAPX 386 s-a tinut seama de necesitatea pastrarii compatibilitatii cu generatoarele anterioare, 80286 si 8086, procesoare avind cuvintul de date de 16 biti. In aceste conditii 80386 poate execcuta instructiuni de 16 biti atit in modul real, cit si in cel protejat. Dimensiunea instructiunii rezulta din examinarea bitului D din descriptorul segmentului CS. Acesta este 0 in cazul lungimii de 16 biti si 1 pentru lungime de 32 biti.
Indiferent de dimensiunea operanzilor sau adreselor, 80386 poate executa instructiuni fie de 16 biti, fie de 32 biti. Pentru utilizarea acestei facilitati s-au prevazut prefixe, unul pentru dimensiunea operandului (operand size prefix) si celalalt - pentru lungimea adresei (address lenght prefix). Ele anuleaza semnificatia bitului D doar pentru instructiunea pe care o prefixeaza.
In fig. 6.3. este indicat sintetic, modul de evaluare a adresei in cadrul sistemului iAPX 386. Din examinarea ei decurge necesitatea dispozitivului de adunare cu trei operanzi, ca si a celui de deplasare (barrel - shifter) prezente in schema bloc a microprocesorului.
Fig. 6.3. Evaluarea adreselor in cadrul sistemului iAPX 386 6.5. Setul de instructiuni
6.5.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 PS si, respectiv, ES, cu cite doua 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:EBX, iar AL serveste ca index. La teminarea executiei in AL se gaseste octetul adresat in tabel.
6.5.2. Instructiuni aritmerice
Setul de instructiuni al sistemului iAPX 386 contine facilitati legate de cele patru operatii de baza. Pentru adunare sint disponibile instructiunile ADP (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) ,de 16 biti (cu rezultatul de 32 biti), sau de 32 biti rezultatul avind 64 biti). Unul din operanzii inmultirii se afla in registrul AL, AX sau EAX, in functie de lungimea sa. Rezultatul este memorat in AX, EAX sau in perechea EAX:EDX.
Si in cazul impartirii se face distinctia intre operanzii cu semn (DIV) si cei fara semn (DIN). Deimpartitul trebuie incarcat in AX,EAX sau in perechea AX:DX. Impartitorul poate avea 8, 16 sau 32 biti. Citul se depune in AL, AX sau EAX, iar restul se stocheaza in AH, partea mai semnificativa a lui EAX sau in EDX, in functie de dimensiunile elementelor respective.
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). D indica operanzii in format BCD neimpachetat, iar A - operanzi sub forma de caractere ASCII.
Setul de instructiuni mai contine posibilitatea de a extinde semnul unui operand: CQD converteste operandul de 32 biti (din EAX) in unul cuadruplu (64 biti), prin extinderea in EDX a bitului de semn; 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.
6.5.3. Instructiuni logice si de deplsare.
iAPX 386 ofera instructiunile clasice pentru operatii logice AND, OR, NOT, XOR. 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 continuat cu bitul CF (RCL-stinga, RCR-dreapta).
6.5.4. Prefixe
O caracteristica a setului de instructiuni ale sistemului iAPX 386 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 ECX 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 ECX <> 0
REPNZ - repetitia are loc atita timp cit ZF=0 sau ECX <> 0
Prefixele de repetare permit programatorului sa obtina operatii cu siruri, incarcind in ECX 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 ECX.
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 intervalurilor 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.
6.5.5. Instructiuni cu matrici si siruri
In cadrul sistemului iAPX 386 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 (ESI) sau destinatie (EDI). 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 ECX, folosit drept contor.
Pentru transferul de siruri se foloseste instructiunea MOVS, care copiaza continutul locatiei indicata de ESI in locatia a carei adresa este obtinuta prin combinarea continutului registrului de segment ES cu continutul registrului EDI. Prefixarea cu REP a instructiunii MOVS duce la copierea sirului sursa, a carui dimensiune este initial incarcata in ECX, in sirul destinatie.
Sistemul ofera o instructiune pentru compararea sirurilor, CMPS. Ea compara operandul indicat prin ESI cu cel indicat prin ES:EDI. 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 ECX 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:EDI. Prefixul REPNE are ca efect repetarea compararii fie pina la identificarea elementului in discutie, fie pina cind continutul contorului ECX 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:EDI pentru operatia INS sau ES:ESI pentru OUTS, registrul ECX 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:EDI continutul registrului AL (8 biti), AX (16 biti) sau EAX (32 biti). Cea de a doua inscrie in registrul AL, AX sau EAX continutul locatiei (8 biti sau, respectiv, 16 biti) indicata prin ES:ESI. Ambele operatii sint insotite de modificarea adecvata a registrului index. Decrementarea continutului contorului ECX 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.
O 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. Tot pentru tratarea structurilor matriciale de date sint folosite modalitatile de adresare cu indexare despre care s-a mai discutat.
6.5.6. Instructiuni de comparare si de comanda
In sistemul iAPX 386 exista o serie de indicatori de conditie si stocarea acestora este folosita in conjunctie cu instructiuni de salt, numit salt conditionat, pentru ca rularea 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, JECXZ, care permite efectuarea saltului doar atunci cind continutul registrului ECX este zero. Se reaminteste ca registrul ECX 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 ECX, al carui continut este decrementat cu o unitate, dupa care se testeaza continutul LOOP efectueaza saltul daca ECX <> 0; LOOPE/LOOPZ efectueaza saltul daca ZF = 1 si ECX <> 0; LOOPNE/LOOPNZ efectueaza saltul daca ZF = 0 si ECX <> 0. Evident, registrul ECX 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. Instructiunile de apelare pot activa o procedura al carei cod se afla in acelasi segment cu programul chemator sau intr-un alt segment. In aceeasi idee, sint necesare doua tipuri de instructiuni return: una, de returnare intrasegment,cealalta, de returnare intersegment.
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.
6.5.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 impiedica modificarea 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 derectie 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 registrelor de comanda a masinii CR0, CR2, CR3.
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 (LDD-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 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 in conjunctie cu procesorul matematic, instructiunea nu necesita vreun privilegiu special pentru a fi executata.
6.6. Protectia memoriei
Mecanismele de protectie a memoriei sistemului iAPX 386 sint, practic, identice cu cele ale lui iAPX 286. Exceptia o constituie mecanismul de paginare, care va fi descris intr-un paragraf ulterior.
Si in sistemul iAPX 386 s-a adoptat solutia unui dublu mecanism de conversie a adresei virtuale in adresa fizica: primul se refera la spatiul global sau spatiul virtual suprapus, care transfera o aceeasi adresa virtuala dintr-un task intr-o aceeasi adresa fizica. Cel de al doilea mecanism transforma adrese virtuale identice din taskuri distincte in adrese fizice distincte. Diferenta 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.
Evaluarea adresei fizice utilizeaza 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 localiza 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.
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. Descriptorii 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.
Daca toate referirile la memorie in cadrul sistemului iAPX 386 ar necesita folosirea dublului mecanism descris, consumul de timp ar fi prohibitiv. De aici decurge justificarea existentei registrelor descriptorilor de segment, invizibile programatorului, dar incarcate automat de catre sistem (cu informatiile continute in LDT sau GDT si indexate de selectorul segmentului) ori de cite ori programul modifica informatia continuta in registrul de segment. 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.
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.
6.6.1. Reguli de protectie
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 superior, celui al subrutinei apelate.
Aceste reguli decurg din ipoteza ca fiabilitatea unui program este mai mare cind nivelul 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 verificare. 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 386 interzice asemenea apelari.
6.6.2. Testarea codului privilegiului
Codurile de privilegiu sint memorate in mai multe locuri in cadrul structurilor informatiilor de comanda ale sistemului:
RPL (requested privilege level) - in registrul de segment;
DPL (descriptor privilege level) - in descriptorul de segment sau in portile de apelare, intrerupere, capcana, task;
Se mai folosesc:
CPL (current privilege level) - nivelul curent de privilegiu al unui task, rezultat din modificarile de nivel de privilegiu cauzate de accesul prin intermediul portilor la un segment de cod cu nivel diferit de privilegiu.
EPL (effective privilege level) - pentru un task dat are valoarea egala cu max (RPL , CPL). El are rolul de a asigura ca un segment de cod neprivilegiat nu poate avea acces la date privilegiate.
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 conformitate 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, asa cum s-a vazut pentru sistemul iAPX 286.
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.
Toate mecanismele de protectie, care testeaza corectitudinea transferului controlului, implementate in sistemul iAPX 386 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.
Respectarea regulilor de privilegiu presupune urmatoarele:
- modificarile de privilegiu au loc numai la transferul controlului prin intermediul portilor;
- instructiunile JMP pot adresa un segment de cod conform, cu nivel de privilegiu egal sau superior, sau un segment neconform cu acelasi nivel de privilegiu;
- instructiunile CALL pot apela direct segmente de cod neconforme cu acelasi nivel de privilegiu sau , prin intermediul portilor, segmente cu nivel de privilegiu egal sau superior;
- intreruperile survenite in timpul rularii unui task sint guvernate de aceleasi reguli ca instructiunea CALL;
- segmentele de cod conforme sint accesibile prin niveluri de privilegiu inferioare sau cel mult egale cu nivelul DPL al segmentului conform;
- nivelul RPL din registrul de segment si nivelul CPL trebuie sa fie cel putin la fel de privilegiate ca nivelul DPL al portii;
- segmentul de cod selectat prin poarta trebuie sa fie cel putin la fel de privilegiat ca nivelul CPL al taskului;
- instructiunea return care nu produce comutarea de taskuri poate returna controlul unui segment de cod cel mult la fel de privilegiat;
- comutarea taskurilor se poate efectua prin CALL, JMP sau INT, care fac referire fie la o poarta de task, fie la un segment de stare a taskului avind nivelul DPL cel mult la fel de privilegiat ca nivelul CPL al vechiului task.
Celelalte probleme legate de mecanismul de protectie sint similare modului de tratare in cadrul sistemului iAPX 286. Particularitatile sint date de dimensiunea mai mare a cuvintului de date si, implicit, a registrelor microprocesorului 80386.
6.7 Paginarea
Asa cum s-a discutat in capitolul 4, segmentarea cu paginare pare a fi cea mai eficienta metoda de gestiune a memoriei in sistemele multitasking. Avantajul oferit de paginare consta in dimensiunea uniforma a paginii, fapt ce faciliteaza operatiile de incarcare-evacuare. Desigur, spre deosebire de segmente, paginile nu sint legate de logica programului, deci nu este obligatorie existenta simultana a tuturor paginilor in memoria fizica. Si in acest caz opereaza principiul localitatii programelor, permitind obtinerea unei rate inalte de succes (numarul de referiri la locatii de memorie continute in paginile incarcate in memoria principala raportat la numarul total de referiri la memorie). In cele ce urmeaza se descrie implementarea conceptului de paginare in cadrul sistemului iAPX 386.
6.7.1 Mecanismul de paginare
Proiectantii sistemului mentionat au folosit doua niveluri de tabele pentru conversia adresei liniare (produsa de mecanismul de segmentare) in adresa fizica. Aceste tabele sint numite Page directory (director de pagini) si page table (tabel de pagini). Realizarea mecanismului de paginare foloseste registrul de comanda CR3, care contine adresa baza pentru directorul de pagini. Acest tabel contine un numar de pina la 1024 intrari (210) de cite 32 biti, indicind adresa baza a unuia din cele maximum 1024 tabele de pagina ce pot fi manipulate de catre sistem. Numele tabelului de pagina continind locatia de memorie la care se face referirea este continut in cei 10 biti mai semnificativi (31 - 22) ai adresei liniare. O data stabilit tabelul de pagina, numele paginii in cadrul acestuia este indicat de urmatorii 10 biti (21 - 12) ai adresei liniare de 32 biti. In locatia de 32 biti astfel indicata a tabelului de pagina se afla adresa fizica de inceput a paginii de memorie fizica in discutie. Cum paginile au dimensiunea fixa de 4 kocteti (212 octeti), cei mai putin semnificativi 12 biti ai adresei de inceput a uinei pagini din memoria fizica sint 0. Adresa fizica a locatiei adresate se obtine adunind la adresa fizica de inceput a paginii offsetul de 12 biti in cadrul paginii, offset continut in cele 12 pozitii mai putin semnificative (11 -0) ale adresei liniare. Sintetic, mecanismul de paginare este ilustrat in fig. 6.4.
Cuvintele continute de catre directorul de pagina au formatul din fig. 6.5a, iar fig. 6.5b prezinta formatul informatiilor din tabelul de pagini. Bitii A (accessed) si P (present) au semnificatiile descrise anterior. D (dirty - "murdarit") este facut 1 inaintea unei operatii de inscriere in memoria alocata paginii respective. U/S indica functionarea in mod utilizator (user) sau supervizor (supervisor), modul utilizator fiind caracterizat de nivel al privilegiului egal cu 3. R/W defineste drepturile de acces in modul utilizator: R/w = 1 permite citirea/inscrierea, pe cind R/W = 0 permite doar citirea paginii referite.
Fig. 6.4 Mecanismul de paginare utilizat in sistemul iAPX 386
31 12 11 9 8 7 6 5 4 3 2 1 0
-------- ----- ------ ----- ----- ------------
|Adresa in tabelul |Rezervat pt.|0|0|D|A|0|0|U/S|R/W|P|
|de pagina |sist. op. | | | | | | | | | |
-------- ----- ------ ----- ----- ------------
a. Cuvint din directorul de pagini
31 12 11 9 8 7 6 5 4 3 2 1 0
-------- ----- ------ ----- ----- ------------
|Adresa de inceput |Rezervat pt.|0|0|D|A|0|0|U/S|R/W|P|
|a paginii |sist. op. | | | | | | | | | |
-------- ----- ------ ----- ----- ------------
b. Cuvint din tabelul de pagini
Fig. 6. 5 Informatiile continute de directorul de pagini si de tabelul de pagini.
Data fiind dimensiunea finita a memoriei fizice, iAPX 386 utilizeaza un mecanism de tip cerere de pagina (demand paged) de gestiune a memoriei (a se vedea capitolul 4). Pentru a se evita insotirea operatiei de acces la o locatie de memorie fizica de alte doua operatii de acces la memorie (ona pentru directorul de pagini si alta pentru tabelul de pagini corespunzator), s-a prevazut o memorie cache de mare viteza, continind datele despre cele mai recent adresate 32 pagini de memorie (mecanismul "least recently used" - a se vedea capitolul 4). Aceasta memorie, numita translation lookaside buffer, prescurtat TLB (tampon de conversie a adresei liniare in adresa fizica), permite ca rata de succes sa atinga valori de 98%. Deci, prin folosirea unei memorii rapide de 4 Kocteti/pagina x 32 pagini = 128 Kocteti, se obtine un sistem de calcul cu viteza de acces la memorie corespunzatoare celor mai scumpe circuite si cu costul pe unitatea de informatie memorata corespunzator memoriei celei mai ieftine (pe hard disk). In situatia (cu o probabilitate de circa 0,02) in care detaliile necesare accesului la memorie nu sint continute de catre TLB, se declanseaza mecanismul din fig. 6.3 si informatia din TLB se actualizeaza corespunzator. Daca pagina solicitata nu se afla in memoria fizica (bitul P asociat ei are valoarea 0) se genereaza capcana 14 (page fault), a carei tratare presupune incarcarea paginii in discutie. Numele acestei pagini este continut in registrul de comanda CR2.
6.8 Concluzii
Analiza efectuata evidentiaza calitatile deosebite ale sistemului iAPX 386, considerabil imbunatatit fata de predecesorul sau prin:
- extinderea la 32 biti a lungimii cuvintului de date, insotita de modificarea adecvata a dimensiunii registrelor disponibile programatorului;
- extinderea la 4 Gocteti a spatiului de memorie fizica si la 64 Tocteti a celui de memorie virtuala;
- imbogatirea facilitatilor destinate implementarii programelor scrise in limbaje de nivel inalt (prin completarea adecvata a modurilor de adresare);
- implementarea posibilitatii de lucru in modul virtual 8086, ceea ce permite crearea unui super-8086, cu viteza de lucru considerabil sporita;
- prevederea unui sistem perfectionat de depanare a programelor (prin facilitatile speciale de breakpoint)
Din analiza efectuata rezulta ca si sistemul iAPX 386 ofera facilitati impresionante de gestiune si protectie a memoriei. Absenta unei unitati hardware, exterioare microprocesorului, care sa efectueze operatiile cerute de conversia adreselor virtuale in adrese fizice (cu sau fara paginare), ca si de testare a drepturilor de acces, constituie doar aparent un dezavantaj. Faptul ca tabelele de conversie sint, potential, sub controlul programului (CPU poate adresa, la un anumit moment, numai segmentele ale caror selectoare sint memorate in cele patru registre de segment vizibile de catre programator) da falsa impresie ca gestiunea segmentelor este o operatie complicata. Pe de alta parte, doar acest mod de abordare poate oferi sansa utilizarii optime a celor patru registre in operatiile de gestiune a memoriei, intrucit ne aflam inca departe de conceperea si realizarea acelor programe de inteligenta artificiala care sa se substituie programatorului.
iAPX 386 opereaza cu patru niveluri de privilegiu, insotite de un puternic set de teste, asigurate de microprogramele instructiunilor, 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 protectie folosite pentru gestiunea taskurilor si apelarea procedurilor.
Nici iAPX 386 nu marcheaza o imbunatatire a gradului de ortogonalitate a organizarii registrelor si setului de instructiuni, fapt ce ar fi inlesnit realizarea compilatoarelor pentru limbajele de nivel inalt. A primat necesitatea pastrarii compatibilitatii cu produse anterioare ( iAPX 86/88/186/188/286).
Se poate afirma ca iAPX 386 este cel mai raspindit sistem la momentul actual, el fiind utilizat nu numai in realizarea sistemelor de calcul de uz general (calculatoare persomale, statii de lucru), ci si in sisteme dedicate de timp real (automatizarea proceselor industriale, comunicatii, roboti, instrumentatie cu performante ridicate etc).
|