Sunteți pe pagina 1din 213

CAPITOLUL 1

ARHITECTURA MICROPROCESOARELOR:
TIPURI DE DATE, MODURI DE ADRESARE,
INSTRUCTIUNI

1.1 Istorie a evolutiei microprocesoarelor

Se impune evocarea unor momente semnificative in evolutia microprocesoarelor,


evocare care va permite mai buna intelegere a stadiului actual si a tendintelor.

Anterior anului 1971 o serie de firme de renume (General Electric, RCA, Viatron) au
contribuit la dezvoltarea microproce- soarelor. Totusi modelul 4004 introdus pe piata
de Intel la sfirsitul anului 1971, reprezinta primul microprocesor care a patruns in
lumea civila. La scurt timp dupa aceea, in anul 1972, i-au urmat PPS-4 (Rockwell
International), proccesor de 4 biti, 8008 (Intel), procesor de 8 biti si IMP-16 (National
Semiconductor), procesor de 16 biti.

Motivele ce au stat la baza implemmentarii primelor microprocesoare au fost dictate


de cererea importanta de circuite de comanda puternice, care sa fie usor de adaptat la
circuitele integrate disponibile in acel moment. Deci, in epoca de inceput,
microprocesorul a fost privit ca un dispozitiv electronic programabil care poate
inlocui logica cablata (hard-wired logic) utilizata in realizarea controllerelor de
periferie, cum sunt cele pentru imprimante, terminale inteligente sau calculatoare de
buzunar. Domeniul de aplicatie si tehnologia disponibila au impus caracteristicile
tehnice ale acestor dispozitive. 8008 opera cu cuvinte de date de 8 biti, cu adrese pe 14
biti (16 Kocteti spatiu de memorie maxima direct adrsabila), cu un set de instructiuni
destinat efectuarii unor operatii aritmetice (adunare, scadere) si o stiva implementata
hardware in cadrul CPU (Central Processing Unit - unitate centrala de prelucrare), de
dimensiuni modeste, care nu permitea executia unor programe complexe.

Dezvoltarea in continuare a tehnologiei a permis cresterea numarului de tranzistoare


ce se pot depune pe o arie data a plachetei de siliciu, asa ca proiectantii de
microprocesoare au inceput sa isi puna problema utilizarii ariei ramase disponibile ca
urmare a progresului tehnologic.

1
Perioada 1973-1977 este specifica microprocesoarelor cu lungimea cuvintului de date
de 8 biti, cu adresele formulate pe 16 biti (spatiul maxim de memorie direct adresabila
fiind, deci, de 64 Kocteti). Setul de instructiuni s-a extins pentru a permite
manipularea unor date pe 16 biti, fapt ce a permis oferirea de mijloace de evaluare a
adreselor. Stiva a fost mutata din unitatea centrala in memorie, avind ca efect
cresterea numarului de subrutine imbricate. Domeniile principale de aplicare a
microprocesoarelor de 8 biti erau: sisteme cu functionare in timp real (in general) si
sisteme destinate conducerii proceselor industriale in particular. Majoritatea
programelor erau scrise in limbaj de asamblare, deoarece frecventa mica a ceasului
sistemului (2 MHz) si spatiul restrins de adresare reclamau cod compact si eficient. O
alta calitate importanta a noilor microprocesoare a constat in posibilitatea folosirii
unor periferice specializate utilizate in aritmetica intregilor extinsi si a numerelor
reale cu virgula mobila, ceea ce a constituit prima tentativa de introducere a
facilitatilor de prelucrare complexa in cadrul arhitecturilor bazate pe microprocesoare.
Cu toate acestea procesoarele aritmetice slabe aveau inca viteza mica, iar interfatarea
lor cu sistemul de calcul introducea consumuri suplimentare (overhead) atit de mari
incat multe dintre avantajele utilizarii lor erau anulate de timpul consumat de
citirea/inscrierea datelor si de programarea procesorului slave. Ca exemplu poate fi
citat procesorul matematic 8231 (Intel).

Extinderea cu adevarat a tipurilor de date prelucrate de catre microprocesor, pentru a


include si numerele cu virgula mobila, a avut loc la inceputul anilor '80, odata cu
introducerea unei noi clase de microproccesoare. Astfel de microprocesoare au fost
prevazute cu o unitate separata pentru prelucrari in virgula mobila, capabila sa
decodifice si sa execute instructiuni cu operanzi in virgula mobila. La noile
microprocesoare s-au extins si lungimea cuvintului de date (la 16 biti) si capacitatea
maxima de memorie direct adresabila pina la 16 Mocteti. S-au efectuat si alte
imbunatatiri, aritmetica numerelor intregi a fost extinsa la operanzi de 32 biti, ceea ce
favorizeaza manipularea adreselor, s-au introdus instructiuni de manipulare a
sirurilor de lungime variabila de octeti, s-a perfectionat mecanismul CALL/RETURN,
cu efecte favorabile asupra implementarii limbajelor de nivel inalt si a programarii
recursive. Poate ca cea mai importanta facilitate noua este cea legata de protectia si
gestiunea memoriei, fapt ce a presupus o organizare hardware speciala destinata
oferirii de suport pentru taskuri specifice sistemului de operare.

Toate aceste noi caracteristici s-au reflectat in noi tipuri de aplicatii, cum sunt cele
legate de calculatoarele personale, statii de lucru CAD/CAM (Computer Aided
Design/Computer Aided Manufacturing) sau sisteme functionind cu divizarea
timpului (time-sharing). Intrucat toate aceste noi procesoare dispuneau de memorii
mari si operau cu viteze sporite ale ceasului, majoritatea programelor de aplicatii au
inceput sa fie scrise in limbaje de nivel inalt: Fortarn, Pascal, C, limbaje aflate deja in
uz in sistemele mari de calcul. Limbajul de asamblare s-a mai folosit doar pentru
scrierea de subrutine intim legate de particularitatile hardware ale masinii sau pentru
realizarea de programe cu performante deosebite.
Urmatorul pas in evolutia microprocesoarelor, concretizat in realizarile acestui
moment, a constat in proiectarea unei arhitecturi bazate pe trei unitati majore:
unitatea centrala de prelucrare (CPU), unitatea de virgula mobila (FPU-Floating Point

2
Unit) si unitatea de gestiune a memoriei (MMU-Memory Management Unit). CPU are
ca scop executarea prelucrarilor de uz general, FPU efectueaza operatii aritmetice cu
numere in formatul cu virgula mobila cu precizie extinsa, in timp ce MMU asigura
suportul cerut de realizarea unor functii aferente sistemelor de memorie virtuala si
ofera un suport hardware pentru protectia obiectelor de memorie impotriva utilizarii
necorespunzatoare. Aceste microprocesoare au lungimea cuvintului de date de 32 biti
si un spatiu virtual de adresare de pina la 4 Gocteti.

Din succinta trecere in revista de mai sus rezulta ca aria disponibilizata a plachetei de
siliciu a circuitului integrat s-a utilizat in doua mari scopuri:

a) oferirea de suport pentru implementarea sistemelor complexe de operare prin


introducerea de hardware specializat si instructiuni speciale;

b)executia mai eficienta a programelor scrise in limbaj de nivel inalt prin utilizarea
unor moduri de adresare si a unor instructiuni mai complexe.

Desi aceste tendinte nu afecteaza in mod direct dezvoltarea de viitor a


microprocesorului, ele evidentiaza doua idei interesante privind arhitectura
microprocesoarelor in conditiile utilizarii pe scara din ce in ce mai larga a limbajelor
de nivel inalt si ale introducerii microprocesoarelor in domenii ca: statii de lucru
pentru aplicatii ingineresti, calculatoare personale puternice, ambele necesitind
sisteme de operare complexe. Este motivul pentru care in cele ce urmeaza se vor trata,
cu precadere, problemele legate de implementare. Apoi se vor particulariza -
pentru cele mai raspindite microprocesoare in prezent - problemele despre care s-a
vorbit.

1.2. Dihotomia limbaj de nivel inalt - masina tinta


Intrucat un mare volum din programele destinate microcalculatoarelor este scris prin
utilizarea limbajelor de nivel inalt, cel mai bun mod de imbunatatire a performantelor
microcalculatoarelor consta in cresterea eficientei de executie pentru astfel de limbaje.
In prezent se vorbeste despre o prapastie semantica intre modul in care limbajul de
nivel inalt este vazut de catre programator si modul de implementare a acestui limbaj
pe masina tinta. Cresterea eficientei de ansamblu de executie a programelor si de
realizare a lor intr-o forma fiabila se bazeaza, intr-o mare masura, pe eforturile de
realizare de punti de trecere pentru aceasta prapastie.

Pentru a gasi solutii la problema se impune mai intii o examinare amanuntita. Primul
pas consta in a compara optica prin care masina este vazuta de catre programatorul in
limbaj de nivel inalt si de catre cei ce folosesc limbajul de asamblare. Cele mai
importante diferente sunt:

3
a)in limbajele de nivel inalt memoria este privita drept constind dintr-un set de
variabile carora li s-au asociat nume, set care nu reflecta relatii de tipul: vecinatatea
variabilelor, pozitia lor relativa etc. Masina are memoria organizata ca o matrice
liniara cu locatii de dimensiuni egale, fiecarei locatii asociindu-i-se o adresa.

b)limbajele de nivel inalt folosesc structuri de date multidimensionale (de exemplu


matrici cu mai multi indici), in timp ce organizarea memoriei unei masini reale poate
manipula structuri de date cu o singura dimensiune.

c)in unele limbaje de nivel inalt, programarea structurata necesita o multitudine de


apeluri de proceduri care implica si transfer de parametri, alocare dinamica a
memoriei cerute suplimentar fata de instructiunile de salt la subrutina si revenire din
subrutina, oferite de catre orice procesor.

d)limbajele de nivel inalt fac diferentierea neta intre cod si date, diferentiere
inexistenta in memoria masinii reale.

La cele mentionate se mai pot considera si alte caracteristici ale masinii care nu sunt
luate in considerare de limbajele de nivel inalt: registrele unitatii centrale de
prelucrare sau aritmetica binara.

1.3.Clasificari arhitecturale
Considerentele din paragraful precedent pot servi si pentru clasificarea variatelor
arhitecturi disponibile in acest moment. Diferentele intre clasele de arhitecturi constau
in volumul de prelucrari efectuate prin program si prin intermediul echipamentului
la executia unui program scris in limbaj de nivel inalt. In calculatorul convetional,
programul sursa este compilat de catre compilator, care translateaza instructiunile
programa- torului in instructiuni de nivel inferior, care pot fi executate de catre
hardware. Deci, pentru executia programului sunt necesare prelucrari atit software
cat si hardware. Totusi, unele masini necesita volume importante de translatari din
limbajul de nivel inalt in cel apropiat masinii, ca urmare a nivelului foarte scazut al
limbajului masina, caz in care un mare volum de prelucrari se efectueaza de catre
software. Alte calculatoare, avind functii de nivel inalt implementate in arhitecturi
hardware, necesita un proces de compilare mai simplu, deoarece echipamentul este
capabil sa execute functii mai apropiate de cele utilizate in limbajul sursa.

In figura 1.1 se indica o posibila clasificare a arhitecturilor [1],[2]. Principalele doua


clase sunt: arhitecturi cu executie directa si arhitecturi cu executie
indirecta.Arhitectura cu executie indirecta se subdivizeaza in arhitectura complexa si
redusa, iar arhitectura complexa include arhitectura orientata catre limbaj (language
oriented) si arhitectura corelata cu limbajul (language-corresponding). In fine,

4
arhitectura corelata cu limbajul se subdivizeaza in arhitecturi ce necesita translatari
prin program si arhitecturi cu translatari prin hardware.
Arhitecturi pentru
limbaje de nivel
inalt

Cu executie Cu executie
indirecta directa

Arhitecturi reduse Arhitecturi complexe

Orientate catre limbaj Corelate cu limbajul

Cu translatare prin Cu translatare prin


program hardware
(Tip A) (Tip B)

Fig. 1.1 Clasificari arhitecturale din punctul de vedere al executiei programului in


limbaje de nivel inalt

1.3.1.Arhitecturi cu executie directa

Calculatoarele din aceasta clasa sunt capabile sa execute limbaje de nivel inalt direct,
fara nici un fel de translatare. Avantajele majore ale acestei clase constau in: gradul
ridicat de interactiune cu programatorul, absenta timpului de compilare si
reprezentarea programului cu un singur fisier (doar codul sursa, fara fisier obiect sau
executabil). Dezavantajele sunt generate de dificultatile de depanare (numarul
erorilor suntactice detectate la executie este mic; este necesara verificarea suntactica a
tuturor programelor, chiar si a celor corecte; masina nu poate executa decat programe
scrise in limbajul propriu). Nu exista exemple de microprocesoare din aceasta
categorie.

1.3.2.Arhitecturi reduse

Calculatoarele cu arhitectura redusa sunt orientate catre imbunatatirea performantelor


la rularea programelor de nivel inalt. Scopul este atins prin implementarea directa in
hardware a unui mic numar de instructiuni simple, a caror executie este optimizata.
Aria economisita pe placheta de siliciu printr-o astfel de abordare poate fi utilizata

5
pentru construirea unor blocuri menite sa creasca viteza de executie a programului.
Principalele dificultati sunt solutionate la nivelul compilatoru- lui.

Filozofia de mai sus a avut ca rezuultat realizarea procesoarelor cu set redus de


instructiuni (RISC- Reduced Innstruction Set Computers), care au inceput a fi utilizate
in aplicatii comerciale (microcalculatoare IBM). In aceeasi clasa pot fi incluse si
transputerele, produse ale firmei INMOS, care poseda alte facilitati arhitecturale ce le
recomanda pentru utilizarea in realizarea structurilor multiprocesor.

1.3.3. Arhitecturi orientate catre limbaj

Trasatura distinctiva a acestor arhitecturi este data de utilizarea unor moduri speciale
de adresare si a unor instructiuni speciale, utilizabile de catre compilator pentru
implementarea unor operatii specifice limbajelor de nivel inalt, cum este accesul la
structuri complexe de date. Rezultatul se manifesta in simplificarea procesului de
compilare. Avantajul potential al acestui mod de abordare consta in posibilitatea de
implementare directa in hardware a unor functii specifice limbajelor de nivel inalt. Pe
de alta parte, complexitatea crescanda a procesorului poate indeparta rezultatul
proiectarii de situatia optima, manifestata printre altele si prin reducerea vitezei de
executie a instructiunilor simple.

Aceasta categorie include marea majoritate a procesoarelor disponibile pe piata la ora


actuala. Doua din cele mai intens utilizate familii (iAPX 286 si iAPX 432) vor fi
studiate in capitole ulterioare.

1.3.4.Arhitecturi corelate cu limbajul

Aceste sisteme ar trebui sa realizeze o corespondenta biunivoca intre limbajul de nivel


inalt si codul masina. Ca urmare, compilatorul unui astfel de calculator devine similar
cu un asamblor. Diferenta intre tipurile A (translatare software) si B (translatare
hardware) din fig. 1.1. se manifesta in mai marea viteza de translatare pentru varianta
B si mai redusa complexitate hardware pentru varianta A.

Pentru ambele tipuri avantajele decurg din posibilitatea de depanare a unui program
scris direct in limbaj de nivel inalt. Ca performante care cunosc o imbunatatire se
mentioneaza fiabilitatea programelor si implemenatrea functiilor complexe. Este
limpede ca ambele tipuri de arhitecturi corelate cu limbajul sunt puternic orientate
catre executia programelor scrise in limbajul pentru care a fost conceputa masina.

Doar putine masini existente functioneaza conform principiilor din aceasta clasa, dar
nu exista microprocesoare care sa ofere caracteristicile arhitecturii corelate cu
limbajul.

6
1.3.5. Arhitectura si eficienta de executie

Caracteristicile arhitecturale cu cele mai puternice influente asupra eficientei de


executie a programelor scrise in limbaje de nivel inalt sunt:

-tipurile de date, deoarece tipurile de date manipulate eficient de catre masina tinta
s-ar putea sa fie identice cu tipurile de variabile in limbajul de nivel inalt;

-modurile de adresare, intrucat ele definesc mecanismul de acces la date in masina


reala, deci pot fi utilizate eficient pentru a reprezenta structuri complexe de date
intr-o memorie cu organizare liniara;

-setul de instructiuni, caci echipamentul poate oferi instructiuni ce realizeaza


operatii tipice cerute de executia programului (ca in arhitecturile orientate spre
limbaj) sau poate oferi un set de instructiuni mai apropiat de cel optim din punctul de
vedere al timpului de executie (ca in cazul masinilor cu arhitectura redusa).

In paragraful urmator se considera un exemplu ilustrativ pentru modul de alocare a


memoriei in executia programelor scrise in limbaj de nivel inalt, ca si pentru unele
operatii tipice pentru acest gen de programe.

1.4. Alocarea memoriei in limbaje de nivel inalt


Practic toate microprocesoarele contemporane folosesc compila- toare sau, mai bine
spus, generatoare de cod care reprezinta declaratiile limbajului de nivel inalt si
modalitatile de adresare a memoriei prin instructiuni masina si organizarea memoriei.
Descrierea de mai jos se aplica limbajelor structurate si care permit programare
recursiva, asa cum sunt popularele limbaje Pascal si C, larg acceptate in lumea
microprocesoarelor.

Spatiul de memorie ocupat de un program poate fi divizat in doua sectii principale: o


sectie read-only (care poate fi citita, dar nu inscrisa), care contine codul si constantele,
si o sectie read-write (ce poate fi atit citita cat si inscrisa), in care se stocheaza toate
variabilele declarate si auxiliare utilizate de catre program. In general, aceste doua
sectii sunt alocate in doua zone de memorie (chiar daca aceste zone ar putea fi
contigue). La randul ei, zona de date poate fi subdivizata in zona pentru stiva (stack),
unde se aloca variabilele declarate, si zona cu acces aleatoriu (heap - gramada
neorganizata), folosita pentru variabilele create dinamic.

7
Se considera urmatorul program scris in Pascal:

program mem(input, output);


var i,j:integer;
a:array[1,10] of real;
procedure A(x:integer; y:real);
var z,t:real;
procedure B(m:boolean; y:real);
var w:real;
procedure C(var t:real);
var z:real;
begin {C}
.
.
.
end; {C}
procedure D(var v:boolean);
begin {D}
.
.
.
C(w);
.
.
.
end; {D}
begin {B}
.
.
.
D(m);
. .
.
end; {B}
begin {A}
.
.
.
B(true,t);
.
.
.
end; {A}
begin {main}
.
.

8
.
A(i,a[j]);
.
.
.
end.

Figura 1.2.a. arata sectiunea de memorie dedicata memorarii variabilelor la inceperea


executiei. Memoria se reprezinta printr-o matrice liniara de locatii de memorie. Cu
blocuri mai late se indica blocuri contigue de memorie, in timp ce blocurile mai
inguste reprezinta o locatie, sau un mic numar de locatii cconsiderate ca o singura
variabila. Sageata arata ca in originea ei este memorat un indicator (pointer), virful
sagetii indicand locatia indicata.

In fig. 1.2. numai zona superioara este alocata pentru a pastra variabilele i,j si a,
definite in programul principal. Cand se executa instructiunea care apeleaza
procedura A, alocarea memoriei se modifica (Fig. 1.2.b.).

Memorie Memorie
alocata alocata
programului programului
principal principal

Cadru
Procedura A

Fig 1.2. Alocarea memoriei la apelarea unei proceduri:


a. inainte de apelare;
b. dupa apelare

Deoarece limbajul Pascal permite programarea recursiva, fiecarei apelari de


procedurri trebuie sa i se ofere propria copie de parametri si variabile definite in
cadrul procedurii. In felul acesta, apelarea procedurii reduce alocarea unei noi regiuni
de memorie, numita cadru (frame), care contine variabilele locale ale lui A, parametrii
sai, adresa de revanire si orice alta informatie necesara adresarii variabilelor
exterioare lui A, dar vizibile din procedura A. In acest exemplu celelalte variabile sunt
cele definite in programul principal.

Structura posibila a unui nou cadru alocat in memorie ca urmare a apelarii unei
proceduri este indicata in fig. 1.3.

9
Frame pointer
niv. 0
Display Frame pointer
field niv. 1

Frame pointer
Registrul 0 niv. i-1
Register
Save Area

Registrul n-1

Parametri procedura

Variabile locale

Variabile
auxiliare
Adresa revenire

Cimpul de afisare este folosit pentru stocarea informatiilor cerute pentru accesul
variabilelor definite in exteriorul procedurii; mai precis, cimpul de afisare contine o
lista de indicatori catre cadrele ultimei activari a fiecareia din procedurile care
incapsuleaza apelul procedurii in discutie. In consecinta, cadrul procedurii A este
compus doar din indicatorul catre variabilele globale, deoarece declararea procedurii
A este incapsulata doar in programul principal. Cimpul de afisare al procedurii B este
compus din indicatori catre programul principal si procedura A, intrucat procedura B
este declarata in interiorul procedurii A, declarata, la randul ei, in programul
principal. Este de notat faptul ca localizarea declararii procedurii, si nu imbricarea
activarilor procedurii, este elementul care determina continutul cimpului de afisare.
Cadru
program
principal

Cadru
Procedura
A

Cadru
Procedura
B

Cadru
Procedura
C 10
Fig.1.3.Formatul cadrului de memorie alocat unei proceduri definite in nivelul i-1 de
imbricare

Procedura A apeleaza procedura B, producand alocarea unui nou cadru pentru B, asa
cum se vede in fig. 1.4.a. Apoi procedura B apeleaza procedura D, harta memoriei
fiind cea din figura 1.4.b. La randul ei, procedura D apeleaza procedura C, ceea ce
rezulta in alocarea unui nou cadru, noua situatie fiind ilustrata in fig. 1.4.c. Se va
remarca identitatea cadrelor pentru D si C, a caror declarare se face la acelasi nivel de
imbricare, in timp ce nivelurile lor de imbricare a activarii sunt diferite.

Cand o procedura este terminata, cadrul corespunzator este dezalocat (sau eliberat);
deci, se efectueaza inversele operatiilor cerute de alocare. Pentru a efectua dealocarea
este necesar a pastra adresa de inceput a cadrului de apelare sau dimensiunea
cadrului curent. Adresa de inceput a cadrului de apelare, care implementeaza
legatura intre cadre, poate fi si ea adaugata la cimpul de afisare al procedurii apelante
ori de cate ori procedura apelata este definita la un nivel de imbricare superior celui
al procedurii apelante.

In conditiile organizarii memoriei descrise mai sus adresarea variabilelor se


efectueaza utilizind doua tipuri de informatii: nivelul de afisare si deplasamentul
(offset-ul) variabilei in interiorul cadrului. De exemplu, pe durata existentei
procedurii C, accesul la variabila j se face prin adunarea la primul element al
cimpului de afisare din cadrul curent a deplasamentului sau in cadrul de afisare al
programului principal (fig. 1.5.). Operatii similare se efectueaza pentru a adresa
oricare alta variabila (locala sau nu, asa cum este w), dupa cum rezulta din aceeasi
figura.

Modurile de adresare utilizate cel mai frecvent de catre un generator de cod avind ca
intrare un limbaj de nivel inalt sunt cele care calculeaza adresa operandului prin
adunarea unei cantitati la continutul unui registru, continut obtinut din incarcarea cu
unul din indicatorii de cadru, memorati in cimpul de afisare. Afirmatia poate fi usor
verificata, intrucat majoritatea compilatoarelor ofera, suplimentar fata de codul obiect,
un fisier in limbaj de asamblare, care reprezinta codul generat. Pe de alta parte, alte
moduri de adresare, cum sunt cele utilizind adresa completa specificata in chiar codul
instructiunii, nu prezinta interes pentru generarea de cod avind ca sursa programe
scrise in limbaje de nivel inalt. Intr-un paragraf ulterior se vor analiza, si din acest
punct de vedere, modurile de adresare ale microprocesoarelor moderne.

11
1.5. Tipuri de date
Manipularea datelor reprezinta scopul principal al unui program, asa ca ele joaca un
rol important in orice sistem de calcul. Organizarea variabilelor folosite de catre
program determina modul in care se face manipularea lor. De aceea, toate limbajele
de nivel inalt ofera metode flexibile de definire a structurilor complexe de date,
intrucat proiectantii limbajului au inteles ca, in majoritatea cazurilor, programul este
aproape complet definit de indata ce s-au proiectat structurile de date ce urmeaza a fi
manipulate.

Principial, toate microprocesoarele sunt capabile a manipula cu rezonabila eficienta


structurile de date definite in limbajele de nivel inalt, dar prapastia semantica despre
care s-a vorbit mai inainte conduce la mari deosebiri intre diveresele forme de
Fig. 1.5. Adresarea variabilelor nelocale prin indicatorii de cadru memorati in zona de
afisare realizare.

Se spune ca un microprocesor ofera suport pentru un anumit tip de date doar daca
este capabil a manipula operanzi apartinind acelui tip. Pentru asigurarea suportului
pentru tipuri de date diverse doua caracteristici ale microprocesorului sunt - de
regula - intrebuintate:

a) instructiuni care executa operatii asupra datelor reprezentate conform formatului


asociat tipului considerat;

b) moduri de adresare care permit accesul simplu la operanzi de tipul considerat.

In cele ce urmeaza se va analiza, pe baza acestor doi factori, daca un microprocesor


ofera sau nu suport pentru un anumit tip de date.

1.5.1.Lungimea cuvintului

Dimensiunea cuvintului de date este unul dintre factorii majori care influenteaza atit
performantele, cat si calitatile functionale ale unui microprocesor. Importanta acestor
parametri este demonstrata de faptul ca un criteriu tipic de clasificare a
microprocesoarelor se bazeaza pe lungimea cuvintului. Se vorbeste de microprocesor
de 8 biti, 16 biti sau 32 biti, numerele 8, 16, 32 referandu-se la lungimea cuvintului de
date manipulat.

Desi de o mare importanta, definitia lungimii cuvintului unui microprocesor nu este


lipsita de ambiguitate. Doua posibile definitii sunt:

12
a) lungimea cuvintului este data de numarul maxim de biti care pot fi transferati
intre CPU si memorie intr-un singur ciclu;

b)lungimea cuvintului este determinata de dimensiunea maxima a operandului care


poate fi manipulat de catre unitatea aritmetica-logica (ALU) a CPU.

Prima definitie se refera la traseul extern al datelor fata de microprocesor, in timp ce a


doua se refera la traseul intern. La microprocesoarele perioadei de inceput ambele
definitii conduceau la acelasi rezultat, data fiind identitatea de dimensiune intre
traseul extern si cel intern.

O data cu cresterea dimensiunii operandului manipulat intern de catre ALU,


fabricantii de microprocesoare au realizat diferite versiuni ale aceleiasi CPU, cu
diferite dimensiuni al magistralei externe. Acest lucru a izvorit din necesitatea de a
permite grefarea noilor microprocesoare in sisteme de calcul deja existente, avind
memoria si porturile I/O construite pentru magistralele de date mai inguste. In
acelasi timp, trebuie mentionat ca toate versiunile au acelasi set de instructiuni,
aceleasi moduri de adresare, aceleasi registre interne, aceeasi arhitectura a ALU,
acelasi mecanism de intreruperi si capcane (traps). Ca exemplu poate fi citata familia
microprocesoarelor Intel care a debutat cu 8086, a continuat cu 8088, sau
microprocesoarele 80186, 80286, 80386, 80486.

Adesea, lungimea cuvintului indica, intr-o anumita masura, performanta. Cu cat


lungimea este mai mare, cu atit microprocesorul este mai rapid. Dar lucrurile nu sunt
atit de simple. S-ar putea ca un microprocesor de 32 biti cu magistrala de date de 8
biti (daca ar exista !) sa se comporte mai prost decat un microprocesor de 16 biti cu
magistrala de date de 16 biti.

Se justifica, deci, afirmatia ca nu exista o definitie adecvata a lungimii cuvintului,


intrucat dimensiunile cuvintului de date transferat pe magistrala externa si a
cuvintului de date prelucrat de catre ALU difera. Este mai potrivit a se discuta despre
doua dimensiuni de cuvint de date: pentru cel intern si pentru cel extern.
Dimensiunea cuvintului de date intern influenteaza viteza de prelucrare a operanzilor
instructiunii, in timp ce dimensiunea cuvintului de date extern influenteaza timpul
global de acces la memorie pentru extragerea instructiunilor si vehicularea
operanzilor.
Cresterea dimensiunii operandului nu este singura consecinta a disponibilitatii unei
dimensiuni mai mari a cuvintului, deoarece posibilitatea de a manipula seturi mai
mari de biti conduce, de obicei, la introducerea de noi tipuri de instructiuni.
Microprocesoarele cu dimensiuni mai mari de cuvint nu sunt numai mai rapide decat
cele cu cuvinte de dimensiuni mai mici, dar ele tind sa posede un mai bogat
repertoriu de tipuri de date, sprijinite cu seturi de instructiuni si moduri de adresare
adecvate.

1.5.2. Organizarea memoriei

13
Toate microprocesoarele au un subsistem al memoriei organizat ca o matrice liniara
de elemente de baza de memorare, fiecare din ele asociat cu o anumita adresa.
Dimensiunea elementului de baza de memorare este rezultatul coompromisului intre
doua cerinte disjuncte:

a) reprezentarea compacta a datelor

b) acces eficient la datele stocate in memorie

1.5.2.1. Adresarea bitilor

Necesitatea unei reprezentari compacte a datelor conduce la selectarea unei


dimensiuni mici a elementului de baza de memorare, caci devine posibila ajustarea
spatiului de memorie disponibil la dimensiunea formatului datelor, risipindu-se doar
un mic volum de memorie. Situatia extrema este cea in care cea mai mica unitate
adresabila a memoriei este bitul. Devine posibila stocarea datelor de diferite
dimensiuni prin asocierea lor cu siruri contigue, de lungimi variabile, de biti,
dimensiunea sirului fiind cea minim necesara pentru reprezentarea datelor. Se ajunge
la utilizarea deplina a spatiului de memorie.

Totusi o astfel de organizare a memoriei implica penalizari asupra performantei si


costului. Principala problema a adresarii individuale a bitilor consta in necesitatea ca
ei sa ajunga la unitatea centrala pe linii fizice diferite, intrucat pozitia unui bit in
cadrul cuvintului citit din memorie este data de diferenta dintre adresa sa si adresa
emisa de catre CPU. Rezulta necesitatea unor circuite de multiplexare realizate in
cadrul modulului de memorie.

Alternativa consta in emularea adresarii la nivel de bit pe o masina care utilizeaza


elemente de baza de memorare de dimensiuni mai mari. In acest caz, memoria este
adresata la nivel de bloc, iar cimpul cerut de biti este extras de catre CPU cu ajutorul
unui mecanism de deplasare - mascare (barrel-shifter) care extrage cimpul necesar
intr-un singur ciclu. Probleme serioase apar cand cimpul de biti, desi de dimensiune
mica, traverseaza frontiera intre doua cuvinte de memorie (fig. 1.6.).

Fig. 1.6. Date traversind frontiera intre cuvinte in organizarea la nivel de bit

S-a considerat ca dimensiunea blocului citit este egala cu dimensiunea unui cuvint de
memorie. Accesul la aceste date necesita doua cicluri de acces la memorie, trebuind
citite ambele cuvinte pentru a extrage datele de interes. Desigur, aceleasi probleme se
pun in legatura cu inscrierea.

Dezavantajele adresarii la nivel de bit au determinat proiectantii de microprocesoare


sa utilizeze elemente de baza de memorie de dimensiuni mai mari. Cresterea
eficientei acestui tip de adresare este conferita de similaritatea cu operatia fizica de
acces la memorie. Datele si instructiunile sunt vehiculate intre memorie si CPU pe un
numar finit de linii fizice care transporta numarul de biti transferati (intr-un singur

14
ciclu de acces la memorie). Deci, masinile cu lungime fixa de cuvint constituie o
consecinta fireasca a implementarii fizice a transferului de date.

1.5.2.2. Masini cu lungime fixa a cuvintului

La majoritatea procesoarelor contemporane, dimensiunea cuvintului de date externe


este de 32 biti. Alegerea ca dimensiune a elementului de baza de memorie a unei
astfel de lungimi ar conduce la risipa de memorie cand se stocheaza tipuri de date
necesitind un numar mult mai mic de biti (de exemplu: caractere in cod ASCII).

De aceea se accepta ca dimensiunea celei mai mici entitati de memorie adresabila sa


fie cuvintul de 8 biti (octetul), iar toate adresele emise de catre CPU sunt adrese de
octeti. Pentru accesul la date cu dimensiunea mai mare de un octet, CPU emite adresa
primului octet, insotita de semnale de comanda indicand dimensiunea datelor,
dimensiune care poate merge pina la cea a cuvintului de date extern. In vederea
simplificarii circuitelor de interfata numarul posibil de dimensiuni de date este
limitat, fiecare dimensiune (in biti) fiind un divizor al lungimii cuvintului de date
extern. Pentru microprocesoarele de 32 biti, dimensiunile uzuale pentru date
accesibile intr-un singur ciclu de memorie sunt:

- date de 32 biti: long word (cuvint lung);

- date de 16 biti: word (cuvint);

- date de 8 biti: byte (octet);

Uneori se utilizeaza termenul de quad word (cuvint cvadruplu) pentru indicarea de


date cu dimensiunea de 64 biti, dar un astfel de tip de date nu poate fi citit/inscris
intr-un singur ciclu de acces la memorie. De mentionat faptul ca amintita clasificare
reflecta filozofia microprocesoarelor de 16 biti, pentru care 32 biti reprezinta un cuvint
"lung", dar terminologia este puternic inradacinata in limbajul curent, asa incat va fi
folosita in continuare.

Adresarea la nivel de octet si organizarea cu lungime fixa a cuvintului nu pot


solutiona problema accesului la date ce traverseaza frontiera unui cuvint. Asa cum
rezulta si din fig. 1.7., in astfel astfel de situatie accesul la date se realizeaza in doua
cicluri de acces la memorie. Desigur, se pot intrevedea doua solutii ale problemei:
Fig. 1.7. Date traversind frontiera intre cuvinte in organizarea la nivel de octet

a)evitarea alocarii de date de tipul celor din fig. 1.7.

b)tratarea automata a unor astfel de situatii

15
00001000H
00001004H

00001008H

0000100CH
Cuvinte aliniate
00001010H

00001014H

00001018H Cuvant nealiniat


0000101CH

00001020H

00001024H Dword aliniat


00001028H

0000102CH

00001030H
Dwords nealiniate
00001034H

00001038H

0000103CH

00001040H

00001044H

In primul caz adresa de inceput a activitatii asociate unui cuvint (word) sau cuvint
lung (long word) este fortata sa se supuna unor reguli simple:

- orice cuvint incepe la o adresa para;

- orice cuvint lung incepe la o adresa multiplu de 4.


In al doilea caz nu se mai impun restrictii. La aparitia situatiilor de tipul celor din fig.
1.7. microprocesorul efectueaza automat operatiile de acces, insa acestea dureaza
dublu.

1.5.3. Biti si cimpuri de biti

Bitul constituie cea mai naturala reprezentare interna a variabilelor booleene, dar, asa
cum s-a demonstrat, datorita consumurilor suplimentare asociate unei astfel de
reprezentari, astfel de variabile se reprezinta printr-un octet.

Prin cimp de biti se intelege un sir contiguu de biti in memorie, fara ca sa existe vreo
interpretare speciala asociata continutului sirului. Masinile care ofera suport pentru
acest tip de date dispun de instructiuni: pentru copierea unui cimp de biti intr-o
locatie de memorie sau intr-un registru; de aliniere a cimpului la una din frontierele
locatiei in care acesta se afla; de extindere, atunci cand este cazul, a semnului valorii
asociate cimpului de biti. Astfel de instructiuni, precum si cele ce efectueaza

16
operatiile inverse folosesc la transformarea formatului valorii cimpului de biti intr-un
alt tip de date. De exemplu, copiind un cimp de biti intr-un registru, aliniindu-l la
dreapta si extinzindu-i bitul de semn se obtine un intreg cu aceeasi valoare ca cea a
cimpului de biti. In felul acesta se pot efectua operatii cu valorile stocate in cimpurile
de biti, dupa ce s-a facut conversia de format si, apoi, dupa efectuarea operatiei, s-a
readus valoarea rezultata la formatul initial.

Cum s-a mentionat, folosirea cimpurilor de biti de lungime variabila permite stocarea
compacta a datelor. Se considera urmatoarea definitie in Pascal a unei inregistrari:

item = record
switch : boolean;
workday : (mon, tue, wed, thu, fri);
count : integer;
cod : 0..1024;
end;

Pentru a stoca in memorie un vector de tip item, harta alocarii memoriei (cand nu se
folosesc cimpuri de biti) este cea din fig. 1.8.a. Aria hasurata indica spatiul de
memorie irosit intr-o
astfel de reprezentare. Utilizarea cimpurilor de biti permite reprezentarea acelorasi
date intr-un mod mult mai compact (fig. 1.8.b.). Linia ingrosata indica frontierele
inregistrarilor, iar cea punctata - granitele cimpurilor. Desi economia de memorie este
importanta avantajul este anulat de cresterea timpului cerut de accesul la inregistrare
sau la un cimp al inregistrarii, fapt datorat depasirii de catre un cimp a frontierelor
dintre cuvinte.

Fig. 1.8. Alocarea memoriei pentru o matrice de inregistrari


a. normal; b. utilizind cimpuri de biti

Sunt necesare mai multe cicluri de acces la memorie in cazul b decat in cazul a. Totusi,
cimpurile de biti isi pastreaza utilitatea cand memorarea compacta a informatiei
constituie o necesitate.

Cimpurile de biti au aceleasi avantaje si dezavantaje ca si adresarea la nivel de bit,


intrucat ele pot fi utilizate pentru emularea adresarii la nivel de bit pe masini cu
lungimi fixe de cuvint si memorie structurata pe octeti. Pentru a defini un cimp de
biti sunt necesare trei informatii:

a) A - adresa octetului;

b) P - offsetul bitului (primul al cimpului);

c) S - lungimea cimpului

17
Fig. 1.9. indica un exemplu de utilizare. Primii doi parametri localizeaza primul bit al
cimpului. Valoarea offsetului difera de la o masina la alta (fiind mare pentru VAX sau
Motorola MC68020). De regula, valoarea maxima a lui S este egala cu dimensiunea
cuvintului de date intern.

Fig. 1.9. Exemplu de acces la un cimp de biti

1.5.4. Intregi cu semn si fara semn

Pentru reprezentarea in sistemele cu microprocesoare a valorilor intregi se folosesc


doua forme:

a)reprezentarea in complement fata de doi: valoarea X stocata prin intermediul unui


sir de n biti X0 X1 ... Xn-1 este data de

n-1
X = ( -X0 + Xi2-i) 2n-1
i=1

X ia valori intre -2n-1 si 2n-1-1;

b)reprezentarea binara pura: valoarea X stocata prin intermediul unui sir de biti X 0
X1 ... Xn-1 este data de

n-1
X = Xn-1-i 2i.
i=0
Pentru aceasta reprezentare gama de valori ale lui X este cuprinsa intre 0 si 2 n-1.

Trebuie remarcat faptul ca reprezentarea in complement fata de doi permite, spre


deosebire de cea in forma binara pura, reprezentarea numerelor negative. In mod
obisnuit intregii se folosesc pentru contoare, ca indici ai matricelor si ca adrese de
memorie, asa ca alegerea modului de reprezentare este determinata de utilizare. De
exemplu adresele se reprezinta in forma binara pura.

Practic toate microprocesoarele dispun de instructiuni care opereaza cu intregi in


oricare dintre cele doua forme de reprezentare, cu oricare dintre cele trei lungimi
despre care s-a vorbit (octet, cuvint, cuvint lung). Unele microprocesoare pot
manipula intregi cu lungimea de 64 biti, iar coprocesoarele matematice folosesc
intregi reprezentati pe 80 biti (pentru ca lungimea finita de reprezentare a datelor sa
afecteze cu o valoare maxima prestabilita precizia rezultatelor).

18
1.5.5. Caractere

Cele mai importante tipuri de date manipulate de programe sunt texte si numere. In
consecinta, toate microprocesoarele dispun de o metoda pentru reprezentarea interna
a caracterelor. De regula, fiecarui caracter tiparibil i se asociaza un intreg fara semn
(numit cod al caracterului). Aceasta conventie permite folosirea instructiunilor
destinate intregilor la manipularea si compararea caracterelor. Cel mai raspindit cod
de reprezentare a caracterelor este codul ASCII (American Standard Code for
Communication Interchange), fiecarui caracter asociindu-i-se un octet.

O structura de date des utilizata este sirul de caractere (string),echivalent cu un vector


de octeti. Lungimea sirului poate fi fixa sau variabila ; cand este variabila se impune
utilizarea unui caracter special pentru a indica terminarea sirului sau asocierea cu un
contor indicand numarul de caractere al sirului.De cele mai multe ori-in conjunctie cu
un astfel de contor- lungimea sirului este limitata la 65.535 ( 2 16-1, deci reprezentarea
pe 16 biti a contorului). Unele microprocesoare pot manipula nu numai siruri de
caractere (reprezentate prin octeti),ci si siruri de cuvinte de 16 biti (word) sau 32 biti
(longword). Operatiile uzuale cu siruri includ compararea si mutarea. In aceeasi
situatie intra si folosirea unui sir drept tabela de conversie (table lookup) in operatii
legate de conversii de coduri. Pentru adresarea unui sir sunt necesare adresa primului
caracter (pentru prelucrare ascendenta) sau a ultimului caracter (pentru prelucrare
descendenta), precum si numarul de caractere continute de catre sir.

Dimensiunea sirurilor nu permite pastrarea lor in registrele unitatii centrale de


prelucrare, asa ca ele sunt manipulate in memorie. La unele microprocesoare
informatiile de adresare a sirului trebuie pastrate in registre, deoarece executia
instructiunilor referitoare la siruri poate necesita mai multe operatii de acces la aceste
informatii , de exemplu pentru incrementarea / decrementarea indicatorului
elementului curent al sirului si actualizarea contorului de caractere.

1.5.7. Numere in format binar - codificat zecimal

Considerente legate de viteza de calcul impun reprezentarea interna a numerelor in


formatul binar si nu in cel zecimal.Pe de alta parte , utilizatorului ii este mai comod sa
foloseasca reprezentarea zecimala , asa ca se impune necesitatea conversiei datelor din
formatul zecimal in cel binar (la introducerea datelor) si din cel binar in formatul
zecimal (la extragerea datelor). Aceste conversii sunt consumatoare de timp, asa ca ,
uneori, se poate accepta efectuarea de operatii cu numere in forma zecimala (atunci
cand aceste operatii nu sunt de o complexitate deosebita si volumul de date prelucrate
nu este prea mare). Reprezentarea zecimala propriu - zisa este imposibila , deoarece
baza de numeratie folosita in sistemele de calcul este 2, asa ca se recurge la o
reprezentare apropiata de cea zecimala,numita forma BCD (de la binary - coded
decimal -numere zecimale in codificare binara).
Codul BCD foloseste grupe de 4 biti pentru reprezentarea valorii individuale a
fiecarei cifre zecimale care compune un numar dat.Deci,reprezentarea BCD a unui

19
numar consta intr-un sir de byte-i de 4 biti, fiecare codificand cifra zecimala
corespunzatoare pozitiei byte-ului in sir.

Pentru stocarea in memorie a formatelor BCD se folosesc doua metode: BCD


impachetat (packed BCD) si BCD neimpachetat (unpacked BCD) (Fig. 1.10).

--------------------- ---------------------
I1001I0001I I0000I0001I
I0100I0000I I0000I1001I
I0011I1000I I0000I0000I
--------------------- I0000I0100I
I0000I1000I
Packed BCD Unpacked BCD
Hi Lo Continut Hi Lo Contin I 0 0 0
ut 0 I 0 0
1001 0001 19 0000 0001 1 11I

0111 0011 37 0000 1001 9 -


0000 0011 3 -
-
0000 0111 7 -
-
----------------

Fig. 1.10. Reprezentarea numarului 384091 in format BCD


a. impachetat; b. neimpachetat.

Formatul BCD impachetat permite memorarea intr-un octet a doua cifre zecimale.
Fata de formatul BCD neimpachetat, care foloseste doar cei patru biti mai putin
semnificativi ai octetului pentru a memora o singura cifra zecimala (ceilalti biti sunt
0), se obtine o reducere la circa jumatate a spatiului de memorie necesar reprezentarii
unui numar dat. Pe de alta parte formatul neimpachetat este mai apropiat de
reprezentarea zecimala , ceea ce simplifica operatia de conversie a rezultatelor din
forma BCD in cea zecimala.

In general microprocesoarele sunt prevazute cu instructiuni pentru operatii aritmetice


cu cifre zecimale, si nu cu numere zecimale. Pentru operatii aritmetice cu numere
zecimale de mai multe cifre se utilizeaza subrutine dedicate. De asemenea , unele
coprocesoare matematice ofera functii de prelucrare a numerelor zecimale.

1.5.7. Matrici

20
Microprocesoarele nu ofera instructiuni pentru manipularea datelor structurate in
matrici (arrays) , insa ele poseda unele moduri de adresare create special in scopul
inlesnirii prelucrarii acestor structuri de date.

Limbajele de nivel inalt permit programatorului sa defineasca matrici cu mai multi


indici (numarul este limitat superior de caracteristicile compilatorului), elementele
matricii putind fi de oricare din tipurile de date, standard sau definite de utilizator.
Compilatorul reprezinta aceasta structura multidimensionala de date printr-o matrice
unidimensionala de octeti stocati in memorie.Reprezentarea presupune folosirea de n
octeti pentru fiecare element, n fiind determinat de tipul elementului. Apoi
elementele sunt aranjate in memorie incepind de la cea mai mica valoare a indicelui si
continuind cu elementele indicate de valorile incrementate ale indicelui, pina la cea
maxima. In fig. 1.11 este exemplificata alocarea memoriei pentru o matrice de octeti cu
dimensiunea 3x3. Primul indice variaza cu viteza mai mare decat cel de al doilea.

Se pot imagina si alte scheme de alocare obtinute din modificarea ordinii de


incrementare a indicilor. Consumul de memorie este acelasi, doar ordinea relativa a
elementelor in memorie diferand de la o schema de alocare la alta.

In unele limbaje de programare (de exemplu Pascal), indicii unei matrici pot diferi ca
tip, desi ei trebuie sa ia valori intr-o multime discreta si finita, fapt ce permite
compilatorului asocierea biunivoca de numere naturale 0,1,...,m-1 la elementele
multimii in discutie (m este numarul de elemente ale acestei multimi).

(0,0)
(1,0) 0,0 0,1 0,2
(2,0)
(0,1) 1,0 1,1 1,2

(1,1) 2,0 2,1 2,2


(2,1)
(0,2)
(1,2)
(2,2)

Fig. 1.11 Localizarea in memorie a celor 9 componente ale unei matrici 3x3

Alocarea din fig. 1.11 se poate generaliza. Se considera o matrice cu n indici. Adresa a
a elementului matricii caracterizat de setul de indici d 0,d1,...,d n-1 este data de

a  b  s (i 0 d i  x i m x 1  d n 1 )
n2 n2

21
Prin b s-a notata adresa primului octet din zona de memorie alocata matricii.s
reprezinta dimensiunea in octet a elementului matricii. m i este numarul de valori
posibile ale indicelui i (altfel spus : m i-1 este cea mai mare valoare pe care o poate lua
indicele i).

Evaluarea adresei unui element se amplifica in masura considerabila cand se


considera o matrice unidimensionala de elemente standard, caci numarul de
inmultiri se reduce la una singura, iar unul din factori, dimensiunea in octeti a
elementului, este o putere a lui 2 (0,1,2,3,). In consecinta, evaluarea adresei de acces la
un element se reduce la o deplasare si o adunare. Unele microprocesoare poseda
moduri speciale de adresare care permit efectuarea operatiilor descrise mai sus.

La o prima examinare , evaluarea parantezei din expresia lui a este o operatie


complicata , cel putin din punctul de vedere al programarii. Evaluarea se poate face in
maniera recursiva :

k0 = 0
ki = ki-1 x mi-1 + di-1 , i = 1,2,...,n

Se poate observa ca valoarea lui k n reprezinta numarul de elemente precedente celui


adresat. Se mai observa ca valoarea maxima a indicelui d i-1 este mi-1 - 1. Deci,
cunoasterea valorilor ki-1,mi-1,di-1 necesare pasului i al iteratiei permite si testarea
validitatii indicelui d i-1. In consecinta evaluarea lui ki presupune testarea lui di-1 si apoi
evaluarea propriu-zisa, fapt folosit de unele microprocesoare pentru a implementa,
intr-o singura instructiune , testarea incadrarii in gama corecta a indicelui si evaluarea
lui ki. Prin iteratie se evalueaza numarul de elemente ale matricii care trebuie sarite
pentru a se ajunge la elementul dorit. Dupa obtinerea acestui numar se calculeaza
adresa prin multiplicarea numarului cu dimensiunea elementului matricii, urmata de
adunarea rezultatului cu adresa de inceput a zonei in care este stocata matricea.

1.5.8. Inregistrari

Prin inregistrare (record) se defineste structura de date compusa din variabile


heterogene. O variabila a inregistrarii se numeste cimp (field). Un program poate
realiza accesul fie la inregistrari, fie la un cimp din cadrul acesteia. In primul caz este
convenabil a considera inregistrarea drept un sir de octeti, fapt ce permite mutarea si
compararea inregistrarilor cu ajutorul instructiunilor destinate sirurilor. Cand se
executa accesul la un cimp, adresa acestuia se obtine adaugind la adresa inregistrarii
ce il contine deplasamentul cimpului in cadrul inregistrarii (fig. 1.12).

Fig. 1.12 Acces la un cimp al unei inregistrari Suportul pentru operatii cu inregistrari
este oferit de instructiunile destinate sirurilor (pentru operatii cu intreaga
inregistrare), si de modurile de adresare utilizind registre baza pentru acces la
cimpurile componente ale unei inregistrari.

22
1.5.9. Comparatie intre microprocesoare

In cele doua tabele care urmeaza sunt evidentiate caracteristici privind organizarea
memoriei si structuri de date ale unor microprocesoare uzuale. In tabel nu este inclusa
structura evoluata iAPX 432 a firmei Intel , dar aceasta, ca si iAPX 286,vor fi discutate
in detaliu in capitolele ulterioare.

Tabelul 1.1. Caracteristici ale organizarii memoriei

Caracteristica Microprocesorul

iAPX 286 Z 8000 MC 68020 VAX 11

Unitate minima octet octet octet octet


adresata

Dimensiunea
cuvintului 16 32/16 32/16/8 32
de date
extern

Dimensiunea
cuvintului 16 32 32 32
de date
intern

Alinierea
datelor nu da da da
mai lungi de
un octet

Tabelul 1.2. Tipuri de date

Tip de date iAPX 286 Z 8000 MC 68020 VAX 11

Bit nu da da nu

Cimp de biti nu 1...32 nu 1...32

23
Intreg (biti) 8,16 8,16 8,16 8,16,32

Intreg (complement 32 32,64 32 64


fata de 2) (64 FPU)

Contor (biti) 8,16 8,16,32,64 8,16,32 8,16,32,64

Adresa (biti) 16+offset 32 32 32

Sir (octeti) 1-64k 1-231-1 nu 1-231-1

Structuri nu nu da da
matrici

ASCII da nu nu nu

BCD neimpachetat da nu da nu

BCD impachetat da da da da

Format virgula FPU FPU FPU da


mobila

Dimensiune format 32,80 32,64,80 32,64,80 32,64


virgula mobila

Se poate vedea ca deosebirile sunt, in general, minore,aceleasi principii arhitecturale


stind la baza tuturor microprocesoarelor atuale.

1.6. Moduri de adresare


Modurile de adresare constituie un instrument principal pentru a reprezenta in
memoria masinii imaginea datelor asa cum este aceasta vazuta de programatorul in
limbaj de nivel inalt. Ele permit programatorului sa construiasca si sa utilizeze
structuri complexe , multidimensionale de date , in timp ce echipamentul poate trata
doar matrici lineare cu elemente de dimensiune fixa. Pentru accesul la un element al
unei structuri complexe de date trebuie evaluata adresa de memorie corespunzatoare
inceputului zonei de memorie in care se pastreaza acel element. De regula, aceasta
operatie se efectueaza prin mai multe instructiuni utilizind mai multe moduri de
adresare.

Cu cat calculele efectuate in cadrul modului de adresare sunt mai complexe , cu atit
numarul mediu de instructiuni cerut de accesul la un element al unei structuri
complexe de date este mai mic. Avind in vedere ca modurile complexe de adresare

24
lungesc instructiunea ca spatiu ocupat in memorie ,ii maresc timpul de executie si
complica arhitectura unitatii de comanda , astfel de instructiuni isi dovedesc utilitatea
doar daca sunt folosite in mod frecvent.

1.6.1. Elemente de baza privind modurile de adresare.

Marea varietate a modurilor de adresare utilizate de gama de microprocesoare


disponibile ofera o caracteristica generala : oricare mod se obtine ca o combinatie intre
un numar relativ mic de obiecte (objects) si functii de baza.

Se considera ca un obiect sau o functie sunt fundamentale daca, in absenta acelui


obiect sau a acelei functii , masina nu este capabila sa emuleze nici un mod de
adresare. In consecinta obiectele fundamentale sunt constituite din registre si
deplasamente (displacement) sau offseturi stocate in instructiune. Functiile
fundamentale sunt adunarea, deplasarea (shift), adresarea indirecta (indirection).
Operatia de deplasare ar putea fi inlocuita de adunari / scaderi, insa timpul care s-ar
consuma in acest caz ar fi prea mare , asa incat deplasarea este considerata drept
functie fundamentala. Adunarea include si operatiile de incrementare si decrementare
, cazuri particulare de adunari.

In continuare obiectele si functiile fundamentale sunt considerate cu unele detalii.

Registre. Registrele despre care se vorbeste sunt situate in unitatea centrala de


prelucrare , in unitatea de aritmetica in virgula mobila (FPU) si in cea de gestiune a
memoriei (MMU). In discutarea modurilor de adresare nu se tine cont de unitatea
careia un anumit registru apartine. Principalele functii ale registrelor in ceea ce
priveste modurile de adresare sunt :

- registru operand : continutul registrului este insusi operandul la care se face


referire;

- registru adresa : continutul registrului este adresa operandului la care se face


referire;

- registru baza : registrul contine o adresa care, pentru obtinerea adresei


complete a operandului , se va utiliza in conjunctie cu continutul unui alt registru
sau al unui cimp imediat al instructiunii.

Cimp imediat. Cimpul imediat (immediate field) este un anumit cimp,adesea optional
, al unei instructiuni , dedicat pastrarii unei informatii ce se va utiliza in determinarea
adresei la care se afla operandul in discutie. Cele mai importante utilizari ale
cimpului imediat sunt :

- operand imediat : continutul cimpului imediat este chiar operandul la care se


face referire;

25
- adresa imediata : continutul cimpului imediat constituie
adresa operandului la care se face referire;

- offset/deplasament : cimpul imediat contine un intreg (in general - cu semn),


care se utilizeaza in conjunctie cu continutul unui registru pentru a produce
adresa operandului la care se face referire.

Adunarea. Rolul adunarii in adresare este la fel de important ca si in prelucrarea


datelor , intrucat toate modurile de adresare , cu exceptia celor mai simple , necesita
adunarea a doua sau mai multe valori. Cum s-a mai mentionat , un caz particular al
adunarii este incrementarea / decrementarea.

Adresarea indirecta. Adresarea indirecta este o functie al carei argument este dat de
rezultatele unor calcule , argument pe care il foloseste pentru a determina - prin
adresarea memoriei - operandul la care se face referire. Acest tip de operatie este cel
mai frecvent folosit in modurile de adresare , deoarece toate au nevoie de el, cu
exceptia acelor moduri de adresare in care operandul se afla in unitatea centrala
(intr-un registru al acesteia sau citit implicit o data cu citirea instructiunii).

Modurile complexe de adresare pot folosi de mai multe ori functia de adresare
indirecta pentru a obtine adresa finala a operandului.

Deplasarea. Deplasarea se utilizeaza pentru executarea operatiei de indexare. In acest


caz indexarea este operatia care produce offsetul unui element din matricea liniara ,
avind ca baza de plecare indicii elementului. Daca se noteaza cu i indicele (sau
indexul) elementului la care se face referire si acceptind ca valoarea cea mai mica a
oricarui indice este 0 , offsetul elementului i in cadrul matricii liniare este i * w , unde
w este lungimea unui element al matricii. Intr-un caz general, indexarea necesita o
inmultire. Cum w are, de regula , valoarea 1,2 sau 4 (exprimata in octeti), inmultirea i
* w se face prin deplasarea la stinga a lui i cu un numar de pozitii binare egal cu
logaritmul in baza 2 al lui w ( 0, una sau doua pozitii pentru
w = 1,2 sau 4). Deplasarea se face cu mult mai rapid decat inmultirea , ceea ce o
recomanda pentru includerea in functiile de baza pentru adresare .

Corelatia mod de adresare - cicluri masina.

Exista o corespondenta intre functiile si obiectele de baza ale modurilor de adresare ,


pe de o parte , si ciclurile masina necesare adresarii operandului exprimat intr-un
anumit mod de adresare , pe de alta parte. In fond , fiecare aplicare a functiei de
adresare indirecta produce un ciclu suplimentar de acces la memorie , intrucat
rezultatul calculelor anterioare este folosit ca adresa pentru accesul la memorie.
Acelasi efect apare si in cazul utilizarii unui cimp imediat, intrucat acesta constituie o
componenta a instructiunii, care trebuie citita din memorie. De cele mai multe ori
aceste cimpuri sunt mai scurte decat lungimea cuvintului de date extern al
microprocesorului,asa incat un asemenea cimp este citit in unitatea centrala simultan
cu codul operatiei , fara a mai fi necesare cicluri suplimentare de acces la memorie.In
general adunarea si deplasarea necesita , fiecare , cate un ciclu al unitatii aritmetice -

26
logice. In unele structuri specializate (barrel-shuffler) adunarea si deplasarea se
executa intr-un unic ciclu.

In cele ce urmeaza modurile de adresare se vor descrie prin utilizarea unor relatii
algebrice folosind urmatoarele notatii:

g - numele sau numarul unui registru , accesibil programatorului in limbaj de


asamblare ;

M(x) - functia de adresare indirecta, aplicata valorii x ;


rezultatul ei este valoarea memorata la adresa x in
memoria principala ;

G(g)-valoarea stocata in registrul g ;


a.sh.b - valoarea rezultata din deplasarea lui a la stinga cu b pozitii binare ;

d - valoarea deplasamentului, memorata intr-un cimp al


instructiunii.

Orice mod de adresare poate fi reprezentat comod in acest fel , fapt ce permite si o
comparare concludenta a facilitatilor oferite - in privinta implementarii programelor
scrise in limbaje de nivel inalt - de diversele microprocesoare existente

1.6.2. Adresarea directa prin registru

Cel mai simplu mod de adresare este cel care nu necesita aplicarea nici uneia din
functiile de baza pentru a obtine valoarea operandului. In aceasta clasa singurul mod
de adresare este cel direct prin registru (register operand addressing).

Operandul este stocat in registru , deci nu este necesar un ciclu memorie sau ciclu
ALU pentru a-i obtine valoarea. Valoarea operandului este data de G(g). Adresarea
directa prin registru reprezinta modul cel mai compact si cel mai rapid de adresare. El
este folosit pentru manipularea operanzilor utilizati in mod frecvent in sectiunea
curenta a programului , operanzi care sunt incarcati in registre in scopul minimizarii
timpului de acces.

1.6.3. Adresarea indirecta prin registru

Acest mod de adresare (register indirect addressing) utilizeaza continutul registrului


g, specificat in instructiune , pentru a adresa operandul , asa cum se vede in figura
1.13. Valoarea operandului este data de M(G(g)). Intrucat se utilizeaza o operatie de
adresare indirecta, extragerea operandului necesita un ciclu suplimentar de memorie.

Adresarea indirecta prin registru este folositoare pentru accesul la elementele


structurilor complexe de date , altfel inaccesibile doar cu unicul mod de adresare

27
permis de masina. Calculul adresei, disponibila - in final - in registrul in discutie ,
necesita o secventa de instructiuni al caror rezultat este adresa elementului solicitat.

Registre
Memorie

G[g]

M[G[g]]

Fig 1.13. Adresarea indirecta prin registru

1.6.4. Adresarea cu autoincrementare / autodecrementare.

Acest mod de adresare (autoincrement/decrement addressing), extrem de important,


constituie baza modurilor de adresare implementate in oricare calculator. In mod
normal , acest mod de adresare este utilizat in conjunctie cu indicatorul de stiva si cu
contorul programului.

Adresarea cu autoincrementare / autodecrementare functioneaza intr-un mod similar


cu adresarea indirecta prin registru , intrucat registrul g, specificat explicit sau
implicit in instructiune , contine adresa operandului. In plus fata de modul
precedent , continutul registrului este incrementat / decrementat cu o cantitate
determinata de lungimea operandului la care se realizeaza accesul. In general , acest
mod de adresare este utilizat pentru intregi , asa ca valoarea incrementului este 1,2,4
sau 8.

Din considerente evidente autoincrementarea continutului registrului este efectuata


dupa accesul la operand , iar decrementarea continutului registrului se face inainte de
accesul la operand. Decurg de aici doua moduri de adresare : cu postincrementare si
cu predecrementare.

In modul de adresare cu postincrementare are loc operatia de adresare indirecta

28
M(G(g))

urmata de incrementarea cu N :

G(g): = G(g) + N

In modul de adresare cu predecrementare are loc predecrementarea cu N :

G(g) : = G(g) - N

urmata de adresarea indirecta:

M(G (g))

Cele doua moduri de adresare sunt reprezentate schematic in fig. 1.14.


Este de mentionat ca modurile de adresare cu postincrementare si predecrementare
sunt singurele care au efecte secundare , manifestate in modificarea continutului
registrului g. Aceasta modificare este de dorit , deoarece ea permite accesul secvential
in ordine ascendenta la memoria program (postincrementare) , precum si
implementarea comoda a mecanismului de stiva LIFO (last in - first out),
indispensabil pentru buna functionare a sistemului de intrerupere , precum si pentru
operarea cu subrutine.
Registre
Memorie

G[g]
g

(N)
+
G[g]

M[G[g]]
G[g] : = G[g] + N

29
Registre
Memorie

G[g]
g

(N)
-
G[g]-N

G[g] : = G[g] - N
M[G[g]]

Fig. 1.14. Adresarea cu autoincrementare/autodecrementare

Adresarea cu postincrementare permite si obtinerea modului de adresare numit


"adresarea imediata a operandului" , folosita de toate microprocesoarele pentru a
introduce constante in sirul de instructiuni. Adresarea imediata a operandului se
obtine prin utilizarea adresarii cu postincrementare si specificand contorul
programului drept registru de utilizat pentru adresare. Acest mod de adresare
permite prelucrarea de instructiuni compuse din mai multe cuvinte.

Statistic s-a constatat ca operanzii imediati pentru limbajele de nivel inalt au diverse
lungimi [3]. Pentru a se scurta lungimea medie a instructiunii la o serie de
microprocesoare s-a acceptat posibilitatea specificarii mai multor formate pentru
operanzii imediati : ( Z 8000, MC 68000). In cazul operanzilor de lungime mica este
posibila stocarea lor in acelasi cuvint care contine codul operatiei , deci accesul se face
fara consum suplimentar de cicluri de memorie. Se constata ca operanzii imediati sunt
constante care nu se modifica prin program. Pentru variabile se folosesc alte moduri
de adresare.

30
1.6.5. Adresarea indirecta cu autoincrementare / autodecrementare

Acest mod (autoincrement/autodecrement indirect addressing) se poate obtine prin


aplicarea unei adresari indirecte suplimentare

Fig. 1.15 Adresarea indirecta cu postincrementare modului normal de adresare cu


autoincrementare /autodecrementare. Fig. 1.15 reprezinta adresarea indirecta cu
postincrementare.

Functionarea in modul de adresare indirecta cu postincrementare presupune dubla


adresare indirecta

M(M(G(g))),

urmata de postincrementarea cu N a continutului registrului g :

G (g) := G (g) + N

In modul de adresare indirecta cu predecrementare are loc decrementarea cu N a


continutului registrului g

31
G (g) := G (g) - N ,

urmata de o dubla adresare indirecta M ( M ( G (g))).

Ca la orice adresare cu autoincrementare / autodecrementare se manifesta efectul


secundar de modificare a continutului registrului g folosit pentru adresare.

In cazul particular in care adresarea indirecta cu postincrementare foloseste ca


registru contorul programului se obtine adresarea directa , mod de adresare existent
in toate microprocesoarele. La adresarea directa adresa operandului este memorata ca
un cimp al instructiunii. Dupa citirea codului instructiunii ( realizata prin modul de
adresare cu postincrementare ) contorul programului indica urmatorul cimp al
instructiunii. Adresarea indirecta cu postincrementare permite accesul la operand si
actualizarea contorului programului. Intrucat microprocesoarele de 8 si 16 biti au
lungimea cuvintului de adresa mai mare decat lungimea cuvintului de date , sunt
necesare mai multe cicluri de acces la memorie pentru citirea adresei operandului.

Adresarea directa specifica adresa operandului ca parte componenta a instructiunii,


care se stabileste in momentul compilarii si nu mai poate fi schimbata in timpul
executiei programului. Asa cum s-a vazut , limbajele de nivel inalt care folosesc
recursivitatea nu pot folosi adresarea directa ca urmare a dinamicii adreselor in
procesul de recursivitate. Cu exceptia variabilelor globale , celelalte variabile au
adrese alocate in timpul rularii pentru programele recursive , adrese care nu se pot
insera in codul instructiunii.

Utilizarea adreselor stocate in codul instructiunii este legata de operatiile de salt sau
apeluri de subrutine , deci nu de specificarea de variabile propriu - zise.

1.6.6. Adresarea indirecta bazata si cu deplasament

S-a denumit registru baza registrul al carui continut se aduna cu un obiect manipulat
de catre modul de adresare, cu scopul determinarii adresei operandului. Modul de
adresare bazat si cu deplasament (base displacement indirect addressing) calculeaza
adresa operandului prin insumarea continutului registrului baza specificat cu
valoarea unui cimp al instructiunii, numit deplasament ( fig. 1.16):

M ( G(g) + d )

Fig. 1.16. Adresarea indirecta bazata si cu deplasament

Se subliniaza faptul ca obtinerea deplasamentului presupune un ciclu de memorie si


incrementarea contorului programului, ceea ce face ca numarul de cicluri de acces la
memorie necesare pentru obtinerea operandului sa fie 2. Operatiile efectuate sunt
adunarea si incrementarea. Si aici trebuie avut in vedere faptul ca lungimea
deplasamentului poate fi variabila , ceea ce poate rezulta in necesitatea unui ciclu

32
suplimentar de memorie, sau, dimpotriva, la diminuarea numarului de cicluri de
memorie impus de obtinerea operandului.
Adresarea bazata cu deplasament este foarte potrivita pentru executarea programelor
scrise in limbaj de nivel inalt , pentru ca ofera un mod natural de adresare a scalarilor.
Pentru ilustrare se poate considera exemplul din fig 1.4c

De asemenea , adresarea bazata solutioneaza problema de adresare a variabilelor si a


informatiilor de comanda. Sectiunea de cod in limbaj de asamblare destinata
implementarii apelarii procedurii specifica un anumit registru , de uz general sau
specializat , pentru a indica inceputul noului cadru. Acest registru se numeste
indicator al cadrului local (local frame pointer ). In continuare compilatorul poate
genera instructiuni de acces la variabilele locale prin utilzarea indicatorului cadrului
local drept registru baza. Deplasamentul este dat de suma lungimilor cimpului si
variabilelor ce preced variabila adresata. Fig. 1.17 ilustreaza acest mod de adresare, cu
referire la exemplul din fig. 1.4c.

Fig. 1.17. Acces la variabilele locale (stinga) si nelocale (dreapta).

Din aceeasi figura 1.17. se vede cum se poate efectua accesul la variabilele nelocale.
Mecanismul este similar cu cel al adresarii variabilelor locale, dar indicatorul cadrului
in care se afla variabila se obtine din cimpul de afisare. Informatia din cimpul de
afisare poate fi considerata ca o variabila locala normala, deci ea poate fi copiata
intr-un registru prin evaluarea deplasamentului sau in cadrul curent si folosind
modul de adresare bazata cu deplasament , avind indicatorul cadrului local drept
registru baza. Informatia din registru ( notata Rg in figura ) reprezinta indicatorul
catre cadrul care contine variabila nelocala , iar adresarea variabilei dorite decurge
conform mecanismului descris.

Aproape intotdeauna indicatorul cadrului local este pastrat intr-un registru , deoarece
el reprezinta informatia-cheie pentru accesul la toate variabilele locale , iar
probabilitatea de a le utiliza in cadrul procedurii este mare. Un alt indicator de cadru ,
si el pastrat , de regula , intr-un registru , este cel indicand spre variabilele globale , la
care orice procedura are acces. In fine , un al treilea registru este rezervat pentru
stocarea indicatorului catre un eventual cadru situat intre cadrul programului
principal si cel al procedurii locale.

Adresarea indirecta bazata si cu deplasament este frecvent utilizata pentru accesul


variabilelor atit locale , cat si nelocale , cu conditia ca aceste variabile sa fie scalari. In
structurile complexe de date acest mod de adresare furnizeaza doar adresa de inceput
a zonei de memorie alocate intregii structuri. Pentru localizarea unui element sunt
necesare calcule suplimentare.

Situatiile in care contorul programului este folosit drept registru baza sunt numite
adresari relative, intrucat cimpul din instructiune indica pozitia relativa a
operandului in raport cu adresa la care se afla instructiunea. Acest mod de adresare
impune utilizarea unui intreg cu semn pentru deplasament , in timp ce in alte moduri

33
deplasamentul este un numar pozitiv. Necesitatea deplasamentului cu semn este mai
stringenta pentru instructiunile de salt.

1.6.7. Adresarea dublu indirecta bazata si cu deplasament.

Acest mod de adresare (base displacement indirect indirect addressing) se obtine prin
aplicarea unei a doua functii de adresare indirecta rezultatului adresarii indirecte
bazate si cu deplasament. El se descrie astfel :

M ( M(G(g)+d)).

In fig.1.18 se poate vedea, schematic , modul de evaluare a adresei operandului in


adresarea dubla indirecta bazata si cu deplasament.

Fig. 1.18. Adresarea dublu indirecta bazata si cu deplasament

Modul de adresare descris este utilizabil pentru adresarea variabilelor la care referirea
se face prin intermediul unui indicator. Intrucat registrul baza este intotdeauna
utilizat pentru a indica adresa de inceput a cadrului , deplasamentul corespunde
pozitiei indicatorului variabil in interiorul cadrului. Dubla adresare indirecta este
folosita intii pentru a obtine valoarea indicatorului si, apoi, valoarea operandului
propriu-zis. In fig. 1.19. se arata utilizarea modului de adresare cu dubla adresare
indirecta pentru obtinerea unei variabile din stiva neordonata (heap) prin intermediul
variabilei indicator p.

O alta aplicatie tipica a modului de adresare descris mai sus este realizarea accesului
la parametrii procedurii transferate prin referire. In astfel de aplicatii in interiorul
procedurii se stocheaza nu valoarea ci adresa parametrului. In consecinta , prin
adresarea indirecta bazata cu deplasament se obtine doar adresa parametrului ,
obtinerea valorii lui necesitind o noua adresare indirecta.

Fig. 1.19 Accesul la o variabila cu ajutorul unui indicator p

1.6.8. Adresarea indirecta bazata indexata

Cele mai simple structuri cu care opereaza limbajele de nivel inalt sunt matricile
liniare de scalari. In general , scalarii se reprezinta prin cimpuri de memorie de 8, 16
sau 32 biti. Calcularea deplasamentului unui element in cadrul matricii liniare se
obtine prin deplasarea la stinga a numarului ce reprezinta indicele (indexul) unui
element cu 0, 1, sau , respectiv 2 pozitii binare , presupunind ca valoarea initiala a
indicelui este 0. Unele compilatoare , cum sunt cele pentru limbajul Pascal , permit
programatorului sa foloseasca indici care nu sunt intregi. Totusi , compilatorul ii
converteste intern in intregi , dupa cum aceeasi operatie de conversie are loc si atunci
cand indicii sunt intregi , dar valoarea initiala nu este 0. In primul caz indicele intreg

34
rezultat este dat de pozitia intr-o multime ordonata a indicelui neintreg ; in cel de al
doilea conversia presupune o simpla scadere.

Adresarea indirecta indexata bazata (base indexed indirect addressing) este in masura
sa efectueze imediat calculele cerute de indexare, precum si operatia de adunare a
deplasamentului cu adresa de baza a structurii de date. Acest mod de adresare
necesita doua registre : g1 si g2 . g2 contine indicele elementului in matrice (registru
index). Continutul sau este deplasat la stinga cu 0, 1 sau 2 pozitii binare, in functie de
tipul operandului manipulat de catre instructiune. Dupa efectuarea operatiei de
deplasare , rezultatul este adunat cu continutul registrului g1 , care contine adresa de
inceput a matricii ; aceste operatii sunt caracterizate de functia

M( G(g1) + G(g2).Sh. N)

si sunt reprezentate in fig. 1.20

Fig. 1.20 Adresarea indirecta bazata indexata

Modul de adresare indirecta indexata bazata este folosit pentru accesul la un element
al unei matrici unidimensionale de scalari, stocata intr-o zona de memorie a carei
adresa de inceput este continuta in registrul baza.

1.6.9. Adresarea indirecta indexata cu postincrementare

Modul de adresare din titlul paragrafului (postincrement indexed indirect


addressing) se obtine din modul de adresare indirecta indexata bazata prin adaugarea
unei operatii de incrementarea continutului unuia din cele doua registre, operatie
efectuata dupa extragerea operandului. Deci, continutul registrului g2 se deplaseaza
la stinga cu 0,1 sau 2 pozitii binare ; rezultatul se aduna cu continutul registrului g1,
obtinindu-se adresa operandului ; in fine,continutul registrului g1 se incrementeaza
cu valoarea N1, egala cu 1,2 sau, respectiv, 4. Fig. 1.21 indica procesul de evaluare ,
care se desfasoara dupa relatiile

M( G(g1) + G(g2).sh.N),
G(g1) := G(g1) + N

Fig. 1.21 Adresarea indirecta indexata cu postincrementare

1.6.10. Adresarea indirecta indexata cu predecrementare

Acest mod de adresare (postdecrement indexed indirect addressing) este similar cu


cel anterior ; deosebirea consta in predecrementarea , in loc de postincrementarea
registrului g1 ( fig. 1.22 ) :

35
G (g1) := G (g1) - N
M (G (g1) + G (g2).sh.N)

Fig. 1.22 Adresarea indirecta indexata cu predecrementare

1.6.11. Adresarea indirecta indexata bazata si cu deplasament

Modul de adresare din titlul paragrafului (base displacement indexed indirect


addressing) necesita trei obiecte : un registru baza g1, un deplasament d stocat intr-un
cimp al instructiunii si un al doilea registru g2, registru index. Continutul registrului
g2 este deplasat la stinga cu N pozitii binare (N = 0,1 sau 2), in functie de tipul
operandului manipulat de catre instructiune . La acest rezultat se aduna
deplasamentul d si adresa de baza G(g1) continuta de registrul g1 (fig. 1.23).

M ( G(g1) + d + G(g2). sh.N )

Adresarea indirecta indexata bazata si cu deplasament este o metoda mai buna de


acces la elementele unei matrici unidimensionale de scalari , atit fata de metoda de
adresare indirecta bazata cu deplasament , cat si fata de cea de adresare indirecta
indexata bazata. Daca g1 contine indicatorul cadrului local , indicele elementului
matricii este continut de g2 , iar d indica deplasamentul in interiorul cadrului al
adresei de inceput a zonei de memorie ce contine elementele matricii , modul de
adresare indirecta indexata bazata si cu deplasament permite accesul intr-o singura
instructiune al oricarui element al matricii locale unidimensionale de scalari. Un
exemplu este cel din fig. 1.24.

Fig. 1.23 Adresarea indirecta indexata bazata si cu deplasament

Fig. 1.24. Acces la un element al unei matrici locale utilizind adresarea


indirecta indexata bazata si cu deplasament 1.6.12. Adresarea indirecta indexata
indirect cu postincrementare

Pentru acest mod de adresare (postincrement indirect indexed indirect addressing) se


folosesc doua registre : registrul baza g1 si registrul index g2. Continutul lui g1
permite adresarea si citirea continutului unei locatii de memorie. Acest continut se
aduna la rezultatul deplasarii spre stinga cu N2 pozitii binare a continutului
registrului g2 ( N2 = 0,1 sau 2). In felul acesta se obtine adresa operandului. In final ,
continutul registrului g1 este incrementat cu N1 unitati ; valoarea lui N1 depinde de
dimensiunea adresei. Evident , nu exista legatura intre N1 si N2.

Cele de mai sus sunt ilustrate de fig. 1.25 si suntetizate de relatiile

M ( G(g1) + G(g2).sh.N1 )

36
G (g1) : = G (g1) + N

Accesul la operand necesita doua cicluri de acces la memorie , o adunare si o


deplasare.

Fig. 1.25 Adresarea indirecta indexata indirect cu postincrementare 1.6.13. Adresarea


indirecta indexata indirect bazata cu deplasament

Modul de adresare de mai sus (base displacement indirect indexed indirect


addressing) necesita trei obiecte : registrul baza g1 , registrul index g2 si
deplasamentul d, memorat intr-un cimp al instructiunii. Continutul M (g1) al lui g1 se
aduna cu deplasamentul d. Rezulta o adresa a unei zone de memorie , care contine , la
randul sau , o adresa. Aceasta din urma se insumeaza cu continutul G (g2) al
registrului g2 , deplasat in prealabil la stinga cu N pozitii binare ( N = 0,1 sau 2 ).
Rezultatul constituie adresa operandului la care se face referire :

M ( M ( G(g1) + d ) + G (g2).sh. N )

Figura 1.26 serveste drept ilustrare.

Fig. 1.26 Adresarea indirecta indexata indirect bazata cu deplasament

Un posibil caz de utilizare a acestui mod de adresare este cel in care se cere accesul la
un element al unei matrici unidimensionale de scalari , indicat prin intermediul unei
variabile. Matricile transferate ca parametri ai procedurii au adresele de inceput
stocate in cimpul de parametrii ai cadrului procedurii curente. Accesul la un element
se obtine prin incarcarea in g1 a indicatorului cadrului local ; deplasamentul indica
pozitia in cadrul curent a inceputului zonei de memorie care contine matricea , iar g2
contine indicele elementului la care se face referire. Pentru exemplificare se poate
considera fig. 1.27.

Fig1.27. Adresarea unui vector transferat ca parametru utilizind adresarea


indirecta indexata indirect bazata cu deplasament

1.6.14. Adresarea indirecta cu deplasament indirect bazata si cu


deplasament

Acest mod de adresare (base displacement indirect displacement indirect addressing)


foloseste doua deplasamente d1 si d2 , stocate in doua cimpuri ale instructiunii , si un
registru baza g. Continutul G (g) al registrului g se aduna cu deplasamentul d1.
Rezulta adresa unei zone de memorie , care contine o adresa. Aceasta din urma se
aduna cu d2 pentru a furniza adresa operandului la care se face referire :

37
M ( M (G(g) + d1 ) + d2 )

Grafic, modul de adresare este prezentat in fig. 1.28.

Fig. 1.28. Adresarea indirecta cu deplasament indirect bazata si cu deplasament

Acest mod de adresare permite accesul intr-o singura instructiune la scalari nelocali.
Indicatorul cadrului local este incarcat in g. d1 reprezinta deplasamentul ( in cadrul
cimpului de afisare al cadrului curent ) indicatorului spre cadrul in care se afla
variabila la care se face referire. In fine , d2 reprezinta deplasamentul in interiorul
cadrului a scalarului referit (fig. 1.29). Un alt fel de utilizare permite accesul la un
cimp al unei inregistrari locale la care referirea se face cu ajutorul unui indicator. In
acest caz d1 este deplasamentul indicatorului in interiorul cadrului, iar d2 este
deplasamentul (fata de inceputul zonei ce contine inregistrarea, inceput specificat prin
indicatorul obtinut prin M ( G(g) + d1) ) al cimpului la care se face referire.

Fig. 1.29. Accesul la un operand nelocal (stinga) sau la un cimp dintr-o inregistrare
(dreapta) cu ajutorul unui indicator

1.6.15. Adresare indirecta indexata cu deplasament indirect bazata si cu


deplasament

Modul de adresare numit in titlul paragrafului (base displacement indirect


displacement indexed indirect addressing) foloseste patru obiecte : registrul baza g1,
registrul index g2 si deplasamentele d1 si d2 , memorate in cimpuri ale instructiunii.
Relatia de acces la operand este M ( M ( G(g1) + d1 ) + d2 + G(g2).sh.N )

La continutul G (g1) al registrului g1 se aduna deplasamentul d1, obtinindu-se adresa


unei zone de memorie ce contine o adresa. Aceasta din urma se insumeaza cu
deplasamentul d2 si cu G(g2).sh.N , continutul G(g2) al registrului g2 deplasat in
prealabil spre stinga cu N pozitii binare ( N = 0,1, sau 2). Accesul se realizeaza prin
consumul a doua cicluri de memorie si prin efectuarea a 3 adunari si o deplasare.
Schematic , adresarea este prezentata in fig. 1.30.

Fig. 1.30. Adresare indirecta indexata cu deplasament indirect bazata si cu


deplasament

Modul de adresare descris permite accesul la matrici unidimensionale nelocale de


scalari , fapt datorat adaugarii indexarii la modul de adresare indirecta cu
deplasament indirect bazata si cu deplasament. In g1 se incarca indicatorul cadrului
local. d1 este deplasamentul indicatorului (din cimpul de afisare ) catre cadrul ce
contine matricea de interes. d2 da deplasamentul in cadrul de interes al inceputului
zonei de memorie ce contine matricea , iar g2 contine indicele elementului la care se
face referire. (fig. 1.31)

38
Fig. 1.31. Acces la un element al unui vector nelocal

1.6.17. Concluzii privind modurile de adresare

Modurile de adresare se pot grupa in trei mari categorii :

a. moduri simple, cum sunt cele de adresare cu operandul in registru, indirect prin
registru, imediata sau directa;

b. moduri in care procesul de evaluare a adresei presupune adunarea continutului


unui registru cu unul sau doua deplasamente, continute in cimpuri ale instructiunii,
fiind,eventual, posibila si utilizarea unei functii de indexare;

c. moduri in care procesul de evaluare a adresei necesita adunarea continuturilor


unuia sau ale mai multor registre, eventual si cu folosirea unei functii de indexare,
urmata de incrementarea, sau precedata de decrementarea continutului unuia din
registrele implicite.

In general, toate sistemele de calcul folosesc modurile simple de adresare, care


reprezinta modurile de baza de adresare a operanzilor, toate acestea fiind utile pentru
executia programelor scrise in limbaj de nivel inalt. Face exceptie modul de adresare
directa, folositor doar pentru segmentul de cod.

Modurile de adresare cu registru baza si deplasament sunt adecvate pentru


programele in limbajele de nivel inalt care permit recursivitatea,care, asa cum s-a
aratat mai inainte, necesita alocarea dinamica a variabilelor definite in interiorul
procedurilor sau functiilor. Alocarea dinamica nu permite compilatorului sau
editorului de legaturi sa insereze in cod adresele variabilelor manipulate. La
momentul compilarii singura informatie disponibila despre amplasarea variabilelor
este deplasamentul acestor variabile in cadrul zonei de memorie sau cadrului rezervat
pentru procedura in care sunt definite. De aici decurge utilitatea unui registru baza,
care pastreaza adresa de inceput a cadrului, si a modurilor de adresare ce folosesc
acest registru si deplasamentul inserat in cod de catre compilator.

Modurile de adresare cu postincrementare/predecrementare sunt foarte


asemanatoare cu unele moduri de adresare ce folosesc registrul baza, diferenta
constind in incrementare/decrementare in locul adunarii cu valoarea
deplasamentului. Postincrementarea simpla este folosita de toate microprocesoarele
pentru extragerea instructiunilor, ca si pentru modurile de adresare imediata si
directa. Autoincrementarea/autodecrementarea sunt folosite si in legatura cu stiva,
pentru extragerea/introducerea de date in stiva. Nu toate registrele unitatii centrale
permit adresarea in autoincrementare/autodecrementare.

39
Aceleasi operatii de autoincrementare/autodecrementare sunt folosite si pentru
implementarea operatiilor cu siruri, care necesita incrementarea automata a
indicatorului sirului. Modurile complexe bazate pe autoincrementarea registrelor
folosesc, de exemplu, pentru manipularea unui bloc de operanzi ale caror adrese sunt
memorate intr-un sir de locatii contigue. Desi de o mai mare utilitate, modurile de
adresare utilizind registre baza conduc la scaderea vitezei de executie drept urmare a
ciclurilor suplimentare de memorie cerute de obtinerea valorii deplasamentului. O
cale de diminuare a scaderii performantei consta in utilizarea celor mai scurte
deplasamente posibile.

1.7. Instructiuni.

1.7.1. Codificarea instructiunilor

Orice program executabil consta dintr-o secventa de instructiuni acceptabile de catre


masina. Orice instructiune masina contine doua tipuri de informatie: operatia ce
urmeaza a se executa si unde anume se localizeaza - in registre sau memorie -
rezultatul operatiei. De regula aceste informatii sunt codificate in cimpuri diferite ale
instructiunii, asa ca numarul de cimpuri ale unei instructiuni este in general, de trei.
O instructiune are structura urmatoare :

a) codul operatiei ce se executa (opcode) ;

b) specificarea modului de adresare pentru operanzii de intrare si pentru rezultat;

c) datele ce se utilizeaza in calculul adresei de catre modurile de adresare


specificate.

Instructiunile masina au diferite lungimi, depinzind de numarul de operanzi si


modurile de adresare utilizate. Numarul de operanzi ce se specifica trebuie mentinut
la o valoare cat de mica pentru a lucra cu instructiuni de dimensiuni mici. Daca
operatia efectuata de catre o instructiune necesita n operanzi de intrare pentru a
produce un rezultat, este necesara specificarea a n+1 moduri de adresare si a unui
numar de pina la n+1 deplasamente.

Un mod uzual de scurtare a lungimii medii a instructiunii este cel in care unul din
operanzii de intrare este folosit si ca destinatia rezultatului. Aceasta solutie limiteaza
capacitatea de adresare prin fortarea stocarii rezultatului la adresa unuia din
operanzii de intrare, dar are ca efect o importanta reducere a consumului de memorie.

Un studiu efectuat asupra limbajului Fortran [4] a indicat ca majoritatea


instructiunilor de asignare sunt de forma A:=A op B, unde op reprezinta operatia

40
efectuata cu cei doi operanzi A si B. Din aceste motive,toate microprocesoarele,cu
exceptia lui VAX 11,
folosesc adresa unuia din operanzii de intrare pentru memorarea rezultatului. VAX 11
are instructiuni cu trei adrese pentru operatii implicand doua intrari.

1.7.2. Ortogonalitate

Modurile de adresare si seturile de instructiuni se numesc ortogonale cand procesorul


permite orice combinatie posibila de moduri de adresare si coduri de operatii, cu
exceptia acelor combinatii care sunt lipsite de sens. Ortogonalitatea este o
caracteristica de dorit a instructiunilor, intrucat ea simplifica activitatea generatorului
de cod al compilatorului prin evitarea folosirii de restrictii asupra combinatiilor cod al
operatiei - mod de adresare. In acelasi timp ortogonalitatea conduce la cresterea
lungimii medii a instructiunii. Cresterea este impusa de necesitatea prevederii unor
cimpuri de biti de lungime fixa, independenta de modul de adresare, pentru
specificarea modului de adresare pentru fiecare operand al instructiunii. Se mai
adauga si posibilitatea mai multor operanzi imediati, adrese sau deplasamente in
instructiune.

La microprocesoarele de 8 sau 16 biti s-a adoptat conventia ca unul din operanzi sa fie
continut de un registru al unitatii centrale, celalalt fiind adresat in orice mod posibil.
Solutia are avantajul ca adresa operandului din registru se specifica simplu, prin
numarul registrului respectiv. De asemenea, numarul de operanzi imediati, adrese
sau deplasamente intr-o instructiune se reduce la unu.

Se mai pot da si alte solutii: numai un subset de instructiuni (de exemplu cele folosite
pentru transferul datelor) poate utiliza toate modurile de adresare, in timp ce restul
instructiunilor folosesc numai combinatii permise.

Desi ortogonalitatea este o caracteristica dezirabila, seturile de instructiuni ale


microprocesoarelor existente se abat - in masura mai mica sau mai mare - de la
cerintele ei, fapt ce conduce la cod mai compact, dar si la mai mari dificultati de
realizare a compilatoarelor cu optimizare.

1.7.3. Operatii speciale

In cele ce urmeaza se discuta acele instructiuni care faciliteaza implementarea de


operatii tipice programelor scrise in limbaje de nivel inalt. Desi aceste instructiuni nu
sunt singurii factori care contribuie la eficienta de rulare a programelor, ele se refera
la un set de operatii caracteristice programelor scrise in limbaje de nivel inalt si care se
regasesc in alte tipuri de programe.

41
1.7.3.1. Apeluri de proceduri

Intr-un paragraf anterior s-a ilustrat mecanismul de apelare a procedurii intr-un


limbaj permitind programarea recursiva. In cadrul acestui mecanism se disting mai
multe faze:

- alocarea de memorie pentru noul cadru;


- construirea noului cimp de afisare prin copierea valorilor corespunzatoare din
cadrul programului sau procedurii chematoare si adaugarea unui nou indicator ( daca
procedura apelata este definita in interiorul celei chematoare ;

- saltul la subrutina ;

-salvarea in zona dedicata a contextului, adica a continutu- rilor acelor registre care
sunt utilizate de catre procedura apelata.

Din operatiile listate mai sus doar saltul la subrutina se afla in setul de instructiuni al
oricarui microprocesor, chiar si al celor din epoca de inceput. Microprocesoarele
recent elaborate sunt prevazute cu instructiuni suplimentare, care sa ofere suport
pentru toate fazele de apelare a procedurii. In tabelul de mai jos sunt indicate
facilitatile oferite de unele tipuri de procesoare in privinta apelarii de proceduri.

Tabelul 1.3

Operatia iAPX 286 Z 8000 MC 68020 VAX 11

JSR ENTER CALL ENTER JSR ENTER CALL

Alocarea X X X
cadrului

Salt de X X X X
subrutina

Crearea
zonei de X X X X
afisare

Salvare X
registre

X marcheaza facilitatile oferite de un anumit procesor.

42
1.7.3.2 Referirea elementelor matricilor

Metodele de alocare si acces la elementele unei matrici multidimensionale au fost


prezentate intr-un paragraf anterior, in care s-a indicat si un algoritm iterativ pentru
evaluarea in n pasi adresa unui element al unei matrici cu n dimensiuni, calcul
necesitind valorile indicilor elementului referit. In cele ce urmeaza sunt prezentate
unele elemente legate de testarea incadrarii in limitele impuse a valorii unui indice al
elementului matricii. Daca asemenea teste se pot face cu consumuri mici de resurse, in
special timp, ele sunt de recomandat, deoarece au ca efect cresterea fiabilitatii
programelor prin eliminarea operatiilor de acces la elemente inexistente.

S-a indicat posibilitatea transformarii de catre compilator a unui set de n indici intr-un
numar k cuprins intre 0 si M-1, unde M este produsul numerelor de valori ale
fiecaruia din cei n indici. Microprocesoarele moderne permit testarea valorii k prin
compararea sa cu M-1, iar unele din acestea testeaza si semnul lui k (cele doua limite,
0 si M-1, sunt parametri ai instructiunii de testare). In aceasta a doua categorie intra
procesoarele Z8000 si VAX 11. In plus iAPX 286 face, in aceeasi instructiune, atit
evaluarea lui m, cat si testarea incadrarii sale sub limita superioara.

CAPITOLUL 2
ALTE CARACTERISTICI ARHITECTURALE ALE
MICROPROCESOARELOR

In acest capitol se vor considera caracteristici referitoare la organizarea registrelor,


aritmetica numerelor in formatul cu virgula mobila, intreruperi, capcane si mijloace
de depanare.

2.1 Organizarea registrelor.


Desi unii cercetatori sustin contrariul, practica a demonstrat utilitatea registrelor in
imbunatatirea performantelor microprocesoarelor. Ca exemplu se poate cata
arhitectura procesoarelor RISC, unde se intilnesc zeci sau chiar 138 registre in
componenta unitatii centrale de prelucrare.

Efectele pozitive ale utilizarii registrelor decurg din urmatoarele :

43
a) operatiile asupra continutului registrelor sunt mai rapide decat cele asupra
operanzilor continuti in memorie, pentru ca ALU are acces direct la registre. In felul
acesta rularea programelor poate fi accelerata prin pastrarea in registre a datelor cu
cea mai mare frecventa de utilizare.

b) lungimea medie a programelor scade, intrucat instructiunile care manipuleaza


operanzii aflati in registre nu necesita o intreaga adresa, ci numai cativa biti pentru
specificarea registrului respectiv.

Pe de alta parte, continuturile registrelor (asa numitul context) trebuie salvate la


aparitia unei intreruperi sau capcane sau atunci cand, in regim de multiprogramare,
are loc comutarea programului curent (despre acest subiect se va discuta, pe larg,
intr-un capitol ulterior). In consecinta, un set numeros de registre conduce la timpi
mai lungi de tratare a intreruperii sau de planificare a taskurilor.

2.1.1. Principalele operatii ale unitatii centrale de prelucrare

Cele mai frecvente operatii efectuate de catre CPU sunt transferul de date si evaluarea
de expresii. Practic toate limbajele algoritmice, cum sunt C, Pascal, Fortran, poseda
declaratii de asignare si declaratii de control al fluxului comenzilor (if, while, for etc.).
Asignarea presupune, in general, evaluarea unei expresii si asignarea rezultatului
unei variabile. Declaratiile de control al fluxului comenzilor implica evaluarea unui
predicat si un salt, in functie de valoarea predicatului, la unul din mai multele blocuri
de instructiuni specificate.

Forma obisnuita de scriere a expresiilor, de exemplu :

( A + B ) * ( (C + D) / ( E - F ) )

nu se preteaza la evaluarea directa, deoarece ordinea in care se executa operatiile nu


coincide cu ordinea de aparitie a lor in secventa de operatie. Din acest motiv
compilatorul reordoneaza expresia pentru a fi mai adecvata din punctul de vedere al
generarii codului. Se foloseste notatia numita "reverse polish", conform careia un
operator se aplica celor doi operanzi aflati imediat la stinga sa. Cu aceasta notatie
expresia din exemplul dat devine :

( (A B +) ((C D +)(E F -)/)*)

Pentru stocarea operanzilor pe durata evaluarii unei expresii se pare ca stiva


constituie cea mai adecvata structura de date (fig. 2.1.). Etapele din figura sunt
inlantuite intr-o secventa al

44
carei rezultat final este valoarea expresiei, stiva raminind in starea anterioara
inceperiii evaluarii expresiei. Pentru o instructiune cu n operanzi toate operatiile
aritmetice sunt efectuate asupra celor n elemente din virful stivei. Acest mod de
evaluare a expresiilor a generat sugestii pentru organizare a registrelor care sa ofere
un bun suport operatiilor cu structuri de tip stiva.

Fig 2.1. Evaluarea unei expresii aritmetice in notatia "reverse polish"

2.1.2. Masini cu arhitectura de tip stiva

Ideea care a stat la baza masinilor cu arhitectura de tip stiva (stack machines) consta
in organizarea registrelor pentru a memora si gestiona automat partea superioara a
stivei de evaluare. Instructiunile unei masini de tip stack machine ideala opereaza
doar asupra registrelor ce contin virful stivei, cu exceptia instructiunilor de transfer de
date, care catesc/inscriu registrul din virful stivei in/din memorie. Intrucat stiva
poate creste peste capacatatea de memorare oferita de registre, partea inferioara a
stivei este pastrata in memorie. Acest fapt necesita existenta unor mecanisme pentru
tratarea situatiilor cand virful stivei depaseste partea continuta in registre (register
overflow: toate registrele incarcate, apare necesitatea inscrierii unui nou operand in
stiva) sau cand virful stivei coboara sub partea ce ar putea fi continuta in registre

45
(register underflow: toate registrele vide, apare necesitatea catirii unui operand din
stiva).

Practica nu ofera prea multe exemple de masina de tip stack machine. Majoritatea
acestora au fost construite pentru functii specializate, asa cum sunt procesoarele
matematice. Ca exemplu se poate da procesorul matematic 80287 al familiei iAPX286,
ale carui registre interne constituie o mica stiva. In acelasi timp setul de instructiuni al
procesorului 80287 contine si instructiuni destinate operatiilor implicand operandul
din virful stivei si un operand continut in oricare alt registru. Ca procesor de uz
general de tipul stack machine se poate cata transputerul elaborat de catre firma
INMOS. Conceptul de stack machine este rar utilizat in practica, dar el s-a dovedit
util in crearea de masini abstracte, folosite ca masini intermediare pentru generarea
codului masina, problema ce face obiectul preocuparilor celor ce studiaza si realizeaza
compilatoare.

2.1.3. Masini cu acumulator

Majoritatea microprocesoarelor din prima generatie sunt masini cu acumulator, care


foloseau un registru sau un mic numar de registre pentru prelucrarea datelor. In astfel
de masini, un registru, numit acumulator, contine unul din operanzi si, in acelasi timp
este folosit pentru a stoca rezultatul operatiei. Masinile cu acumulator poseda moduri
simple de adresare, ceea ce nu ofera suficiente facilitati pentru limbajele de nivel inalt,
care necesita determinarea in timpul rularii a adreselor in memorie ale unor
variabile, deci nu se poate concepe determinarea acestora de catre compilator si
fixarea in codul generat a valorilor gasite. Functia de baza a acumulatorului era aceea
de a servi ca virf al stivei de evaluare, intrucat el constituie un operand al tuturor
instructiunilor de prelucrare.

2.1.4. Masini cu registre index

Arhitecturile cu registre index au reprezentat un progres notabil fata de cele cu


acumulator, intrucat permit evaluarea in timpul rularii a adreselor. Registrul index
contine un numar care, prin adunarea cu o valoare continuta in codul instructiunii,
permite determinarea adresei complete a operandului. O varianta o constituie
registrele baza.

De multe ori aceeasi masina contine ambele tipuri de registre. Adresa operandului se
determina adunind continutul registrului baza cu cel al registrului index si cu un
offset continut intr-un cimp al instructiunii. iAPX 286 constituie un exemplu
reprezentativ. Acest microprocesor dispune de registre index, baza si de segment,
folosite la evaluarea adreselor.

Introducerea registrului index scurteaza lungimea instructiunii deoarece, in locul unei


adrese complete, corpul acesteia poate contine doar un offset exprimat pe un numar

46
mai mic de biti, la care se adauga un mic cimp pentru specificarea registrului index
(in situatia ca microprocesorul dispune de mai multe astfel de registre).

2.1.5.Organizarea registrelor de uz general

Numeroase microprocesoare dispun de un set de registre interne care se pot utiliza


pentru toate functiile posibile, intrucat toate instructiunile pot folosi orice registru,
indiferent de numele acestuia (cu exceptia unui mic numar de registre destinate
comenzii microprocesorului). Se spune ca aceste masini au un set ortogonal de
instructiuni si un fisier de registre. Fiecarui registru ii poate reveni una din
urmatoarele functii:

-acumulator,cand este utilizat pentru evaluarea de expresii;

-index/baza: orice registru poate fi desemnat ca registru baza sau registru index,
utilizat la determinarea adresei operandului. Deci, orice registru poate stoca
informatii de tipul indicatorului cadrului sau element din cimpul de afisare;

-indicator al variabilei: registrul este folosit pentru memorarea adresei sau este utilizat
pentru explorarea unei date de lungime mare, cum este sirul de caractere;

-indicator de stiva: registrul permite implementarea mecanismului de stiva;


-registru de comanda: registrul contine informatii de comanda a microprocesorului.
Este cazul unui registru de uz general care contine contorul programului.

Ortogonalitatea intre fisierul de registre si setul de instructiuni trebuie privita ca


suport pentru executia eficienta a programelor scrise in limbaje de nivel inalt, intrucat
simplifica optimizarea utilizarii de catre compilator a registrelor pe durata fazei de
generare a codului. Asa cum s-a aratat [5], optimizarea se face mai usor fie cand exista
mai putine variante, fie cand acestea sunt uniforme. Ortogonalitatea este o noua
contributie in favoarea uniformitatii si permite sa partajeze dinamic setul de registre
intre diferitele functii, cum sunt acumulatoare, registre baza, registre index, cu scopul
satisfacerii cerintelor diverse ale programelor. Acesta este motivul pentru care piata
actuala cunoaste o ampla raspindire a microprocesoarelor cu organizarea de tip
general a registrelor, desi exista unele exceptii notabile.

Lungimea medie a instructiunii pentru tipul de organizare mentionat este mica, fapt
datorat posibilitatii de a pastra in registre un numar mai mare de operanzi fata de alte
structuri, iar specificarea unui registru ocupa mai putin spatiu in codul instructiunii
comparativ cu specificarea unei adrese. Afirmatia este sustinuta si de disponibilitatea
registrelor baza si index pentru stocarea adreselor de memorie. Pentru programele
scrise in limbaje de nivel inalt multe variabile au adrese alocate dinamic, in timpul
rularii, ceea ce impune necesitatea pastrarii lor in registre.
Desi mai putin evidenta la prima vedere, includerea unitatilor de prelucrare a
numerelor cu virgula mobila (FPU) in clasa microprocesoarelor este o necesitate.

47
Chiar daca ele executa operatii specializate, caracteristicile arhitecturale si
programabilitatea justifica numele de microprocesor. Unele procesoare matematice au
registrele organizate similar cu cele unitatii centrale de prelucrare in conjunctie cu
care opereaza si, mai mult, pot avea fisierul de registre considerat ca o prelungire
logica a fisierului de registre al unitatii centrale,cu care au comun chiar setul de
instructiuni (cu exceptia celor pentru operatii aritmetice cu numere in formatul cu
virgula mobila).

2.1.6. Masini fara registre

Asa cum s-a aratat, arhitecturile cu registre nu au doar avantajele unui cod mai
compact si performante mai bune in anumite imprejurari, ci si dezavantajul creat de
necesitatea unor operatii, consumatoare de timp, pentru salvarea contextului cand se
face comutarea la un alt program. Mai delicata este problema in structurile
multiprocesor, in care apare pericolul ca datele folosite in comun de programe ruland
pe microprocesoare diferite sa fie comparate in registrele unei unei CPU, unde sa fie si
modificate. Intrucat registrele nu sunt accesibile dispozitivelor exterioare, modificarile
nu sunt vizibile de catre alte CPU.

In arhitecturile cu registre aceste probleme se solutioneaza fie prin intermediul unor


instructiuni speciale, destinate manipularii datelor critice, fie prin unele particularitati
de limbaj, care permit compilatorului identificarea variabilelor care nu pot fi copiate
sau manipulate in registre. De aceea exista o serie de propuneri si chiar implementari
de microprocesoare fara registre. Avantajele (comutarea rapida a contextului si
eliminarea problemelor conexe variabilelor folosite in comun) le recomanda pentru
folosirea in configuratii multiprocesor. iAPX432, familie ce va fi prezentata intr-un
capitol ulterior, este un reprezentant tipic al acestei generatii de masini. Dintre
dezavantaje sunt de mentionat cresterea lungimii medii a instructiunii, precum si
cresterea duratei medii de executie a unei instructiuni.

2.1.7. Influenta registrelor asupra compactitatii codului

Organizarea registrelor influenteaza lungimea medie a unei instructiuni. Cele doua


cazuri extreme sunt: masina fara registre si masina cu organizare de tip stiva. Prima
clasa necesita specificarea - in cel mai nefavorabil caz - a unui numar de trei adrese.
Cea de a doua clasa necesita specificarea de adrese doar pentru operatiile de acces la
memorie. Intre cele doua extreme eista mai multe clase intermediare (masini cu o
adresa - decicu acumulator fix, sau cu doua adrese).

Pentru evaluarea compactitatii codului mai sunt de considerat si alti factori, intre care
numarul de instructiuni necesar pentru a efectua o anumita operatie.

O comparatie intre parametrii de executie pe diverse tipuri de masini evidentiaza


dezavantajele tipice ale masinii cu acumulator, care necesita un numar mai mare de
operatii de acces la memorie (consumatoare de timp), consecinta a numarului mic de

48
registre. Programul masinii cu organizarea bazata pe stiva este mai compact, dar
masina cu registre de uz general poate emula comportamentul masinii cu stiva fara a
consuma un numar superior de instructiuni.

2.1.8. Concluzii

Numarul, dimensiunea si functiile registrelor sunt elemente de cea mai mare


importanta in evaluarea organizarii interne a unui microprocesor, incluzind aici si
procesoarele matematice.

Dimensiunile registrelor sunt influentate de lungimea cuvintului de date extern si de


dimensiunea adresei emise de catre CPU, adresele fiind un tip special de operanzi
manipulati prin registre. Pentru microprocesoarele de 8 si 16 biti, cu lungimea
cuvintului de date mai mica decat cea a adresei,se utilizeaza instructiuni speciale si
mecanisme adecvate pentru operatii simple asupra adreselor. Acest lucru nu mai este
necesar la microprocesoarele de 32 biti. Pentru manipularea de catre registre a datelor
mai scurte decat lungimea registrelor se folosesc diverse metode. In fig. 2.2. se indica
trei astfel de metode. Ele sunt ilustrate considerand un fisier de registre compus din
16 registre de 32 biti. Fig. 2.2.a. ilustreaza memorarea octetilor, a cuvintelor si a
cuvintelor lungi, cate un element de date in fiecare registru, indiferent de lungimea
elementului. Aceleasi 16 registre de 32 biti apar ca 64 registre de 16 biti sau 128
registre de 8 biti (fig. 2.2.b.). In fig. 2.2.c. cele 16 registre sunt specializate in
manipularea octetilor, cuvintelor si cuvintelor lungi. De remarcat ca s-au creat cate 16
registre pentru fiecare lungime de cuvint.
Prima schema de alocare este mai simpla. A doua schema conserva, intr-o oarecare
masura, ortogonalitatea si introduce o mai flexibila utilizare a registrelor, dar si
complicatii in utlizarea lor optima. A treia schema este caracterizata de cel mai mic
grad de ortogonalitate, intrucat contine restrictii in privinta utilizarii registrelor.

Fig 2.2. Diferite scheme de alocare in registre a operanzilor de variate dimensiuni

Orice microprocesor dispune, in afara celor mentionate pina acum, de registre


dedicate unor functii speciale. Este cazul celor ce contin indicatorii de conditie,
contorul programului, precum si al registrelor de segment sau de pagina. In unele
sisteme, aceste registre au copii, una fiind disponibila pentru modul de lucru
utilizator (user mode) iar cealalta pentru modul de lucru supervizor (supervisory
mode).

2.2. Numere cu virgula mobila

2.2.1. Reprezentarea numerelor reale

Numerele reale constituie un tip de date important, indeosebi pentru aplicatii


stiintifice si ingineresti. Multimea numerelor reale constituie un interval, deci intre

49
oricare doua numere reale exista un al treilea. Calculatoarele permit reprezentarea
exacta doar pentru un numar finit de numere, deoarece orice element de date se
reprezinta cu ajutorul unui numar finit de biti, deci exista un numar finit - chiar daca
mare - de combinatii posibile. Deci valorile reale pot fi reprezentate doar cu
aproximatie intr-un sistem de calcul.

O alta caracteristica a datelor reale este gama larga in care se incadreaza valorile
acestora. Esentiala ramine reprezentarea cu o anumita precizie relativa a numerelor,
indiferent de eroarea absoluta de reprezentare. Adesea se vorbeste despre
reprezentarea cu un numar dat de zecimale exacte.

O metoda de a separa domeniul si precizia consta in a reprezenta numerele in forma:

x = (-1)s (j.m)Ke,

in care s este bitul de semn, j este partea intreaga a mantisei, m - partea sa fractionara,
K este baza de reprezentare si e - exponentul. j are lungimea de un bit.

Deoarce baza K este o constanta a reprezentarii, valoarea unui numar in formatul cu


virgula mobila este complet specificata prin:

-semnul mantisei;
-partea intreaga a mantisei;
-partea fractionara a mantisei;
-exponentul.

Fig. 2.3. indica un mod de alocare a celor n biti destinat reprezentarii unui numar real.

Fig. 2.3. Formatul generic pentru numere cu virgula mobila.

Este interesant de remarcat relatia intre mantisa si valoarea lui K: alegerea bazei de
reprezentare egala cu baza de numeratie pentru mantisa simplifica separarea partilor
intreaga si fractionara. Este motivul pentru care, in format extern, K = 10, iar in format
intern K = 2 (formatul extern este cel cu care opereaza programatorul, iar formatul
intern - cel asupra caruia opereaza sistemul de calcul).

Valoarea lui K impreuna cu numerele de biti folosite pentru reprezentarea numerelor


reale definesc gama si precizia reprezentarii in formatul cu virgula mobila. Gama este
cuprinsa intre si . Precizia relativa este data de valoarea maxima a raportului
(xi+1 - xi)/xi, xi si xi+1 fiind doua valori reprezentabile intre care nu mai exista o a treia
valoare. Raportul este maxim cand mantisa este minima, deci precizia relativa este, iar
cea absoluta are valoarea .

Se poate vedea disjunctia intre cerintele referitoare la gama si precizie, deoarece valori
mari ale lui q maresc gama, dar inrautatesc precizia.

50
Multe formate de reprezentare cu virgula mobila folosesc forma normalizata a
mantisei, in care j este egal cu 1. Utilizarea formei normalizate conduce la obtinerea
preciziei maxim posibile in urma calculelor, caci trunchierea are loc dupa
normalizare. In schimb ea nu permite reprezentarea exacta a lui 0, si poate avea ca
efect si limitarea inferioara a celei mai mici valori pozitive reprezentabile.

In urma operatiilor cu numere reprezentate in formatul cu virgula mobila pot aparea


depasiri superioare (overflow), cand rezultatul depaseste limita maxima a gamei de
reprezentare, sau depasiri inferioare (underflow), cand rezultatul este mai mic decat
cel mai mic numar reprezentabil.

2.2.2. Standardul IEEE 754

Standardul IEEE 754 acceptat de marea parte a specialistilor, ofera o maniera unitara
de reprezentare a numerelor in formatul cu virgula mobila, fapt ce a condus la
utilizarea sa exclusiva in toate sistemele cu microprocesoare. Standardul IEEE 754
permite si conversia comoda intre diferite formate cu virgula mobila, conversii din si
in formatul BCD, precum si tratarea cazurilor de exceptie.

2.2.2.1. Formate

Exista patru formate, impartite in doua clase: formate de baza si formate extinse.
Fiecare grup include un format cu precizie simpla si un altul cu precizie dubla.
Formatele sunt compuse din bitul de semn s, o parte fractionara f si un exponent e.
Desi e poate fi pozitiv sau negativ, el este adunat cu un deplasament (reprezentarea
cu exponent deplasat) asa ca valoarea sa minima este zero.

Formatele extinse depind de implementare si sunt compuse dintr-un bit de semn s, o


parte intreaga a mantisei j, o parte fractionara f a acesteia, si un exponent e, de
asemenea deplasat.

Fig.2.4. Formate IEEE 754

Formatul de baza cu precizie simpla. Acest format include un bit de semn, un


exponent de 8 biti si o mantisa de 32 biti (fig. 2.4.a). Valoarea v a numarului se
determina astfel:

-daca e=255 si f=0, atunci v = NaN (Not a Number - nu este valoare numerica in
formatul cu virgula mobila );

-daca e=255 si f=0, atunci v = (-1)s x;

-daca 0<e<255 atunci v = (-1)s x 2e-127 x 1.f (1.f este numarul zecimal cu partea
intreaga 1 si cea fractionara f);

-daca e=0 si f=0, atunci v = (-1)s x 2-126 x 0.f;

51
-daca e=0 si f=0, atunci v = 0

Formatul de baza cu precizie dubla. Formatul include un bit de semn, un exponent de


10 biti si o mantisa de 52 biti (fig. 2.4.b). Valoarea v a numarului se determina astfel:

-daca e=2047 si f=0, atunci v = NaN ;


-daca e=2047 si f=0, atunci v = (-1)s x ;

-daca 0<e<2047, atunci v = (-1)s x 22-1023 x 1.f;

-daca e=0 si f=0, atunci v = (-1)s x 22-1023 x 0.f;

-daca e=0 si f=0, atunci v=0

Formatul extins, cu precizie simpla. Formatul include un bit de semn, o parte intreaga
de 1 bit, o parte fractionara de cel putin 31 biti si cu un exponent cu valoarea minima
m si valoarea maxima M, cu m < 1022 si M < 1023. Valoarea v a numarului se
determina astfel :

-daca e=M si f=0, atunci v = NaN ;

-daca e=M si f=0, atunci v = (-1)s x ;

-daca m < e < M , atunci v = (-1)s x 2e x (j.f);

-daca e=m si j=f=0, atunci v = 0 ;

-daca e=m si j=0 sau f=0, atunci v = (-1)s x 2e (j.f),cu e` =m sau e` = m + 1.

Formatul extins, cu precizie dubla. Formatul este similar cu cel extins cu precizie
simpla, dar m < -16382 si m < 16383, iar numarul de biti al partii fractionare este de
cel putin 63.

2.2.2.2 Rotunjirea

Operatia de rotunjire actioneaza asupra unui numar, considerat a avea precizie


infinita, si il modifica pentru a obtine un alt numar care sa se poata incadra intr-un
format de destinatie. Operatia este insotita si de un indicator care arata daca rezultatul
este sau nu corect.

Standardul IEEE 754 include un mecanism de rotunjire care se aplica automat in


conditiile in care nu se selecteaza un altul din trei disponibile. Mecanismul standard
efectueaza rotunjirea la cea mai apropiata valoare ce se poate reprezenta. Daca exista
doua valori posibile, se alege cea cu sot. In astfel de cazuri eroarea de rotunjire este
egala cu o jumatate din valoarea asociata celei mai putin semnificative pozitii binare.

52
Cele trei mecanisme de rotunjire selectabile sunt:

-rotunjirea catre + ;
-rotunjirea catre - ;
-rotunjirea catre 0 (trunchiere);

Operatia de rotunjire poate fi efectuata pentru a produce formatul cerut de destinatia


la care se stocheaza numarul, dar ea care poate fi efectuata si asupra numerelor cu
dubla precizie in scopul conversiei lor in formate cu simpla precizie. Standardul IEEE
754 include o asemenea facilitate deoarece unele masini nu accepta decat formatul cu
dubla precizie.

2.2.2.3. Valori speciale

Reprezentarea standard in formatul cu virgula mobila accepta infinitul in operatii


aritmetice sub doua forme, selectabile de catre utilizator: cea proiectiva si cea afina. In
absenta optiunii utilizatorului se adopta forma proiectiva. Forma afina este definita
prin relatia:

- < orice numar finit < +

Forma proiectiva compara intotdeauna numerele egale, indiferent de semn.


Standardul defineste un set de operatii astfel incat utilizarea unui operand nu
conduce la rezultate nedorite. In consecinta nu sunt necesare capcane pentru
detectarea acestor situatii, raminind, insa, valabile restrictiile privind operato- rul
care se vor discuta mai tirziu.

O alta valoare speciala este NaN, introdusa pentru a semnala operatii ilegale sau
operatii care produc rezultate ilegale. Standardul defineste capcane pentru valorile
NaN, care activeaza un caz de exceptie cand asupra acestor valori se efectueaza
operatii. Exista si situatia in care sunt permise operatii cu una sau mai multe valori
NaN, dar sunt afectati in mod corespunzator indicatorii de eroare.

2.2.2.4. Operatii

Standardul mentionat defineste urmatoarele operatii: adunare, scadere, inmultire,


impartire, extragerea radicalului de ordinul doi, determinarea restului unei impartiri,
conversii de formate (virgula mobila, intregi, BCD), comparatia intre numere in
formatul cu virgula mobila. In cadrul ultimei operatii sunt permise relatiile "mai
mic" , "egal" , "mai mare", si "neordonat",acestea din urma pentru cazurile utilizind
argumente sau NaN.

53
2.2.2.5 Exceptii si capcane

Standardul IEEE 754 defineste exceptiile care trebuie detectate, precum si informatiile
care trebuie transmise rutinei activate de capcana, impreuna cu indicatorii de
conditie.

Operatie ilegala. Acest tip de exceptie se poate subdiviza in doua clase: operand ilegal
si rezultat ilegal. In ambele clase, daca nu se activeaza o capcana, rezultatul este NaN.

Exceptia "operand ilegal " apare cand:

-cel putin un operand este NaN si nu este activata nici o capcana;

-se executa una din operatiile (reprezentare proiec- tiva), (reprezentare


afina), / , 0 / 0, 0 *;

-in operatia REM de evaluare a restului impartirii lui x cu y (x REM y) x este infinit
sau y este zero ;
-se evalueaza radicalul de ordinul doi al unui numar negativ;

-se executa conversia din formatul cu virgula mobila in intreg sau BCD si, datorita
unei depasiri superioare, sau operand sau NaN ,conversia nu se poate termina
corect;

-se efectueaza comparatii cu predicatele < , > sau negatele lor, iar relatia dintre
operanzi este "neordonat".

Exceptiile datorate rezultatelor incorecte apar cand rezultatul unei operatii nu este
adecvat formatului de destinatie.

Alte exceptii. Alte exceptii evidentiate de catre standard sunt:

-impartirea cu zero ;

-depasirea superioara (overflow);

-depasirea inferioara (underflow);

-rezultate inexacte, care apar cand valoarea rotunjita a rezultatului produce o


depasire.

Parametrii capcanelor. Capcanele (traps) asociate exceptiilor pot fi activate sau


dezactivate de catre utilizator. Cand o capcana este activata, exceptia are ca efect
activarea unei rutine definite de utilizator sau proprie sistemului. Acestei rutine
trebuie sa i se furnizeze urmatoarele informatii:
-tipul exceptiei detectate;

54
-tipul de operatie care se executa;

-formatul de destinatie;

-rezultatul corect rotunjit (in cazul depasirilor superioara sau inferioara), rezultatul
inexact si ilegal, ca si informatia care nu se incadreaza in formatul de destinatie;

-valorile operanzilor (in cazul impartirii cu zero si al exceptiilor privind operanzii


(legali).

2.3. Intreruperi.
Intreruperea este produsa de un eveniment exterior CPU, adesea de o operatie de
intrare/iesire. Efectul intreruperii consta in suspendarea executiei programului aflat
in rulare si in transferarea controlului unei rutine dedicate tratarii intreruperii
(intrrerupt handler); acesteia ii revine sarcina de a efectua actiunile cerute de
evenimentul extern care a generat intreruperea.

Intreruperile imbunatatesc eficienta de utilizare a unitatii centrale, deoarece permit


efectuarea de operatii I/O in paralel cu activitatea CPU. In figura 2.5 se exemplifica
situatia transferului unui bloc de date efectuat in paralel cu operatia de calcul. CPU
transmite primul element de date spre dispozitivul periferic si activeaza posibilitatea
de intrerupere de catre acesta, dupa care reia operatiile de calcul. Perifericul incepe
operatia de transfer spre iesirea blocului de date. Cand transferul s-a terminat
perifericul genereaza o cerere de intrerupere catre CPU, care isi suspenda temporar
activitatea si activeaza rutina de tratare. Aceasta testeaza situatia blocului ce trebuie
transferat si, in cazul in care este necesar, transmite perifericului un nou element de
date, dupa care controlul este returnat programului intrerupt. Operatia continua pina
cand perifericul a transmis intregul bloc, moment la care posibilitatea de emitere de
catre acesta a cererilor de intrerupere este dezactivata.

Fig. 2.5. Folosirea intreruperilor pentru simultaneitatea operatiilor CPU si I/O

2.3.1. Tipuri de intreruperi.

Microprocesoarele folosesc, in general, patru clase de intreruperi:

a) intreruperi vectorizate;

b) intreruperi nemascabile;

55
c) intreruperi nevectorizate;

d) intreruperi cu relansare.

a) Intreruperi vectorizate.

Intrucat exista mai multe surse de intreruperi, selectarea rutinei de tratare presupune
cunoasterea identitatii sursei intreruperii. Aceasta se realizeaza prin executia unui
ciclu special, numit ciclu de confirmare a acceptarii cererii de intrerupere (interrupt
acknowledge cycle). Pentru aceasta se utilizeaza magistrala externa a
microprocesorului. In cadrul ciclului nu se executa operatii de acces la memorie sau la
un port de intrare/iesire, ci se comanda (direct sau indirect) elementul care a generat
intreruperea, acesta trebuind sa furnizeze CPU un cod de identificare. Acest cod, citit
de catre microprocesor in ciclul de confirmare a acceptarii cererii de intrerupere, este
utilizat de catre CPU ca index al unei matrici pastrate in memorie. In felul acesta se
poate realiza accesul la elementul matricii care contine informatia necesara lansarii in
executie a rutinei de tratare a intreruperii, dupa care are loc activarea rutinei
mentionate.

In general intreruperile vectorizate sunt mascabile adica este posibila ignorarea cererii
de intrerupere vectorizata formulata de un dispozitiv extern. Pentru aceasta se
folosesc instructiuni adecvate.

Primirea cererilor de intreruperi vectorizate se face printr-un singur semnal fizic,


deoarece detaliile privind sursa cererii se obtin prin ciclul de confirmare a acceptarii
cererii de intrerupere.

b) Intreruperi nemascabile.

Acest tip de intreruperi nu poate fi mascat, deci o astfel de cerere de intrerupere


suspenda executia programului aflat in rulaj indiferent de functia executata de acesta.
Evenimentele externe asociate intreruperilor nemascabile sunt mai importante decat
orice operatie posibila efectuata prin program. De aceea, doar evenimentelor cu efecte
catastrofale li se atribuie posibilitatea de emitere de intreruperi nemascabile. Ca
exemple tipice se mentioneaza tendinta de a iesi din parametrii de functionare
normala a sursei de alimentare sau detectarea unor erori in operatiile in conjunctie cu
memoria.

Semnalarea unei cereri de intrerupere nemascabila se face printr-un semnal de intrare


distinct. Nu mai este necesara indicarea sursei unei astfel de intreruperi, intrucat ea se
cunoaste. Cu toate acestea, la primirea unei intreruperi nemascabile, majoritatea
microprocesoarelor efectueaza acelasi ciclu de confirmare a acceptarii cererii de
intrerupere nu pentru obtinerea de date suplimentare, ci pentru a confirma
initiatorului ca intreruperea se afla in curs de servire.

56
c) Intreruperi nevectorizate

Intreruperile nevectorizate se implementeaza prin acelasi mecanism ca si in cazul


intreruperilor nemascabile, adica exista linii specializate de intrare pentru semnalarea
cererilor. Spre deosebire de cele nemascabile, intreruperile nevectorizate pot fi
dezactivate prin program.

d) Intreruperi cu relansare

Cand apare necesitatea servirii unei cereri de intrerupere, CPU suspenda programul
in curs de executie si salveaza minimum de informatie pentru a putea relua, la un
moment ulterior, executia programului suspendat. Suspendarea unui program se face,
de regula, la terminarea instructiunii curente pentru a se reduce la minimum posibil
informatiile ce se salveaza in conjunctie cu programul intrerupt. Sunt, insa, cazuri
cand intreruperea este declansata de o situatie care impiedica insasi terminarea
executiei corecte a unei instructiuni, caz in care intreruperea trebuie servita inainte de
terminarea instructiunii. Ca exemplu se poate cata aparitia unei erori intr-un ciclu de
acces la memorie. Deoarece acest tip de intrerupere suspenda un program in mijlocul
executiei unei instructiuni este necesara salvarea intregii informatii necesare executiei
instructiunii. O alta solutie ar consta in proiectarea instructiunilor astfel incat sa fie
posibila intotdeauna repornirea executiei lor, indiferent de momentul la care a
survenit intreruperea.

2.3.2. Timpul de latenta

Intreruperile semnaleaza aparitia unor evenimente externe care necesita o anumita


actiune de raspuns din partea unitatii centrale de prelucrare. In cazul transferului
unui bloc de date spre un periferic, evenimentul consta in transferul elementului de
date urmator sau in dezactivarea intreruperii de la acel periferic (atunci cand
transferul intregului bloc este terminat).

Un element important de caracterizare a microprocesoarelor este viteza cu care


acestea raspund la cererile de intrerupere. Intervalul de timp minim intre servirea a
doua cereri de intrerupere nu poate fi mai scurt decat timpul de servire a uneia dintre
ele. Timpul cerut de servirea unei cereri de intrerupere depinde de operatiile
necesitate de evenimentul extern care a cauzat intreruperea, precum si de intirzierea
intre activarea cererii si inceputul activitatii rutinei de testare. Aceasta intirziere este
caracteristica microprocesorului si se numeste timp de latenta.

Pentru a putea evalua timpul de latenta a unui microprocesor trebuie examinata


secventa de operatii necesare pentru comutarea de la programul intrerupt la rutina de
servire a intreruperii. Operatiile necesare in acest scop sunt:

-salvarea in stiva a contorului programului si a indicatorilor de conditie;

57
-executia ciclului de confirmare a acceptarii cererii de intrerupere;
Aceste operatii sunt cele strict necesare pentru lansarea in executie a rutinei de tratare.
De cele mai multe ori, rutina foloseste toate registrele unitatii centrale (sau o mare
parte a lor), asa ca este necesara si salvarea in stiva a continutului acestora. Unele
microprocesoare efectueaza automat salvarea, o data cu cea a continutului
programului si a indicatorilor; la altele salvarea se face in rutina de tratare a
intreruperilor. Oricum, timpul de salvare trebuie luat in considerare la evaluarea
timpului de latenta.

2.3.3. Prioritati.

Intrucat, in cadrul unui sistem, pot exista mai multe surse de intrerupere, este posibila
aparitia simultana a mai multor cereri de intrerupere. In consecinta devine necesara
prezenta unui mecanism de solutionare a conflictului intre aceste cereri. Mecanismul
se bazeaza pe asocierea de prioritati cererilor de intrerupere. Lui i se poate aloca si
sarcina de a decide daca unei cereri de intrerupere i se poate da raspuns la un anumit
moment. Regula generala adoptata este accea ca o cerere nu poate fi acceptata daca, la
acel moment, se prelucreaza o intrerupere de nivel de prioritate superior. Ca urmare,
tratarea cererilor de intrerupere cu prioritate mai mica este aminata pina cand
conditiile permit tratarea.

Criteriul de baza pentru alocarea prioritatilor este bazat pe viteza de raspuns impusa
de evenimentele asociate. Cu cat aceasta este mai mare, cu atit nivelul de prioritate
este mai inalt. Ordinea de prioritate este, in general, urmatoarea:

a) intreruperi cu relansare; ele au prioritatea maxima, deoarece sunt asociate


unor evenimente care nu pot astepta terminarea instructiunii curente pentru a fi
servite;

b) intreruperi nemascabile; intreruperile din aceasta clasa sunt mai prioritare


decat cele vectorizate sau nevectorizate, intrucat evenimentele care le determina
necesita o servire rapida si intreruperile nu pot fi mascate;

c) intreruperi vectorizate;

d) intreruperi nevectorizate.

Intreruperile vectorizate constituie o clasa aparte, implicand diferiti timpi de raspuns,


deci cererile sunt formulate pe aceeasi linie catre unitatea centrala de prelucrare.
Evenimentul care determina o intrerupere vectorizata este specificat prin indexul
vectorului, citit pe durata ciclului de confirmare a acceptarii cererii de intrerupere. In
consecinta este necesara introducerea unei ordonari suplimentare a prioritatilor in
clasa intreruperilor vectorizate, ordonare realizata prin folosirea unui circuit exterior
unitatii centrale de prelucrare, intrucat CPU are o singura linie pentru toate cererile
de acelasi tip.

58
Fiecare familie de microprocesoare dispune de o unitate de gestiune a intreruperilor,
care arbitreaza diferitele cereri de intreruperi vectorizate (fig. 2.6). Aceste circuite
accepta cererile individuale de intreruperi de la dispozitivele externe si asociaza cate
o prioritate fiecarei cereri. Cand se desfasoara un ciclu de confirmare a acceptarii
cererii de intrerupere semnalul de iesire INTAi indica evenimentul a carui cerere de
intrerupere este preluata spre servire. INTAi permit dispozitivului selectat sa
transmita pe magistrala indexul vectorului sau de intrerupere pe durata ciclului de
confirmare a acceptarii cererii de intrerupere, astfel incat sa se poata activa de catre
CPU subrutina adecvata de tratare.

INTA/ INT

D7-D0 Data
Buffer Interrupt Logic

CS/
RD/ R/W IRQ0
WR/ Logic IRQ1
A0 I Priority
I
S Discrimi
nator
R
R R
CAS2-CAS0 Cascade
Logic
IRQ7

SP/
I M R
PIC
Fig. 2.6. Interconectarea intre CPU si unitatea de gestiune a intreruperilor

Fig. 2.7 Un mod de implementare a prioritatilor (daisy chain) Daca numarul


evenimentelor generatoare de cereri de intrerupere este superior celui cu care poate
lucra unitatea de gestiune a intreruperilor se poate realiza conexiunea din fig. 2.7.,
numita daisy chain, in care m astfel de unitati sunt interconectate la aceeasi linie
INTRi si aceeasi linie INTAi. Devine posibila ierarhizarea prioritatilor pe o intrare i de
formulare a cererilor de intrerupere catre CPU. Prioritatea depinde de pozitia in
inserierea de unitati de gestiune a intreruperilor. Cand exista o cerere de intrerupere

59
formulata prin intermediul unei unitati toate cererile formulate la unitati ulterioare in
conectarea seriala nu sunt onorate la acel moment.

O alta caracteristica a unitatilor de gestiune a cererilor de intrerupere consta in


dezactivarea tuturor cererilor de intrerupere avind nivelul de prioritate inferior celei
aflate in curs de servire. Drept urmare, evenimentele minore sunt impiedicate sa
lungeasca durata servirii intreruperii provocate de un eveniment important. Deci,
daca in curs de rulare se afla rutina intreruperii de prioritate i, intreruperea de
prioritate j va fi servita doar dupa terminarea tratarii intreruperii i,presupunind ca i
are prioritate superioara lui j.

2.4. Capcane.
Capcana (trap) este un mecanism care produce apelarea automata a unei proceduri.
Spre deosebire de o intrerupere, capcana este activata, explicat sau implicit, de catre o
actiune efectuata de catre programul aflat in rulaj. Capcanele sunt utilizate pentru
tratarea unor conditii de exceptie, adesea anormale, care apar in cursul existentei unui
program, sau pentru activarea unor proceduri speciale, cum ar fi rutine ale sistemului
de operare.

Exceptiile generate de gestiunea memoriei externe sau de unitatile cu virgula mobila


pot fi considerate drept capcane, desi CPU este prevazuta cu linii externe, de acelasi
tip cu cele pentru intreruperi, pentru detectarea acestor situatii. In cazul capcanelor,
aceste linii externe sunt activate de stari de eroare cauzate de program, fie in
gestiunea memoriei, fie in utilizarea unitatii aritmetice cu virgula mobila.

Exista trei tipuri de capcane:

a) capcane activate intotdeauna ;

b) capcane activate/dezactivate prin program ;

c) capcane solicitate explicat prin program.

Primul din aceste tipuri se asociaza cu un eveniment de tip eroare,indiferent de


operatia efectuata de catre CPU; de aceea, nu exista mijloace de dezactivare a acestui
tip de capcana. Exemple tipice in acest sens sunt: tentativa de a executa o instructiune
inexistenta sau aceea de a executa, dintr-un regim neprivilegiat, o instructiune
rezervata regimului privilegiat. In aceeasi clasa pot fi incadrate si capcanele in
conjunctie cu gestiunea memoriei externe.

In al doilea tip de capcane sunt cuprinse evenimentele care reprezinta sau nu


reprezinta o conditie de exceptie sau anormala, in functie de actiunile specifice
efectuate de catre program. Acesta este motivul pentru care capcanele pot fi activate
(dezactivate) de programul insusi, dupa cum este necesar sau nu a detecta aceste
situatii. Standardul IEEE 754 prevede ca exceptiile generate de operatiile cu numere

60
cu virgula mobila sau de conversie pot genera o capcana numai in urma unei activari
de catre program. Un alt exemplu: capcana utilizata pentru a detecta tentativa de
executie a unei operatii cu operanzi cu virgula mobila in absenta unitatii aritmetice
dedicate acestor operatii. In aceste cazuri capcana se dezactiveaza cand configuratia
hardware include procesorul matematic.

Al treilea tip de capcana nu se foloseste, in mod obisnuit, pentru detectarea conditiilor


anormale, dar reprezinta un mijloc de activare a executiei unor rutine speciale, de cele
mai multe ori acestea fiind functii ale sistemului de operare. Adesea ele sunt astfel
organizate incat sa fie posibila activarea lor la aparitia unor capcane. Operatiei ii sunt
dedicate instructiuni speciale, numite adesea apeluri de sistem (system-call
instructions), data fiind menirea lor principala de activare a rutinelor sistemului de
operare. Cand se executa o astfel de instructiune se activeaza capcana
corespunzatoare. Prin asocierea unui parametru aceeasi instructiune poate activa
capcane diferite.

2.4.1. Manipularea capcanelor

Actiunile cerute de manipularea capcanelor sunt similare cu cele executate la aparitia


unei intreruperi: se salveaza in stiva contorul programului si indicatorii de conditie,
apoi se executa saltul la rutina de tratare a capcanei. Informatia despre rutina de
tratare este memorata intr-un vector stocat intr-o zona de memorie bine precizata; in
anumite cazuri capcanele si intreruperile folosesc in comun acelasi vector.

Capcanele permanent activate sau cele care pot fi activate de catre program au asociat
un element specific al vectorului capcanei, intrucat corespund unor evenimente
definite aprioric. Al treilea tip de capcane folosesc acest parametru asociat drept index
pentru identificarea rutinei corespunzatoare, intrucat programul este cel ce asociaza
un anume inteles acestor capcane. Capcane destinate detectarii anomaliilor
efectueaza si salvarea in stiva a conditiilor care au provocat capcana, fapt ce permite
rutinei de tratare sa furnizeze diagnoza privind eroarea si sa "repare" efectele acesteia.

De regula, rutina de tratare a capcanei se executa la un nivel privilegiat superior fata


de cel in care se afla programul ce a produs capcana. Unele microprocesoare au doua
indicatoare de stiva, unul pentru starea normala, iar celalalt - pentru starea sistem.
Stiva sistem este folosita pentru salvarea informatiilor legate de tratarea capcanei, asa
ca, printr-o simpla instructiune return-from-interrupt, se termina executia rutinei si se
returneaza controlul programului curent.

2.4.2. Prioritati

Aparitia simultana de intreruperi si capcane ridica probleme legate de selectarea celei


careia sa i se acorde atentie.

61
Ca si intreruperile, capcanele sunt servite, de regula, la terminarea instructiunii
curente. Unele capcane (cum este page fault trap, despre care se va discuta mai tirziu)
trebuie servite imediat, intrerupind instructiunea curenta. Ele pot fi considerate
similar cu intreruperile cu relansare.

Desi fiecare microprocesor are propriile sale reguli de prioritate privind capcanele, se
pot folosi urmatoarele criterii generale:

- capcanele cu relansare au prioritatea maxima, ca si intreruperile cu relansare;

-celelalte capcane au prioritati superioare intreruperilor mascabile, deoarece ele sunt


folosite pentru detectarea erorilor si starilor anormale, deci necesita atentie imediata;

-intreruperile nemascabile pot intrerupe rutinele de tratare a capcanelor si a


intreruperilor.

Evident, pentru asignarea de prioritati capcanelor nu sunt necesare circuite exterioare.

2.5. Instrumente de depanare


Practica arata ca programele, oricat de ingrijit sunt proiectate si realizate, contin, cel
putin in faza initiala, erori (bugs). Erorile trebuie localizate si corectate (programele
trebuie depanate), proces care, de multe ori, este iterativ. Depanarea este un proces
dificil, care se simplifica prin fragmentarea programelor in blocuri mai mici, mai usor
de stapinit. In sprijinul depanatorului se pot oferi urmatoarele seturi de instrumente:

a) executie pas cu pas;

b) puncte de suspendare a executiei (breakpoints);

c) trasee ale programului (program trace).

Primul instrument permite rularea programului instructiune cu instructiune, executia


fiind stopata la sfirsitul fiecarei instructiuni. Prin examinarea starii CPU si a locatiilor
de memorie se poate determina eventuala abatere a programului de la comportarea
dorita.

Punctele de suspendare a executiei permit suspendarea executiei unui program dupa


executia unei anumite instructiuni. Ele permit executia unor blocuri mai mari de
program inainte de suspendarea executiei la un anumit punct cu scopul testarii
rezultatelor intermediare.

Traseul programului consta intr-o inregistrare a tuturor instructiunilor executate de


program de la ultima suspendare si permite verificarea corectitudinii fluxului de

62
instructiuni parcurse de program. Pentru oferirea suportului necesar acestor
instrumente de depanare, toate microprocesoarele moderne sunt prevazute cu
mecanismele hardware care se descriu in cele ce urmeaza.

2.5.1. Capcana de traseu

Majoritatea microprocesoarelor sunt prevazute cu o capcana speciala, numita trace


trap - capcana de traseu. Ea permite atit executia pas cu pas, cat si realizarea de trasee
ale programului. Capcana se activeaza (dezactiveaza) prin intermediul unui indicator
de conditie special, accesibil prin program.

Cand este activa, capcana de traseu lanseaza in executie rutina de tratare dupa ultima
instructiune executata. Desigur, capcana este dezactivata automat pe durata executiei
rutinei de tratare in scopul evitarii generarii unei bucle infinite.

Rutina de tratare a capcanei de traseu permite programatorului sa afiseze un set de


informatii (starea CPU, locatii de memorie) care sa inlesneasca depanarea
programului. Aceeasi rutina permite memorarea intr-un tampon al traseului a datelor
despre instructiunea executata.

2.5.2. Puncte de suspendare software a executiei

Rularea pas cu pas a programelor este, de cele mai multe ori, consumatoare de timp,
mai ales dupa ce s-au corectat mari blocuri de program. In aceste conditii isi
dovedeste utilitatea punctul de suspendare a executiei (breakpoint). Aceasta facilitate
permite inserarea in program a unor "comenzi" de suspendare. In acest scop se
selecteaza instructiunile pentru care tentativa CPU de a le executa duce la
suspendarea executiei programului. Pentru implementare se foloseste o instructiune
capcana specifica, a carei lungime este cea minima permisa pentru o instructiune.

Cerinta privind lungimea este mai bine inteleasa cand se considera operatiile necesare
realizarii punctului de suspendare a executiei (fig. 2.8.). Instructiunea a carei executie
ar trebui sa suspende rularea programului este stocata intr-o zona speciala de
memorie si este inlocuita prin instructiunea breakpoint. De aceea, instructiunea
capcana nu poate 4fi mai lunga decat cea pe care o inlocuieste; in caz contrar,
substituirea ar afecta si o a doua instructiune. Cand contorul programului indica
locatia in care se afla instructiunea breakpoint, aceasta este executata, fapt ce rezulta
in activarea rutinei asociate de tratare.

Fig 2.8. Operatii in conjunctie cu punctul de suspendare software a executiei

Este posibila reluarea executiei programului dupa o suspendare prin breakpoint, dar,
in prealabil,instructiunea originala trebuie readusa in locatia corespunzatoare din
zona de salvare. 2.5.3. Punct de suspendare hardware a executiei

63
Mecanismul de suspendare software a executiei permite utilizatorului sa intrerupa
executia unui program doar cu ajutorul unei instructiuni particulare. Nu este posibil
sa se stopeze rularea programului impunind drept conditie de oprire accesul la un
anumit operator dintr-o anumita locatie.

Punctul de suspendare hardware a executiei se implementeaza cu ajutorul unitatii de


gestiune a memoriei (memory management unit - MMU), care contine registre in care
se inscrie adresa de memorie la a carei adresare trebuie sa se suspende executia
programului. Cand mecanismul de breakpoint este activat, MMU compara fiecare
noua adresa de acces cu continutul registrelor de breakpoint. La coincidenta MMU
emite un semnal capcana, fapt ce permite ca tentativa de acces la locatia de memorie
al carei nume este pastrat in registrele de breakpoint sa conduca la suspendarea
executiei programului si activarea unei rutine adecvate de tratare a situatiei.

Microprocesoarele moderne permit utilizarea de puncte de suspendare a executiei


programului atit software, cat si hardware. Numarul primelor este limitat doar de
dimensiune zonei de salvare, in timp ce numarul de puncte de suspendare hardware
este limitat de numarul de registre breakpoint din MMU.

2.6. Concluzii
Spre deosebire de cele din capitolul anterior, caracteristicile arhitecturale ce fac
obiectul acestui capitol nu sunt special destinate implementarii programelor scrise in
limbaje de nivel inalt, poate cu exceptia celei referitoare la aritmetica numerelor cu
virgula mobila.

Aceste caracteristici au importanta in utilizarea microprocesorului pentru aplicatii


specifice. De exemplu, tipul si viteza mecanismului de intreruperi definesc
comportarea microprocesorului la evenimente externe, indisolubil legata de
functionarea in sistemele de timp real. Mai mult, asa cum se va constata, aceste
mecanisme sunt indispensabile in implementarea functiilor complexe ale sistemelor
de operare, cum sunt gestiunea memoriei, protectia, multiprelucrarea.

64
CAPITOLUL 3
MULTIPROGRAMARE SI MULTITASKING

3.1. Introducere
Timpul constituie una din cele mai importante resurse ale unui sistem de calcul si este
resursa esentiala in sistemele de timp real. Pentru a obtine eficienta maxima a unui
sistem de calcul este necesar a mentine permanent ocupata unitatea sa centrala de
prelucrare. Orice stare de repaus a CPU duce la risipa timpului de calcul.

Pentru maximizarea performantelor sistemelor de calcul s-au dezvoltat tehnici


sofisticate, ale caror concepte de baza vor fi examinate in acest capitol. Pentru claritate
se vor folosi exemple, indeosebi din domeniul sistemelor cu functionare in timp real,
dar si din cel al sistemelor multi-utilizator cu divizarea timpului (multi-user
time-sharing systems).

3.1.1. Multiprogramarea in sistemele cu divizarea timpului

In regimul de multiprogramare unitatii centrale de prelucrare i se cere sa execute mai


multe programe, scrise de catre programatori diferiti si cu obiective diferite. Un mod
naiv de gestiune a CPU este ilustrat de figura 3.1.b. si fig. 3.1.c. Cele trei programe, A,
B, si C, sunt executate secvential, intrucat nici unul din ele nu poate sa isi inceapa
executia daca exista un alt program aflat in curs de executie, dar neterminat.
Activitatile ce au loc in sistem pe durata executarii programelor pot fi grupate in doua
categorii: activitati de prelucrare si activitati de I/O. Pentru simplificarea desenului
perioadele de timp au fost facute mai lungi si mai putin numeroase decat in sistemele
de timp real. Timpul total de terminare a celor trei programe este de 340 unitati, din
care 210 sunt timp CPU. Deci unitatea centrala a fost utilizata in proportie de 62%,
risipindu-se 38% din capacitatea de calcul.

Pentru cresterea eficientei se poate considera situatia din figura 3.1.c, in care executia
programelor este intercalata. Imediat ce unitatea centrala ar trebui sa intre in repaus
(intrucat programul in curs de executie intra in perioada de activitate I/O), aceasta
este alocata executiei unui alt program, care nu se afla in faza I/O. Executia primului
program este reluata cand si-a terminat faza I/O si cand CPU tinde sa devina inactiva.
In aceasta noua schema timpul total de executie este de 240 unitati, iar gradul de
utilizare a CPU este de 87,5%. Mai trebuie remarcat faptul ca, desi timpul total de
rulare a celor trei programe este mai scurt ca in cazul b, executia fiecaruia din cele 3
programe in cazul c dureaza mai mult decat in cazul b. Altfel spus, timpul de raspuns

65
pentru un utilizator individual creste, dar cresterea este suficient de mica pentru a nu
deranja in regim de multiprogramare.
Fig. 3.1. Executia programelor in sistemele cu monoprogramare (a) si
multiprogramare (b)

3.1.2. Functionarea multitasking in aplicatiile de timp real

Cu totul altfel se pune problema in sistemele functionind in timp real, in care unele
din taskuri nu pot fi intirziate peste anumite limite. O alta diferenta fata de
multiprogramare este data de faptul ca taskurile unui sistem in timp real sunt
coordonate in scopul indeplinirii unor conditii impuse. Diferentele mentionate
permit, totusi, folosirea acelorasi mijloace de baza pentru executia intercalata a
programelor.

Intercalarea apare ca naturala in sistemele functionind in timp real, deoarece insusi


mecanismul de intreruperi ofera o metoda de alternare a executiei programului cu
aceea a rutinei de tratare a intreruperilor. Se considera un sistem destinat citirii la
intervale constante de timp a esantioanelor unui semnal obtinute cu ajutorul unui
convertor analog numeric. La fiecare moment de esantionare rutina care trateaza
intreruperea de la convertor (A) trebuie sa testeze incadrarea esantionului intre limite
impuse; in caz afirmativ valoarea este memorata intr-un tampon si, la acumularea in
acesta a unui numar de 5 esantioane, controlul este transferat rutinei B. B efectueaza
calculele necesare asupra acestor esantioane; cand un esantion nu se incadreaza in
limitele specificate se activeaza o scurta rutina de alarmare (C), care nu blocheaza
celelalte activitati. In fig. 3.2. se poate vedea un exemplu de desfasurare a calculelor.
Se observa ca executia rutinei B este intercalata cu executia celorlalte programe.

Fig. 3.2. Executia diferitelor taskuri intr-un sistem in timp real

66
3.1.3. Mijloace de sprijin pentru multiprogramare.

Din exemplele de mai sus se constata ca executia eficienta a mai multor programe pe
acelasi sistem necesita disponibilitatea in cadrul acestuia a urmatoarelor mecanisme:

a) salvarea si restaurarea starii programelor pentru a permite intreruperea si reluarea


corecta a executiei, cerute de executiile intercalate;

b) excluderea mutuala, care permite utilizatorilor sa foloseasca in comun o resursa,


evitand problemele generate de posesia multipla a resursei;

c) sincronizarea, pentru a coordona activitatile taskurilor care interactioneaza ;

d) activarea si dezactivarea taskurilor, permitand pornirea si oprirea unui anumit


task.

In cele ce urmeaza se discuta implementarea acestor mecanisme in structurile


moderne de microprocesoare.

3.2. Procese si procesoare.


Mecanismele cerute de executia eficienta a diverselor programe pe acelasi sistem nu
pot fi programate de catre programatorul de aplicatii, deoarece ele trateaza
evenimente impredictibile la momentul compilarii. In astfel de evenimente se pot
include: aparitia de esantioane care nu se incadreaza in gama stabilita, numarul si
caracteristicile celorlalte programe (a caror executie este intercalata cu executia
programului in discutie ) etc. Deci, sistemul de operare este cel care trebuie sa ofere
facilitatile de baza necesare implementarii corecte si comode a sistemelor cu
multiprogramare. Fig. 3.3. prezinta structura sistemului de operare. Nucleul
sistemului de operare (OSK - Operating System Kernel) este format dintr-o colectie de
proceduri care implementeaza cele patru mecanisme din paragraful anterior, care pot
fi utilizate de celelalte taskuri indicate in figura pentru a realiza coordonarea
activitatilor lor. Totusi, nu toate aceste taskuri sunt in mod necesar dedicate
implementarii activitatilor legate de aplicatii. Unele dintre ele fac parte din sistemul
de operare (de exemplu cele destinate gestiunii fisierelor). Cu toate acestea, atit
taskurile sistem, cat si cele de aplicatii folosesc aceleasi functii si doar prioritatile
asociate sunt elementele ce le deosebesc in tratarea de catre OSK.

67
Fig. 3.3. Structura sistemului de operare

In general, taskurile din figura sunt numite procese. Fiecare proces este compus din
trei parti principale:

a) O baza de date, pastrata, de regula, in memoria principala, care contine toate datele
si spatiul de memorie necesare pentru reprezentarea variabilelor programului, ca si
celelalte variabile cerute de executarea calculelor aferente.

b) Codul care implementeaza algoritmul executat de catre proces.

c) Mediul in care se executa procesul. Termenul de "mediu" indica o serie de atribute


ale procesului, adesea gestionate de catre sistemul de operare, care sunt necesare
executiei corecte. Exemple de atribute pot fi descriptorii zonelor de memorie rezervate
procesului, cu drepturile de acces pentru fiecare din ele. Problema va fi reluata
ulterior.

Un numar de procese pot avea parti comune: aceeasi secventa de instructiuni sau
parti ale bazelor de date. In prima clasa intra compilatoarele in sistemele cu
multiprelucrare, folosite in comun de mai multi utilizatori. In aceste cazuri, in
memoria sistemului se incarca o singura copie a compilatorului, iar fiecarui utilizator
i se aloca zone de date si medii distincte, fapt ce evita multiplicarea copiilor
compilatorului. Procesele care folosesc in comun acelasi cod se numesc "instantanee"
sau treceri (instances) ale aceluiasi program. Utilizarea in comun de date de catre mai
multe procese se manifesta cand utilizatorul doreste sa implementeze transferul de
date intre procese printr-un set de variabile vizibile de catre toate procesele aflate in
comunicatie.

68
Situatia este similara cu cea a variabilelor globale din programele Pascal, care sunt
vazute din si pot fi utilizate de catre toate procedurile declarate in cadrul acestor
programe. In sistemele cu multiprelucrare legarea variabilelor comune nu se face
precum in Pascal, ci de catre sistemul de operare cu informatiile continute in directive
ale utilizatorului.

3.3. Executia intercalata a proceselor.


Instructiunile ce compun codul unui proces se executa secvential, cate una la anumite
momente de timp. Daca sistemul de intreruperi nu este dezactivat, executia
procesului curent poate fi intrerupta la sfirsitul unei instructiuni masina pentru a
permite comutarea CPU catre rularea unui alt proces. Devine, deci, posibila
intercalarea instructiunilor unui proces intre doua instructiuni ale altui proces.

Efectul la nivel macroscopic al intercalarii executiei diferitelor procese consta in


senzatia ca unitatea centrala de prelucrare acorda intreaga sa atentie in paralel tuturor
proceselor. Utilizind o scala mai fina a timpului se constata, totusi, ca microprocesorul
executa, la un moment dat, un singur proces. Pentru asemenea sisteme se mai
foloseste si denumirea de pseudoparalele.

De curand, au fost puse pe piata [10],[11] mai multe microcalculatoare destinate


utilizarii in configuratii multiprocesor (fig. 3.4). Sistemele, continand mai multe
unitati centrale de prelucrare, permit implementarea proceselor cu adevarat paralele
(spre deosebire de cele pseudoparalele), intrucat fiecare procesor poate executa un
proces in paralel cu alte procesoare. Sistemul nu rezolva problemele excluderii
mutuale si ale sincronizarii. De asemenea, chiar si pentru instructiunile multiprocesor
exista un anumit grad de pseudoparalelism.

Fig.3.4. Sistem multiprocesor cu magistrala comuna

3.4. Comutarea proceselor

3.4.1. Starile procesului

Pentru a obtine pseudoparalelismul este necesara comutarea CPU intre doua procese.
Ea consta din doua faze simetrice : salvarea contextului procesului intrerupt si
restaurarea acestuia la terminarea intreruperii. O problema esentiala a implementarii
este definirea starii unui proces, care este compusa din toate informatiile necesare
reluarii ulterioare corecte a operarii procesului, la un moment cand CPU este din nou
alocata procesului suspendat.

Cand s-a definit un proces s-au indicat trei componente. Apare ca naturala divizarea
in trei clase a informatiilor ce compun starea unui proces:

69
a) Valorile datelor ce se salveaza. De obicei acestea sunt continuturile registrelor,
care se afla intr-o zona considerata nesigura intrucat noul proces, prin utilizarea
registrelor, distruge continutul acestora. In clasa registrelor intra, desigur, indicatorul
stivei si indicatorii de conditie.

b) Contorul programului, indicand prima instructiune ce trebuie executata la reluarea


rularii procesului.

c) Toate registrele care contin informatii ce descriu mediul de executie al procesului,


incluzind, eventual, registrele unor dispozitive externe, cum sunt unitatea de gestiune
a memoriei si coprocesorul matematic.

Toate aceste informatii trebuie salvate intr-o zona de memorie dedicata, rezervata
special pentru astfel de scopuri si pentru fiecare proces. Continutul acestei zone
descrie starea atinsa de catre procesul asociat cand acesta a fost suspendat. Pentru
reluarea corecta a executiei procesului suspendat este suficienta reincarcarea acestor
informatii in registrele din care au provenit.

Informatia salvata de suspendarea unui proces constituie o descriere a starii acestuia.


Intr-un mediu multitasking mai sunt necesare si alte detalii pentru o completa
caracterizare a starii procesului. In mod obisnuit, informatiile suplimentare necesare
identificarii procesului se adauga la cele continute in registre pentru a forma un bloc
compact, care mai contine si parametrii necesari implementarii de catre CPU a unei
strategii de planificare. Acest bloc compact, pastrat in memorie, se numeste
descriptorul procesului, deoarece el descrie toate caracteristicile relevante ale
procesului si starea la care au ajuns calculele asociate lui. In fig.3.5 se sugereaza o
posibila structurare a unui descriptor de proces. Se remarca structura de lista
inlantuita, existind indicator catre descriptorul unui alt proces, fapt ce faciliteaza
activitatea planificatorului.

70
Fig. 3.5 Exemplu de format pentru descriptorul procesului

3.4.2. Salvarea si restaurarea continutului registrelor.

Comutarea procesului (adesea numita si comutarea contextului) este o operatie


elementara, dar ea este o componenta importanta a primitivelor complexe dedicate
operatiilor de gestiune in sisteme multitasking. Intrucat ea este frecvent folosita in
sistemele cu utilizatori multipli, viteza de comutare a contextului este unul din factorii
majori in influentarea eficientei unui sistem, indeosebi in aplicatiile in timp real.

Cea mai mare parte a consumului de timp in comutarea contextului se datoreaza


transferului continutului registrelor in zona de memorie alocata descriptorului si,
reciproc, transferului de date din zona alocata descriptorului in registrele adecvate. In
arhitectura microprocesoarelor se impune realizarea compromisului intre viteza de
executie a programelor si cea de comutare a contextului.

O unitate centrala de prelucrare cu multe registre ruleaza mai eficient un proces ca


urmare a posibilitatii de stocare in CPU a unui numar mai mare de date. Pe de alta
parte, timpul consumat la comutarea contextului este, practic, proportional cu
numarul de registre. Nici arhitectura fara registre nu pare solutia optima, deoarece
lungeste duratele de executie a programelor.

Majoritatea microprocesoarelor moderne au in structura lor 8-16 registre de uz


general, al caror continut poate fi salvat sau restaurat cu acelasi tip de instructiune
(push - pop).

3.5. Excluderea mutuala


Executia paralela sau pseudoparalela a mai multor procese conduce, in mod
inevitabil, la concurenta pentru resursele sistemului, resurse ce pot fi solicitate de mai
mult de un proces pentru terminarea taskului ce i s-a asignat. Fenomenul este evident
in cazul sistemelor paralele, dar apare ca paradoxal pentru sistemele pseudoparalele.

3.5.1. Concurenta in sisteme pseudoparalele

Se considera doua procese A si B, care au nevoie de o resursa a sistemului. Starea


acesteia, libera (free) sau ocupata (busy), este memorata in locatia de memorie X. X =
0 indica resursa libera. Se considera o masina ipotetica, folosind un limbaj de
asamblare ipotetic, dar evident ca mnemonica, ruland, pentru fiecare proces,
urmatorul cod:

71
test X ; inscrie indicatorul de conditie conform valorii memorate in X
bne after ; salt la eticheta after daca resursa este ocupata
set X ; inscrie 1 in X pentru a semnala ca resursa a devenit ocupata

S-a presupus ca resursa nu poate fi alocata mai multor utilizatori (cazul imprimantei).

CPU efectueaza comutarea proceselor dupa executia unei instructiuni. Se considera


doua procese A si B, care incearca simultan obtinerea resursei a carei stare este
reprezentata prin X, X avind valoarea initiala 0.

Procesul A Procesul B Valoarea citita sau inscrisa


----------------------------------------------------------

test X 0
bne after

(A suspendat, B activat)

test X 0
bne after
set X 1

(B suspendat, A activat)

set X 1

72
In acest exemplu, in care nu exista nici un control privind utilizarea lui X, este posibil
ca ambele procese sa considere resursa disponibila, asa ca ea va fi incorect utilizata.
Deci, ambele procese se considera drept unicul posesor, cand, de fapt, ele utilizeaza
aceeasi resursa in paralel.

Din exemplu rezulta ca este necesar un mecanism de control al accesului la resursele


critice. Solutia problemei excluderii mutuale trebuie sa satisfaca urmatoarele criterii:

(1) numai un singur proces poate utiliza, la un anumit moment de timp, resursa in
discutie;

(2) cand mai multe procese incearca, simultan, obtinerea resursei, mecanismul de
control trebuie sa aloce resursa numai unuia din procese si intr-un timp finit;

(3) cand un proces detine o resursa, timpul de posesie trebuie sa fie limitat; la
expirarea lui resursa trebuie sa fie eliberata;

(4) procesele asteptind disponibilitatea resursei trebuie sa nu iroseasca timpul unitatii


centrale, deci trebuie suspendate.

73
Specificarea unor valori finite de timp pentru acordarea si posesia resursei nu este
direct legata de excluderea mutuala, dar se introduce pentru evitarea blocarii
(deadlock). Conditia (4), cum se va arata, poate fi doar partial satisfacuta, deci ar
trebui considerata ca dezirabila si nu ca obligatorie.

3.5.2. Regiuni critice

Problemele anterior mentionate sunt produse de executia intercalata a instructiunilor


celor doua proceduri atunci cand executa operatii cu elementul critic de date X.
Problema excluderii mutuale se solutioneaza daca, pe durata accesului la o resursa
critica, nici un alt proces nu mai are acces la aceasta. O constructie clasica utilizata
pentru implementarea excluderii mutuale este "regiunea critica", propusa de catre
Dijkstra [12].

Unei regiuni critice ii sunt asociate un set de declaratii si o variabila, comune tuturor
proceselor ce doresc sa utilizeze resursa. Toate regiunile critice referitoare la aceeasi
variabila comuna se executa prin excludere mutuala.

Proprietatile regiunii critice sunt urmatoarele:

a) cel mult un proces executa declaratiile asociate regiunii critice;


b) un proces care doreste sa execute declaratiile asociate regiunii critice va dobandi
acest drept intr-un timp finit;
c) un proces care doreste sa execute declaratiile unei regiuni critice o face intr-un
timp finit.

Operatiile ce trebuie efectuate cand un proces doreste sa execute o regiune critica sunt
simple. In primul rand se testeaza valoarea unei anumite variabile pentru a se
determina daca regiunea in discutie este executata de catre un alt proces (caz in care
variabila are valoarea 1). Apoi variabila se inscrie cu 1 pentru a indica "regiunea
ocupata". (Daca regiunea era gasita ca ocupata, inscrierea cu 1 a variabilei nu are
efecte nocive.) Urmeaza executia regiunii, care trebuie sa se termine intr-un timp finit.
La iesirea din regiunea critica procesul reseteaza valoarea variabilei comune asociate
regiunii critice, fapt ce permite ca alte procese sa obtina, eventual, accesul la regiune.
Desi nu se face nici un fel de ipoteza asupra comportarii proceselor care asteapta,
criteriul (4) anterior mentionat sugereaza ca procesele in asteptare vor fi blocate pe
durata cat regiunea este ocupata si activate la eliberarea ei. Cum numarul de procese
care asteapta poate fi mai mare decat unu, este necesara o politica de planificare.
Totusi, trebuie subliniat ca notiunea de regiune critica nu include un algoritm anumit
de stabilire a prioritatilor, dar, daca acesta exista, el trebuie facut "nepartinitor",
pentru ca timpul de asteptare al fiecarui proces sa fie finit.

74
3.5.3. Mecanismul test-and-set.

Din descrierea de mai sus rezulta ca o regiune critica include alte regiuni critice, mai
putin extinse. Dupa cum s-a exemplificat mai inainte, testarea variabilei comune
asociate unei regiuni critice se face prin excludere mutuala, deci si ea constituie o
regiune critica.

Privita la cel mai coborit nivel, problema de rezolvat este cea din exemplu, care
permite implementarea unor regiuni critice de mai mare complexitate cu ajutorul
actualizarii prin excludere mutuala a unei singure variabile. Pot aparea probleme,
deoarece este posibila comutarea unui proces pe durata secventei de actualizare a
variabilei. In conditii de pseudoparalelism cauza comutarii este aparitia unei
intreruperi, singurul eveniment capabil de a produce un salt neprevazut (asincron) la
o alta rutina.

In sistemele cu microprocesor unic actualizarea prin excludere mutuala se poate


implementa prin neacceptarea de intreruperi pe durata acestei operatii. Se pot gindi
doua metode, in functie de setul de instructiuni al microprocesorului utilizat. Prima
posibilitate se refera la microprocesoarele de 8 biti care nu sunt prevazute cu
instructiuni special elaborate pentru tratarea situatiei mentionate:

di ;dezactivarea sistemului de intreruperi


move A,X ;copiaza X in A
set X ;inscrie X cu 1
ei ;reactivarea sistemului de intreruperi
test A ;testarea vechii valori a lui X, acum cea a variabilei A.

Pentru scurtarea timpului de dezactivare a sistemului de intreruperi testarea valorii


lui X a fost scoasa in afara regiunii critice. Deci, X poate fi inscris cu 1 inainte de
testare, deoarece valoarea sa finala nu depinde de cea initiala.

A doua metoda foloseste o instructiune speciala, prezenta - in diverse forme - in


seturile de instructiuni ale tuturor microprocesoarelor moderne. Aceasta instructiune,
adesea numita test-and-set (tas), (testare si inscriere cu 1), efectueaza atit copierea, cat
si inscrierea prezentate in metoda anterioara, ca si testarea vechii valori a lui X. Cum
cererilor de intrerupere li se da curs la terminarea executiei unei instructiuni,
operatiile test-and-set nu pot fi intercalate cu executia rutinelor de tratare a cererilor
de intreruperi. Operatia, indivizibila, este indeplinita prin codul

tas A, X; testeaza si inscrie cu 1 pe X, copiaza vechea sa valoare in A.

O alta posibila sursa de probleme este datorata prezentei procesoarelor destinate


accesului direct la memorie (DMA), intrucat ciclurile lor de acces la memorie se pot
intercala cu ciclurile masina destinate executiei unei instructiuni, deci DMA se poate

75
efectua inainte de terminarea executiei instructiunii curente. Este motivul pentru care
executia instructiunii test-and-set dezactiveaza in mod automat posibilitatea
executarii de transfer DMA. Oricum, acesta nu indica probleme insurmontabile: de
regula, prin DMA se efectueaza transferuri in conjunctie cu perifericele de mare
viteza, deci se poate aranja ca variabilele asociate zonelor critice sa nu se afle in zona
de memorie alocata tampoanelor folosite in mecanismele DMA.

3.5.4. Functia test-and-set in structuri multiprocesor

Structurile multiprocesor cu magistrala comuna pot prezenta probleme mai complexe.


Pentru ilustrare se vor examina mai atent unele operatii, indeosebi legate de
magistrala comuna interconectand microprocesoarele cu memoria in care sunt stocate
variabilele comune.
Folosirea in comun a magistralei se face conform unei anumite strategii de arbitrare in
cazul concurentei intre procesoare, care permite alocarea magistralei doar unuia din
solicitanti. Deci, insasi magistrala constituie o regiune critica, fiind utilizabila, la un
moment anumit, doar de un singur microprocesor. Accesul la magistrala este acordat
printr-un mecanism concentrat sau distribuit de arbitrare, care informeaza solicitantul
asupra posibilitatii de utilizare a magistralei de indata ce actualul utilizator o
elibereaza.

In general, toate magistralele multiprocesor [10], [11], [16] contin o linie a carei stare
este determinata de interfata utilizatorului curent al magistralei, indicand daca
aceasta este sau nu ocupata. De regula magistrala ramine in posesia unui utilizator
pentru timpul necesar efectuarii unui singur ciclu de acces la memorie, dupa care este
eliberata. O astfel de tehnica de atribuire a magistralei poate conduce la erori chiar in
conditiile existentei instructiunii tas, a carei executie necesita doua cicluri de acces la
memorie pentru completare: unul de citire, care copiaza X in A, si un al doilea de
inscriere, care inscrie cu 1 variabila X. In fig. 3.6. se vede ce se poate intimpla pe o
magistrala comuna cand doua procese, unul executat de catre CPU 1, celalalt de catre
CPU 2, efectueaza instructiunea test-and-set asupra aceleiasi variabile X. Valoarea 0 a
semnalului BBUSY/ indica pentru celelalte interfete starea de "ocupat" a magistralei.
(Semnul "/" la sfirsitul numelui unui semnal arata ca acesta este activ in starea logica
0.) Cand BBUSY/ = 1 controlul magistralei poate fi preluat de un nou master. In
consecinta, apare pericolul intercalarii intre cele doua cicluri de memorie ale unei
instructiuni tas a unui ciclu memorie a altei instructiuni tas, rulata de un alt proces.
Situatia este similara cu intercalarea instructiunilor in sistemele cu procesor unic.

Similaritatea situatiilor induce si similaritatea solutiilor: evitarea intercalarii ciclurilor


de acces la memorie pe magistrala comuna pe durata executiei operatiilor critice. In
acest sens magistrala este pastrata in starea "ocupat" din momentul citirii lui X pina la
cel al terminarii inscrierii sale cu 1. (fig. 3.7.)

Intrucat ciclurile citire-modificare-inscriere difera de ciclurile normale pe magistrala,


interfata cu magistrala trebuie sa cunoasca daca operatia solicitata de catre

76
microprocesorul local este una normala sau nu. Informatia respectiva poate fi
furnizata de insusi microprocesor, printr-o linie a sa speciala, sau printr-o combinatie
a semnalelor de stare, care indica efectuarea unei operatii read-modify-write. Aceasta
conditie speciala poate fi asociata cu o anume instructiune, a carei executie produce
activarea semnalului, sau se poate conecta cu o secventa de instructiuni, pentru care
un indicator special in codul operatiei cauzeaza activarea unui cod special de
semnalizare a unei operatii indivizibile in cicluri individuale. Pentru
microprocesoarele care nu dispun de facilitatile de mai inainte problema se rezolva
prin incadrarea instructiunii cu executie indivizibila intre alte doua instructiuni;
prima inscrie, iar cea de a doua sterge un indicator al interfetei care permite pastrarea
controlului asupra magistralei pe durata de executie a instructiunii ce nu se poate
fragmenta. Desigur, metoda conduce la cresterea ineficientei de ansamblu in
utilizarea magistralei.

Fig. 3.6. Secvente posibile de cicluri pe magistrala comuna in cazul executiei


instructiunii test-and-set indivizibile

Fig. 3.7. Executia unui ciclu indivizibil citire-modificare-inscriere

3.5.5. Implementarea regiunilor critice vaste

Pina in acest punct s-a precizat atitudinea proceselor care, dorind sa execute o regiune
critica, o gasesc in starea "ocupat". Precizarea este importanta, deoarece criteriile de
caracterizare a unei solutii rezonabile a problemei excluderii mutuale prescriu un
timp finit de asteptare si un consum minim din timpul unitatii centrale de prelucrare.
Prima solutie consta in a permite unui proces sa cicleze in jurul aceluiasi test pina la
eliberarea regiunii. In tot timpul incercarilor nereusite procesorul este mentinut
ocupat, desi ar fi putut fi utlizat pentru scopuri mai lucrative, ruland procese care nu
sunt in asteptarea intrarii in regiunea critica. Mai mult, solutia nu garanteaza un timp
finit de asteptare. Se considera A si B concurand pentru executia regiunii asociate cu
X, pe care, la acest moment o executa C. O posibila secventa de instructiuni executate
de catre CPU este:

tas A,X
bne loopa
tas A,X
bne loopa
(A este suspendat, B este activat)
tas B,X
bne loopb
tas B,X
bne loopb
(B este suspendat, C este activat)
clear X
.
.

77
.
(C est esuspendat, B este activat)
tas A,X
bne loopb
(B intra in regiunea critica)

Se constata ca procesul A a fost depasit de catre B, care a ajuns la regiunea critica


dupa A. Faptul se datoreaza modului de planificare, bazat pe mecanismul de
alternare a proceselor privind rularea de catre CPU. Algoritmul impartial privind
timpul de utilizare a CPU, conduce la situatii in care un proces asteapta pe o durata
lunga de timp, probabil infinita. Decurge necesitatea de a imagina alt algoritm de
planificare pentru regiunile critice, evitindu-se risipirea timpului CPU (busy
waiting) si timpi infiniti de asteptare (process starvation).

3.5.6. Regiuni critice conditionate

Baza de date asociata unei regiuni critice este modificata in sensul generarii unei liste
de descriptori ai proceselor asteptind accesul in regiunea critica, lista ordonata
conform unei anumite scheme de prioritati. La eliberarea regiunii se selecteaza primul
element al listei (in cazul in care aceasta nu este vida) si el este transferat
planificatorului CPU. Procesul isi poate continua executia, intrucat regiunea este
libera. Celelalte procese inscrise in lista trebuie sa astepte in continuare. In consecinta,
CPU nu este fortata sa execute buclele de asteptare descrise anterior, iar accesul la
regiunea critica este reglat de un algoritm explicit de planificare, selectat conform
cerintelor programatorului.

Si aceasta implementare contine fenomene busy waiting si process starvation,


deoarece introducerea si extragerea in lista de descriptori ai proceselor sunt, la randul
lor, regiuni critice. Fenomenele mentionate pot fi tolerate pentru aceste regiuni mici,
deoarece timpii scurti de executie nu conduc la intirzieri si asteptari prea mari. Pentru
regiuni mai vaste sunt necesari algoritmi dedicati de planificare.

3.6. Sincronizarea
In cazul excluderii mutuale procesele concureaza pentru utilizarea unei anumite
resurse (regiunea critica), iar natura interactiunii permite rularea unui proces fara
necesitatea de cunostinte despre celelalte procese, cu care ruleaza in paralel. Acest
lucru este posibil deoarece procesul incearca sa obtina resursa, indiferent de starea
concurentilor sai.

78
O alta clasa de interactiune este cea a cooperarii proceselor, ceruta pentru
implementarea unui task complet. In acest caz procesele care sunt folosite pentru
executarea taskului trebuie sa cunoasca starea celorlalte procese cu care
interactioneaza. Fiecare proces este proiectat si realizat prin considerarea numarului
si tipului de interactiuni posibile cu alte procese, intrucat procesele nu mai concureaza
intre ele, ci coopereaza.

3.6.1. Semafoare

Cel mai simplu tip de informatii vehiculate intre doua procese este un semnal de
sincronizare. Semnalele de sincronizare sunt cerute de faptul ca vitezele relative ale
celor doua procese sunt, in general, necunoscute. Intr-un sistem cu procese concurente
durata de executie a unei secvente de instructiuni depinde de numarul si
caracteristicile celorlalte procese concurente, precum si de evenimente externe, al
caror numar si moment al aparitiei sunt necunoscute.

Solutia clasica a problemei sincronizarii intre doua sau mai multe procese, fara
schimb de date, se bazeaza pe utilizarea semafoarelor. Ele au fost introduse de catre
Dijkstra [12], o serie de alti cercetatori continuandu-i lucrarile [13],[14],[15].

In principiu, semaforul este o variabila x, careia i se asociaza doua proceduri: P(x) si


V(x) (unii autori le denumesc "signal" si, respectiv, "wait"). O alta caracteristica a
semaforului este numarul c(x) maxim de semnale trimise semaforului, dar nerealizate.

Functionarea corecta a semaforului este dictata de regulile numite invariantii


comunicatiei (communication invariants). Fie s(x) si r(x) numarul de semnale trimise,
respectiv primite de catre semaforul x. O comportare corecta presupune respectarea
relatiei

0 <= r(x) <= s(x) <= r(x) + c(x).

Uneori este utila asigurarea unei valori initiale i(x) unui semafor inaintea declansarii
operatiilor de sincronizare intre procese. In acest caz invariantul de comunicatie se
rescrie astfel:

0 =< r(x) <= s(x) + i(x) =< r(x) + c(x).

Operarea celor doua proceduri asociate P si V trebuie sa satisfaca urmatoarele reguli,


care definesc modul in care semaforul sincronizeaza executia procesului:

- operatia V efectuata asupra semaforului pentru care

r(x) < s(x) + i(x)

are ca rezultat incrementarea lui r(x). Suplimentar, daca

79
s(x) + i(x) = r(x) + c(x)

si exista procese asteptind la semafor, unuia dintre acestea i se permite continuarea si


are loc incrementarea lui s(x). Daca procedura se executa cand r(x) = s(x) + i(x),
procesul este suspendat si inserat in sirul de asteptare asociat semaforului.

- operatia P efectuata asupra semaforului cand s(x) + i(x) = r(x) + c(x) produce
suspendarea procesului si inserarea lui in sirul de asteptare asociat semaforului. Daca
s(x) + i(x) < r(x) + c(x), se incrementeaza s(x). Suplimentar, daca exista procese
asteptind la semafor, unuia dintre ele i se permite continuarea si are loc incrementarea
lui r(x).

3.6.2. Operatii cu semafoare

Pentru implementarea regulilor de sincronizare este necesara o unica valoare intreaga

n(x) = s(x) + i(x) - r(x)

Din invariantii de comunicatie se deduce ca :

0 < n(x) < c(x)

In plus, valoarea initiala a lui n(x) este i(x) pentru a asigura corectitudinea operatiilor.
Aceasta regula rezulta din definirea lui n(x) si imprimind s(x) = r(x) = 0. Intrucat
sirurile de asteptare sunt incluse in regulile de sincronizare, structurile de date
utilizind procedurile P si V trebuie sa posede anumite caracteristici necesare
implementarii acestor siruri.

Sunt necesare doua tipuri de siruri: unul pentru procesele intirziate in timpul
executarii operatiei P, iar celalalt pentru procese intirziate in timpul executiei
operatiei V. Desi distincte din punctul de vedere logic, cele doua siruri pot fi
implementate utilizind o singura structura; este usor de demonstrat ca, daca c(x) = 0,
este imposibil a avea doua procese asteptind simultan in ambele siruri. Deci, o
singura structura de date poate pastra fie toate procesele intirziate la executarea
operatiei P, fie toate acelea intirziate pe durata operatiei V, tipul procesului ce
asteapta fiind determinat de starea variabilei n(x). Demonstratia se bazeaza pe analiza
conditiilor care determina inserarea proceselor si extragerea lor din sirul de asteptare.
Initial cele doua siruri sunt vide si ele ramin asa pina cand n(x) devine egal fie cu 0
(adica r(x) = s(x) + i(x)), fie cu c(x) (adica s(x) + i(x) = r(x) + c(x));in primul caz toate
operatiile V efectuate vor intirzia procesul corespunzator, in timp ce operatiile P nu o
vor face. Daca procesele asteapta pentru ca ele au efectuat o operatie V, atunci
valoarea lui n(x) trebuie sa fie 0, deoarece fiecare operatie P va incrementa atit r(x) cat
si s(x); deci, doar cand toate procesele care asteapta au fost activate si pot continua,
valoarea lui n(x) poate fi incrementata.

Cu motive similare se poate demonstra ca procesele intirziate prin operatiile P pot


exista doar cand n(x) = c(x). Situatia in care procesele asteptind la semafor sunt

80
intirziate fie de operatii P, fie de operatii V este imposibila, deoarece valoarea
contorului n(x) ar trebui sa aiba simultan doua valori distincte, 0 si c(x). Intrucat
numai o singura clasa de procese poate astepta la semafor la un anumit moment de
timp, nu este necesar a aloca doua sectiuni distincte ale structurii de date in
implementarea semaforului. Fig. 3.8. indica o structura de date adecvta implementarii
unui semafor. De remarcat utilizarea unei unice liste pentru descriptorii procesului,
asa cum s-a subliniat. Cimpul c(x) este inscris la crearea semaforului, intrucat, de la
acel moment, el nu mai este modificat.

_________________________________________________
I Contor (n) I
I________________________________________________I
I Capacatate (c) I
I________________________________________________I
I Variabila blocare (v) I
I________________________________________________I
I Indicator spre primul proces in asteptare I
I________________________________________________I

Fig. 3.8. Exemplu de structura de date folosita la


implementarea semafoarelor.

Cele doua operatii P si V, folosite pentru a defini un semafor, trebuie inserate intr-o
regiune critica, deoarece manipularea necontrolata a cimpului n(x) conduce la situatia
din paragraful 3.5.1. Intrucat astfel de operatii nu sunt atit de simple pe cat este
simpla inscriere a unei variabile, este intelept a controla accesul la regiunea critica a
semaforului prin intermediul operatiilor test-and-set, efectuate asupra variabilelei v,
si a implementa un sir de procese asteptind accesul la operatia cu semaforul.
Mecanismul este similar cu cel sugerat in paragraful 3.5.3. de implemenatre a unor
regiuni critice neelementare.
Un proces care incearca efectuarea unei operatii cu semaforul este intirziat de doua
ori: prima data - deoarece regiunea critica a semaforului este ocupata, iar a doua oara
- intrucat testarea semaforului produce o intirziere a procesului. Totusi, a doua din
aceste intirzieri este scurta, ca urmare a simplitatii operatiilor P si V.

81
Fig. Procedura P(x)

Fig. ProceduraV(x)

struct x
{
int c; //capacitatea semaforului
int n; //valoarea curenta a variabilei
int v; //variabila blocare (boolean)
int waitqueue; //stare sir la semafor (boolean)
//(“Coada”!)
}

82
3.6.3. Implementarea unui semafor.

In cele ce urmeaza se indica o posibila implementare a operatiilor P si V. Ea se


bazeaza pe existenta procedurilor entercr (intrare in regiunea critica) si exitcr (iesirea
din regiunea critica). La apelare prima procedura isi termina executia doar dupa
executia cu succes a unei operatii test-and-set asupra variabilei transferate ca
parametru. In cadrul acestei proceduri este posibila implementarea tuturor
mecanismelor necesare unei functionari eficiente. Procedura exitcr reseteaza variabila
transferata ca parametru.

Se va folosi structura de date din fig. 3.8, declarata in urmatoarele proceduri scrise
intr-un limbaj similar cu Pascal:
type semdata = record
v : lockvar;
n,i: integer;
waitqueue: processdescriptor;
end;

var x : semdata;

procedure P (x:semdata);
begin
entercr (x.v)
if x.c = x.n then
begin
extragerea descriptorului curent al procesului din setul de procese ce se
executa;
inserarea lui in sirul de asteptare;
exitcr (x.v);
realocarea utilizarii CPU;
end
else if x.n = 0 and x.waitqueue <> nil then
begin
extragerea unui proces din sirul de asteptare;
exitcr (x.v);
adaugarea descriptorului extras la setul de procese ce se vor executa;
realocarea (daca este necesar) utilizarii CPU;
end
else
begin
x.n := x.n + 1
exitcr (x.v)
end
end;

procedure V (x:semdata);
begin

83
entercr (x.v);
if x.n = 0 then
begin
extragerea descriptorului procesului curent din setul de procese ce se
executa;
inserarea lui in sirul asteptare;
exitcr (x.v)
realocarea utilizarii CPU;
end
else if x.c = x.n and x.waitqueue <> nil then
begin
extragerea unui proces din sirul de asteptare;
exitcr( x.v );
introducerea descriptorului extras in multimea
proceselor de executat; realocarea utilizarii CPU.
end
else
begin
x.n := x.n - 1
exitcr (x.v)
end
end;

Cand un proces este extras dintr-un sir de asteptare drept consecinta a unei operatii P
sau V, se executa algoritmul de planificare privind alocarea CPU, pentru a decide
daca procesul extras are o prioritate superioara celui ce l-a extras. In acest caz,
procesul care efectueaza operatia P sau V este suspendat si se executa cel extras. Deci,
chiar cand semnaleaza corect la semafor si primeste accesul, un proces poate fi
suspendat, intrucat el activeaza unul de prioritate superioara. Totusi, aceasta
intirziere este diferita de cea cauzata de receptia la un semafor vid sau semnalizarea la
unul plin. Diferenta consta in faptul ca proces blocat de o anumita stare a semaforului
nu se va putea executa pina cand semaforul isi schimba starea; un proces intirziat
pentru ca a deblocat un altul va fi reluat imediat ce unitatea centrala de prelucrare
devine disponibila.

3.7. Comunicatia intre procese

3.7.1. Cutii postale

In unele cazuri interactiunea intre procese cere efectuarea unui schimb de date,
suplimentar semnalelor de sincronizare, intre procesele care coopereaza. Solutia
clasica a acestor probleme foloseste un tampon pentru mesaje (message buffer), numit
si cutie postala (mailbox). Cutia postala reprezinta o extensie a semafoarelor, deoarece
ea permite asocierea unui set de date, numit mesaj, fiecarei operatii de semnalizare.

84
O cutie postala se comporta in acelasi mod cu un semafor, cu exceptia manipularii
mesajelor. In consecinta, se folosesc aceleasi reguli de sincronizare si aceiasi
invarianti. Operatiile trebuie modificate pentru a se putea manipula mesajele care se
transmit sau se receptioneaza. Noile operatii sunt send(x,m) si receive(x,m),
corespunzind lui P si respectiv, V. x este identificatorul cutiei postale iar m este cel al
mesajului.

Cand se efectueaza o operatie de tip send, mesajul se insereaza in cutia postala, daca
aceasta nu este plina. Cand se efectueaza o operatie de tip receive se extrage primul
mesaj din cutia postala, daca aceasta nu este vida. In mod obisnuit, ordonarea
mesajerlor in cutia postala este similara cu cea a unei stive de tip FIFO: operatia
receive extrage din stiva cel mai vechi mesaj pe care aceasta il contine. Sunt posibile si
organizari care asigneaza prioritati mesajelor continute de cutia postala.

3.7.2. Implemenatrea cutiilor postale

Implementarea cutiilor postale este similara cu cea pentru semafoare, la care se


adauga facilitatile legate de manpularea mesajelor. In continuare se sugereaza un mod
de realizare:

mailbox = record
v : lockvar;
n,i : integer;
buffer: message;
waitqueue: processdescriptor;
end;

procedure send(x:mailbox, m:message);


begin
entercr(x.v);
if x.v = x.c then
begin
introducerea mesajului m in tampon;
extragerea descriptorului procesului curent din multimea proceselor de
executat;
inserarea lui in sirul de asteptare;
exitcr(x.v);
realocarea utilizarii CPU;
end
else
begin
if x.c=0 and x.waitqueue<> nil then
begin
extragerea unui descriptor de proces din sirul de asteptare;
asocierea mesajului m cu procesul extern;
exitcr(x.v);

85
inserarea descriptorului procesului in multimea de procese de executat;
realocarea utilizarii CPU;
end
else
begin
inserarea mesajului m in tampon;
x.c := x.c + 1;
exitcr(x.v);
end
end;

procedure receive(x:mailbox, m:message);


begin entercr(x.v);
if x.c=0 then
begin
extragerea descriptorului procesului curent din setul de procese de executat;
inserarea lui in sirul de asteptare;
exitcr(x.v);
realocarea utilizarii CPU;
(aceasta se executa la reluarea procesului,deoarece exista mesaj)
copierea in m a mesajului asociat procesului;
end
else
begin
extragerea mesajului din tampon si copierea lui in m;
if x.c=x.n and x.waitqueue<> nil then
begin
extragerea unui descriptor de proces din sirul de asteptare;
exitcr(x.v);
introducerea descriptorului extras in multimea proceselor de executat;
realocarea utilizarii CPU;
end
else
begin
x.n := x.n - 1;
exitcr(x.v);
end
end;

In cadrul procedurii send mesajul este introdus in cutia postala chiar daca aceasta este
considerata plina, deoarece structura de lista inlantuita nu impune o limitare a
numarului de measje ce se pot memora. Conditia "buffer full" (tamponul plin) se
foloseste doar pentru sincronizarea intre procese.

Un fapt important este acela ca procedura send este asociata cu un mesaj catre un
proces atunci cand tamponul este vid. Necesitatea acestei modalitati de lucru este
impusa de faptul ca, daca un proces care asteapta un mesaj este activat, executia sa

86
incepe doar dupa o lunga durata de timp, daca prioritatea sa este redusa. In acest caz
s-ar putea intimpla ca alte operatii send sa aiba loc intre timp si alte procese, de
prioritate superioara, sa fie activate si executate. Deci procesele de prioritate ridicata
pot sa isi extraga mesajele inainte ca cele de prioritate redusa sa fie activate. In acest
mod, se pastreaza ordinea de receptionare a mesajelor, pentru ca mesajul este extras
cand procesul in asteptare este deblocat. Pentru a lega mesajul si procesul se poate
folosi un pointer adecvat catre descriptorul procesului. 3.7.3. Sincronizarea proceselor

Se considera o unica linie tehnologica compusa din doua masini unelte, masina 1 si
masina 2, si un unic tampon B de capacitate c, plasat intre cele doua masini. Operatia
este astfel organizata incat masina 1 primeste o piesa si o prelucreaza. Cand operatia
este completa, masina 1 plaseaza piesa in tampon, cu conditia ca acesta sa nu fie plin,
dupa care obtine o noua piesa, daca este disponibila, si repeta aceeasi operatie. Cand
masina 1 incearca sa plaseze o piesa in tamponul plin functionarea sa este blocata,
pentru ca trebuie sa astepte pina cand este spatiu in acesta, ceea ce ii permite sa
depuna piesa prelucrata si sa se ocupe de o alta.
In cealalta parte a tamponului, masina 2 se comporta intr-un mod similar. Intii ea
incearca sa obtina din tampon o piesa pentru prelucrare. Daca acesta nu este gol,
masina 2 extrage o piesa, pe care o prelucreaza; in caz contrar asteapta pina cand
tamponul contine cel putin o piesa.

Cele doua masini sunt comandate de doua procese diferite, A si B, executate de catre
aceeasi unitate centrala de prelucrare. Se pune problema sincronizarii, pe baza
continutului tamponului, a functionarii lor.

In exemplul ales, care presupune identitatea pieselor prelucrate, starea tamponului


poate fi convenabl reprezentata printr-un numarator indicand numarul de piese pe
care le contine. Intrucat ceea ce afecteaza functionarea masinilor sunt valorile extreme
ale continutului numaratorului, cae mai buna metoda de sincronizare pare aceea
folosind semafoare. In continuare se indica o schita de realizare, in acelasi limbaj
pseudo-Pascal, in care x este un semafor cu capacitatea k unitati, initializat cu
numarul de piese din tampon la inceputul operatiei.

schita procesului A
.
.
.
while true do
begin
obtine o noua piesa;
prelucreaza piesa;
P(x);
pune piesa in tampon;
end;
.
.
.

87
schita procesului B
.
.
.
while true do
begin
V(x);
obtine o piesa din tampon;
prelucreaza piesa;
pune piesa in tamponul de iesire;
end;
.
.
.

Operatia P blocheaza procesul A cand tamponul este plin, in timp ce operatia V


blocheaza procesul B cand acesta este vid. Pe de alta parte, P porneste procesul B cand
tamponul este gol si B asteapta sa prelucreze, iar V va porni procesul A cand
tamponul este plin si A asteapta sa stocheze o piesa in tampon.

3.7.4. Comunicatia intree procese

Exemplul precedent poate fi modificat pentru a demonstra ca doar semafoarele nu


sunt suficiente pentru implementarea simpla a sincronizari. In exemplul modificat se
considera ca piesele nu sunt identice. Ele fac parte din patru clase distincte,
identificate prin numerele 1,2,3,4. De asemenea, se impune cerinta suplimentara ca
piesele sa fie prelucrate in aceeasi secventa de catre ambele masini.

Sincronizarea presupune si un schimb de date intre procesele care coopereaza,


intrucat informatia vehiculata nu indica doar introducerea in tampon a unei piese sau
extragerea unei piese din acesta. Orice semnal de inserare trebuie sa contina date
identificand tipul piesei, care trebuie citite cand piesa este extrasa.

Aceste considerente recomanda folosirea unei cutii postale, in care mesajele sunt
intregi indicand tipul piesei asociate. Cele doua schite de proces se modifica si
aspectul lor este descris mai jos.

schita procesului A
.
.
.
while true do
begin
obtine o piesa si transcrie in m tipul ei; case m of
1: prelucrare de tip 1;

88
2: prelucrare de tip 2;
3: prelucrare de tip 3;
4: prelucrare de tip 4;
end;
send(x,m);
pune piesa in tampon;
end;
.
.
.
schita procesului B
while true do
begin
receive(x,m);
case m of
1: prelucrare de tip 1;
2: prelucrare de tip 2;
3: prelucrare de tip 3;
4: prelucrare de tip 4;
end;
pune piesa in tamponul de iesire;
end;

Sincronizarea se efectueaza la fel ca in cazul precedent, dar procesul A transfera catre


B informatii privind tipul piesei. Daca organizarea cutiei postale este de tipul FIFO,
piesele sunt prelucrate in aceeasi secventa de catre ambele masini, deoarece procesul
B primeste mesajele in ordinea in care ele au fost emise de catre A.

Nu s-au facut ipoteze privind vitezele relative ale celor doua procese, sau asupra
sosirii pieselor la masina 1, element esential in intregul proces de productie. Acest
fapt garanteaza ca solutia bazata pe semafoare sau cutii postale este corecta
indiferentde viteza de executie.

Mai exista si alte posibile extensii ale exemplului, printre care si considerarea situatiei
in care mai multe masini identice executa munca masinii 1 si plaseaza rezultatele in
acelasi tampon, din care mai multe masini, operand identic cu masina 2, extrag din
tampon in vederea prelucrarii rezultatele existente. In acest caz este suficient a
dispune de un singur proces A pentru comanda unei masini de tipul 1, si de un
singur proces B pentru comanda masinii de tipul 2. Sincronizarea se poate face, de
asemenea, cu ajutorul semafoarelor si a cutiilor postale. Se deduce ca mecanismele
descrise functioneaza corect si in cazul unor producatori si consumatori multipli.

89
3.8. Planificarea proceselor
Gestionarea unitatilor centrale de prelucrare ale unui sistem constituie activitatea
esentiala a unui sistem de operare multitasking. Activitatea de planificare a
procesorului poate fi divizata in doua clase diferite: planificarea de nivel inalt sau pe
termen lung si planficarea pe termen scurt. Prima se ocupa cu introducerea in sistem a
programului utilizatorului si cu secventierea diferitelor procese care il compun.
Intrucat ea poate fi implementata sub forma unui proces (un proces al sistemului, mai
curand decat al utilizatorului), implementarea se face, practic, prin program, si ea nu
va fi discutata in cele ce urmeaza. Planificarea de nivel redus se ocupa de secventierea
executiei proceselor prezente in sistem la un anumit moment de timp si este cu mult
mai apropiata de hardware. Planificarea de nivel inferior constituie subiectul celor ce
urmeaza. Termenul "planificarea proceselor" se refera la un astfel de tip de
planificare.

3.8.1. Starile unui proces

Modul tipic de abordare a problemei planificarii proceselor se bazeaza pe asocierea


unei stari anumite fiecarui proces din sistem. In functie de tipul de calculator si sistem
de operare, exista un numar de stari ale procesoarelor, ca si un numar de definitii ale
acestor stari. Pentru ilustrare se va utiliza modelul din fig. 3.9., cu urmatoarele
definitii:
- In rulare (running): Un proces in aceasta stare este executat de catre CPU sau de
catre o CPU a sistemului. De aceea, se considera ca are o prioritate superioara altor
procese gata de rulare;

-Gata de rulare (ready): Un proces in aceasta stare este gata de a fi rulat, dar nu este
executat, deoarece prioritatea sa este mai mica decat a proceselor aflate in rulaj. In
aceasta stare toti parametrii asociati procesului si care influenteaza decizia de
planificare sunt cunoscuti planificatorului;

-In asteptare (waiting): Un proces aflat in aceasta stare nu poate fi executat, intrucat el
asteapta producerea unui eveniment special in sistem, a carui aparitie va pune
procesul in starea gata de rulare, in functie de prioritatea procesului;

-Activ (active): Un proces in aceasta stare nu poate fi considerat pentru executie,


intrucat el are nevoie de o comanda speciala pentru a trece, in functie de prioritate, fie
in starea in rulare fie in starea gata de rulare;
-Inactiv (inactive): Un proces aflat in aceasta stare nu poate fi planificat, pentru ca,
desi este prezent in sistem, are nevoie de o comanda explicata din partea unuia dintre
procesele care se executa, sau din partea planificatorului, pentru a intra in starea
activa si pentru a i se asigura parametrii de planificare.

90
Fig. 3.9. Diagrama starilor proceselor

Tranzitia intre stari a proceselor poate fi produsa de mai multe evenimente,


examinate, in continuare, prin prisma conditiilor ce conduc la intrarea sau parasirea
de catre un proces a uneia dintre starile listate.

A. Starea inactiva

Aceasta stare constituie o interfata intre planificatorul pe termen lung si planificatorul


pe termen scurt: un proces este creat de catre planificatorul pe termen lung si este
introdus in starea inctiva. Un proces poate fi inlaturat dinsistem, prin distrugere, daca
planificatorul pe termen lung considera ca nu este necesara prelucrarea de catre
sistem a procesului inactiv. Un proces inactiv poate fi activat si i se pot asigura
parametrii ceruti de algoritmul de planificare pe termen scurt. Realizarea acestei
tranzitii se face la cererea explicata a procesului aflat in rulare sau a planificatorului.

Tranzitia in sens opus se poate face numai cand procesul este in starea activa. In acest
caz se emite o cerere explicata de catre procesul aflat in rulaj (eventual - o rutina de
planificare), folosita pentru dealocarea intregii structuri de comanda (cum este
descriptorul procesului) folosit de catre planificatorul pe termen scurt.

In general, procesele ce revin in starea inactiva sunt evacuate din sistem, intrucat ele
s-au executat cu succes sau au esuat, asa ca rularea lor nu mai este necesara.

B. Starea activa

Un proces in starea activa are alocata toata structura de comanda ceruta de catre
planificator, deci procesul este gata sa concureze pentru obtinerea CPU. Totusi, numai
ca urmare a unei comenzi explicate procesul este transpus in starea gata de rulare sau
in rualre, dupa cum prioritatea procesului este inferioara sau superioara celei a
procesului aflat in rulare.

Cand un proces comuta din starea activa in cea gata de executie si, apoi, in starea de
executie, el este executat de la inceput; contorul programului va fi initializat cu adresa
punctului de intrare a programului principal executat de catre proces. Daca un proces
concureaza de doua ori pentru obtinerea CPU, el este reinitializat de fiecare data cand

91
paraseste starea activa. Acest tip de comutare in starea gata de rulare sau in cea de
rulare este diferit de cel de parasire a starii de asteptare, caz in care procesul nu este
reinitializat, ci executia sa reluata prin restaurarea starii la momentul la care
procesului i s-a luat accesul la CPU. Suplimentar utilizarii ca stare intermediara intre
lumea exterioara si concurenta pentru CPU, starea activa poate fi folosita pentru
relansarea unui proces care a fost afectat de o eroare reparabila, sau pentru executarea
proceselor care necesita mai multe executii.

C. Starea de asteptare

Singurul mod de intrare in starea de asteptare consta in executia unei actiuni de


suspendare cand procesul se afla in starea in rulare. Operatiile tipice producand
suspendarea procesului sunt:

- tentativa de a intra intr-o regiune critica ocupata;


-semnalizarea la un semafor plin; -transmiterea unui mesaj catre o cutie postala plina;
-primirea unui semnal de la un semafor gol;
-primirea unui mesaj de la o cutie postala vida.

Orice proces care incearca sa efectueze una dintre operatiile enumerate nu mai poate
continua sa fie executat pina in momentul in care entitatea (regiune critica, semafor
sau cutie postala) si-a schimbat starea, ceea ce permite reluarea procesului. Operatiile
efectuate de catre procesul in rulare, care ar putea comuta un proces din starea de
asteptare in cea gata de rulare sau chiar in starea in rulare, sunt:

- iesirea din regiunea critica;


-semnalizarea la un semafor vid;
-transmiterea unui mesaj catre o cutie postala vida;
-primirea unui semnal de la un semafor plin;
-primirea unui mesaj de la o cutie postala plina.

Cand una dintre aceste operatii conduce la extragerea unui proces din starea de
asteptare, controlul asupra CPU trece in sarcina planificatorului, astfel incat acesta
poate decide daca procesul activat detine prioritatea cea mai inalta. In caz afirmativ,
procesul ce iese din starea de asteptare este trecut direct in starea in rulare; in caz
contrar el intra in starea gata de rulare.

D. Starea gata de rulare

Tranzitiile in starea gata de rulare reprezinta alternativa la tranzitiile in starea de


rulare (cu exceptia acelora spre starea de asteptare), deoarece diferenta intre procesele
aflate in cele doua stari este doar o chestiune de prioritate. In consecinta, tranzitiile
intre starile gata de rulare si in rulare sunt cauzate de modificari de prioritati relative
ale proceselor executabile.

92
Diferenta majora consta in faptul ca procesele in starea gata de rulare nu isi pot
modifica ele insele starea, in timp ce procesele in rulare pot efectua tranzitii de stare
prin executarea de actiuni corespunzatoare.

E. Starea in rulare

Procesele in starea in rulare sunt singurele care pot provoca tranzitii de stare ale altor
procese, ca si pentru ele insele. Deci, este posibila parasirea acestei stari drept
consecinta a unei actiuni explicate, programata de catre utilizator, cum este
terminarea normala a unui proces sau dezactivarea temporara. De asemenea, este
posibil ca un proces sa fie fortat sa elibereze CPU drept consecinta a unei actiuni din
program care nu a avut destinatia explicita de a produce o tranzitie de stare a
procesului. Aceste actiuni se pot imparti in doua clase: acelea care produc tranzitia in
starea de asteptare si acelea care produc tranzitia procesului curent in starea gata de
rulare. Prima clasa a fost discutata anterior. In cea de a doua intra actiunile care
produc activarea sau reluarea altor procese. Cum procesul activat ar putea avea o
prioritate superioara celui care l-a activat, pot aparea schimbari in prioritatile relative
pentru toate procesele ce indeplinesc conditiile de rulare, caz in care procesul in
rulare este trecut in starea gata de rulare.

Un al treilea tip de eveniment care produce parasirea de catre un prroces a starii in


rulare este constituit de actiunea declansata de aparitia unor situatii externe sau
interne neobisnuite, care nu pot fi prevazute de catre programator. Astfel de
evenimente includ intreruperi sau exceptiii fatale ce apar pe durata executiei
procesului. Ambele pot fi considerate ca evenimente care activeaza procese speciale,
constituite din rutinele de tratare corespunzatoare. Intre cele doua tipuri de
evenimente exista, totusi, diferente. Rutinele de tratare a conditiilor fatale de exceptie
(overflow, violarea protectiei) se executa ori de cate ori ele sunt activate de catre
conditiile corespunzatoare, deci au intotdeauna prioritate superioara procesului care
le-a generat.

3.8.2. Planificarea in conditiile prezentei intreruperilor

Intreruperile sunt folosite pentru a informa CPU asupra unor evenimente importante
prin efectele lor asupra activitatii sistemului. De exemplu, o intrerupere anuntind
terminarea unui proces I/O efectuat de un periferic lent este mai putin importanta
decat una asociata unui dispozitiv mai rapid, deci este important ca prima sa nu
intrerupa executia rutinei de tratare a celei de a doua intreruperi.

Este necesara existenta unui mecanism care sa recunoasca doar intreruperile de


prioritate ridicata. Cu alte cuvinte, o cerere de intrerupere este confirmata doar daca
ea are o prioritate superioara procesului aflat in rulaj. Intreruperile sunt evenimente
externe si sunt gestionate prin mijloace hardware. Deci, cand un proces este trecut in
starea de rulare, prioritatea sa trebuie facuta cunoscuta dispozitivului de tratare a

93
cererilor de intrerupere, fapt ce permite dezactivarea intreruperilor cu prioritati egale
sau inferioare celei a procesului.

Daca instalarea unui nou proces face ca prioritatea CPU sa scada sub nivelul unei
cereri de intrerupere asteptind tratarea, rutina de tratare a cererii mentionate se trece
in starea in rulaj, procesul intrerupt trecand in starea gata de rulare. Cand rularea
rutinei de tratare a intreruperii se termina, ea apeleaza planificatorul pentru a
determina urmatorul proces ce trebuie executat. Decizia planificatorului poate fi
infirmata de catre mecanismul de intreruperi in cazul in care intreruperi prioritare
asteapta tratarea.

Dispozitivul de tratare a cererilor de intreruperi poate fi considerat drept componenta


a planificatorului, implementat sub forma hardware. In acelasi mod, rutinele de
tratare a intreruperilor ce asteapta atentia unitatii centrale pot fi considerate ca fiind in
starea gata de rulare, intrucat executia lor va incepe imediat ce prioritatea procesului
aflat in rulare scade sub cea a cererilor de intreruperi.

3.8.3. Planificarea in sisteme multiprocesor

Mecanismul de planificare descris mai sus poate fi comod implementat, prin mijloace
software, la care se adauga un dispozitiv de tratare a intreruperilor in sistemele cu
procesor unic. Lucrurile se complica in conditiile unui sistem cu mai multe
procesoare. Intr-un sistem multi-procesor fiecare proces in rulare este asignat unei
CPU si exista doua posibilitati ca un proces sa fie executat de catre sistem: orice proces
poate fi rulat de catre orice CPU sau procesele pot fi grupate in submultimi, fiecare
din ele alocata unei CPU. Prima situatie se intilneste in sistemele de uz general,
pentru care sistemul este considerat ca un tot unitar. Deci, exista un singur grup de
procese pentru fiecare din starile posibile.

Cand un proces este trecut in starea in rulare, oricare dintre CPU poate fi utilizata
pentru a-l rula. Totusi, de regula, se selecteaza CPU care ruleaza procesul cu cea mai
mica prioritate. Acesta este trecut in starea de asteptare.

A doua varianta de sistem multiprocesor contine un numar de copii ale situatiei


sistemului cu procesor unic. Deci, fiecare CPU are propriile sale grupuri de procese in
starea gata de rulare, activa sau inactiva, si un singur proces in starea in rulare. Aceste
sisteme sunt folosite, de regula, in aplicatiile de timp real, pentru care perifericele I/O
conectate la fiecare CPU dicteaza locul de executie al fiecarui proces. Diferenta intre
acest tip de sistem multiprocesor si un set de sisteme multiutilizator, dar cu un
procesor unic, consta in faptul ca procesele ruland pe diferitele CPU se pot sincroniza,
pot comunica intre ele sau pot concura pentru resurse comune.

In ambele tipuri de sistem, o operatie efectuata de catre un proces ruland pe CPU i


poate face ca CPUj sa comute de la executia procesului A la cea a procesului B.
Replanificarea unei CPU necesita un anumit suport hardware pentru transmiterea
informatiei de la CPUi la CPUj pentru a indica noile conditii.

94
Intrucat operatia care produce replanificarea apare pe o alta CPU decat cea care
comuta procesul pe care il executa, ea constituie un eveniment extern pentru a doua
CPU, fapt ce justifica implementarea cu ajutorul intreruperilor a acestui tip de
comunicatie interprocesor.

Revenind la sistemul multiprocesor din fig. 3.4, se pot concepe mai multe metode de
implementare a intreruperilor interprocesor. O solutie consta in utilizarea unor celule
speciale de memorie in zona comuna de memorie, fiecare generand, cand se scrie in
ea, o cerere de intrerupere spre o anumita CPU. In modul acesta o CPU se poate
intrerupe prin efectuarea unei operatii de inscriere la o adresa speciala. Datele inscrise
in locatiile speciale pot indica sursa intreruperii.

O alta solutie consta in utilizarea unui set de linii speciale in cadrul magistralei
comune, rezervate generarii cererilor de intreruperi interprocesor. Un caz particular
este cel utilizind o unica linie de difuzare (broadcasting) care transmite serial mesaje
de intrerupere. Mesajele includ identificatori privind sursa si destinatia intreruperii,
precum si date indicand motivul intreruperii. Tehnica este recomandata de o serie de
standarde: Future Bus (IEEE P896), VME, Multibus II [16].

3.9. Concluzii
Din cele de mai sus se poate vedea ca functionarea in regim de multiprogramare sau
multitasking nu este doar o problema de software, ea necesitind un minimum de
suport hardware. Aceste cerinte sunt, pe scurt, urmatoarele:

1. In sistem cu procesor unic:

- posibilitatea de activare/dezactivare a intreruperilor (daca nu se ia in considerare


mecanismul DMA);

- instructiuni test-and-set indivizibile (daca se considera mecanismul DMA);

- CPU si dispozitivul de tratare a intreruperilor au posibilitatea de mascare dinamica


a intreruperilor cu nivel de prioritate inferior celui al programului in rulare, pentru a
permite planificarea corecta.

2. In sistem multiprocesor.

- aceleasi cerinte ca in cazul sistemelor cu procesor unic;


- semnale externe indicand efectuarea de catre CPU a unei secvente indivizibile
citire-modificare-insciere, pentru a bloca magistrala comuna, evitindu-se accesul
intercalat al aceleiasi variabile de catre CPU distincte;

- facilitati de intreruperi interprocesor, cerute de activitatea corecta de planificare pe


diferitele microprocesoare.

95
Suplimentar fata de aceste cerinte, se pot folosi si alte mecanisme pentru scurtarea
timpului de executie cerut de anumite operatii. De ajutor sunt instructiunile speciale
de salvare si restaurare a starii unui procesor. Operatia este ceruta de comutarea
executiei intre mai multe procese. Informatiile de stare pot contine continutul
registrelor si tabelele de conversie, continined si drepturile de acces gestionate de
catre MMU (unitatea de gestiune a memoriei, ce se va discuta in capitolul urmator).
Deci, cresterea vitezei de comutare implica nu numai CPU, ci si circuitele conexe.

Toate procesoarele moderne dispun de astfel de suport hardware, implementat in


forme variate. Mai mult, unele din ele implementeaza prin hardware functii de
complexitate superioara.

In cadrul sistemului iAPX432 procedurile send si receive sunt implementate prin cate
o instructiune masina, si aproape toate obiectele legate de multitasking sunt
recunoscute de catre hardware. Alte microprocesoare, cum este iAPX286, ofera
mecanisme hardware pentru manipularea unor structuri de date recunoscute de catre
hardware, cum sunt descriptorii proceselor. Aceasta facilitate creste viteza operatiilor
de planificare.

96
CAPITOLUL 4
GESTIUNEA MEMORIEI

In acest capitol se vor discuta probleme specifice organizarii si protectiei memoriei.


Principalele elemente abordate sunt :

- organizarea ierarhizata a memoriei;

- organizari simple privind gestiunea memoriei, care nu necesita hardware specializat


si care sunt folosite in sistemele cu microprocesoare;

- tehnici de gestiune a memoriei virtuale;

- protectia obiectelor memorate impotriva accesului neautorizat;

- mijloace de protectie implementate folosind starile privilegiate ale masinii;

- detectarea si corectarea erorilor si reconfigurarea sistemelor de memorie.

4.1. Introducere
Cresterea puterii de calcul si a spatiului adreselor la microprocesoarele moderne a
condus la extinderea gamei de aplicatii, incluzind cimpuri de tipul sistemelor
multiutilizator cu functionare in timp real, pe timpuri rezervate doar calculatoarelor
mari sau minicalculatoarelor. Realizarea acestor aplicatii sofisticate nu se poate face
lasind gestionarea memoriei in sarcina unui singur programator, fie el foarte bun, asa
cum se intimpla in cazul microprocesoarelor de 8 biti. In schimb, se impune realizarea
gestionarii automate a resurselor de memorie de catre un sistem de operare adecvat,
fapt ce are ca efect o mai buna utilizare a spatiului disponibil.

Ideile ce stau la baza implementarii mecanismelor de gestiune a memoriei nu sunt


noi, ci sunt imprumutate din solutiile folosite in calculatoare mari sau
minicalculatoare. Totusi, aceste idei sunt noi in lumea microprocesoarelor, fapt ce a
determinat descrierea in acest capitol a celor mai frecvent utilizate metode pentru
utilizarea eficienta a memoriei, ca si pentru protectia impotriva accesului neautorizat,
voit sau eronat.

Utilizarea rationala a memoriei se realizeaza prin luarea in considerare a


urmatoarelor :
- exista mai multe tipuri de memorie, cu diverse viteze si costuri pe bit (cum sunt
cele cu semiconductoare si cele magnetice). In general, capacatatea memoriilor rapide
este limitata de cost sau posibilitati tehnologice, in timp ce memoriile ieftine au
timpuri lungi de acces;

97
- intr-un sistem complex, asa cum este calculatorul multipro- gramat functionind
prin divizarea timpului,nu este necesar a pastra simultan toate programele in
memoria primara, deoarece numai o submultime a acestora este gata de rulare, in
timp ce altele pot astepta terminarea unor operatii I/O sau pot fi temporar blocate.

In general este convenabil a considera sistemul de memorie drept constind din mai
multe subsisteme, cu capacatati diferite si timpi de acces diferiti. Intr-o astfel de
configurare mecanismele de gestiune a memoriei vor distribui informatia intre
diversele tipuri de memorie, incercand a pastra datele si programele la care accesul
este mai frecvent in memoriile mai rapide, restul informatiilor fiind plasat in
memoriile mai lente.

Desigur, alocarea memoriei nu este statica, intrucat, in cele din urma, sistemul va
prelucra toate informatiile memorate. Deci, datele si programele vor fi mutate dintr-o
zona de memorie in alta. Fluxul acestor informatii poate fi controlat de catre
programator, sistemul de operare, hardware sau o combinatie a tuturor acestor
factori. Fiecare din ei poate gestiona un anumit subsistem al memoriei, asa cum se va
vedea mai tirziu.

4.2. Localitatea programelor


Un exemplu de alocare a informatiei sub comanda explicata a programului este
constituit de gestiunea registrelor efectuata de catre un programator in limbajul de
asamblare. Registrele CPU reprezinta cea mai rapida forma de memorie din sistem,
dar capacatatea lor nu este suficient de mare pentru a memora toate datele manipulate
de catre un program. Deci, un programator experimentat foloseste registrele pentru a
memora datele la care frecventa de acces este cea mai mare. Mai mult, intrucat
multimea acestor variabile se poate schimba pe durata executiei unui program,
programatorul va modifica modul de utilizare a registrelor asa incat variabilele care
nu mai sunt intens utilizate de catre sectiunea urmatoare de cod sa fie mutate inapoi
in memoria primara, de unde se aduc in registre cele frecvent apelate.

In cadrul acestui exemplu gestiunea unei zone de memorie unica si rapida se bazeaza
pe cunoasterea structurii programului. Deci, o astfel de tehnica nu este adecvata
pentru gestionarea memoriei prin mecanisme hardware sau de catre sistemul de
operare, pentru ca lor le lipsesc cunostintele despre program. Un numar de
experimente si masurari efectuate asupra sistemelor a evidentiat existenta unui
principiu, numit principiul localitatii programelor (program locality). El se poate
enunta astfel:

- daca la momentul t se face acces la adresa de memorie x, exista o probabilitate


ridicata ca, la momentul t+dt,sa se efectueze accesul la adresa de memorie x+dx, unde
dt si dx sunt valori mici ale lui t si x.

98
Cu alte cuvinte, principiul arata ca procesul de acces la memorie al unui program in
executie se poate diviza in faze. Pe durata fiecarei faze referirile la memorie au loc
doar in cadrul unui unic subspatiu al spatiului de memorie disponibil, accesul la
memorie fiind concentrat in jurul catorva blocuri contigue de memorie. Doar cand
programul se muta de la o faza la alta modelul de acces la memorie devine
neuniform, pina la atingerea noii faze, dupa care referirile la memorie se centreaza pe
o aglomerare diferita de blocuri.

Mecanismele de gestiune automata a spatiului de memorie pot folosi localitatea


programelor pentru a pastra in memoria rapida subspatiul de memorie cu cele mai
frecvente accese in cadrul programului curent. Un element esential consta in
detectarea tranzitiei intre faze si identificarea locatiilor de memorie utilizate de catre
fiecare faza. In cele ce urmeaza se vor ilustra solutiile cele mai des folosite ale acestor
probleme.

In final, combinarea gestionarii automate a memoriei cu cea efectuata de catre


utilizator presupune oferirea de catre programator a unor informatii privind structura
programului, ceea ce permite mecanismului automat sa mute informatiile intre
diferitele subsisteme de memorie corespunzator informatiilor furnizate de catre
programator.

4.3. Adrese fizice si virtuale


Organizarea memoriei in cateva subsisteme diferite are implicitii importante asupra
adresarii. Intrucat alocarea memoriei este dinamica, este mai bine ca programul (deci
CPU) sa nu utilizeze direct adresele efective ale locatiilor de memorie in care sunt
stocate informatiile la care se face accesul, intrucat ar fi necesara relocarea
programului ori de cate ori un subset al sau este mutat in cadrul memoriei. Solutia
adoptata in mod curent consta in a aloca programului propriul sau spatiu de adresare,
care difera de spatiul efectiv de adresare implementat in cadrul sistemului. In
consecinta este necesara transformarea, la momentul rularii, a adresei in program
(adresa virtuala) in adresa de memorie (adresa fizica), transformare ce utilizeaza un
suport hardware adecvat. Intrucat spatiile de adresare virtual si fizic sunt
independente, este normal ca si dimensiunile lor sa difere. Deci, spatiul de memorie
virtuala poate fi mai mare decat dimensiunea memoriei primare, in care caz sectiuni
de program pot fi memorate pe dispozitivele de memorare de masa. Totusi,
localitatea programului permite ca aceste programe sa ruleze eficient daca in memoria
program se stocheaza sectiuni adecvate ale programului.

Este posibila existenta unor functii diferite de transformare a adreselor virtuale in


adrese fizice pentru un anumit program, deci pot exista multiple spatii virtuale de
adresare. Aceasta solutie complica operatia de transformare, dar evita conflicte de
adresare cu alte programe, care ar putea aparea in cazul unicatatii spatiului virtual.

99
In conditiile multitasking, fiecare proces dispune, teoretic, de spatul maxim direct
adresabil aferent procesorului (e.g. 236 = 64 GB pentru Pentium IV)

MMU – rol de translator din spatiul virtual in cel liniar, apoi in cel fizic

4.4. Ierarhizarea memoriei


Principiile de gestiune a memoriei evidentiate in paragraful 4.1. conduc la
organizarea ierarhizata a diferitelor subsisteme de memorie. La virful ierarhiei se
gaseste memoria cea mai mica si cea mai rapida, in timp ce baza este constituita din
memoria cea mai lenta si cu cel mai mare volum. In general transferul de date are loc
doar intre niveluri adiacente ale ierarhiei.
Intrucat organizarea memoriei bazata pe localitatea programelor ofera valori bune
pentru raportul cost/performanta, ideea este larg folosita in noile microprocesoare.
Trebuie remarcat ca ierarhia memoriei pentru aceste sisteme are un numar mai mare
de niveluri decat in modelele anterioare.

Fig. 4.1. indica o organizare posibila a ierarhizarii memoriei pentru un sistem bazat pe
un microprocesor evoluat. Aceasta organizare a memoriei include nivelurile cele mai
obisnuite. Nu orice sistem contine nivelurile din figura, desi ar fi posibil.

Principiul localitatii programelor este valabil pentru orice tip de referire la memorie.
Totusi, diferitele niveluri ale ierarhiei necesita modalitati diferite de manipulare a
instructiunilor, datelor si informatiilor in scopul gestionarii memoriei, ceea ce rezulta
si din figura 4.1.

Este important de remarcat ca, in timp ce termenul "adresa virtuala " poate fi utilizat
pentru a indica adresa manipulata de catre programele utilizatorului, notiunea
"adresa fizica" este folosita pentru a indica zone de memorie de masa rapida in care
este memorata o parte a programului ce se executa, indiferent de celelalte niveluri ale
ierarhizarii memoriei.

100
4.4.1. Registre

Registrele interne ale CPU reprezinta cea mai rapida si cea mai mica memorie din
sistem, deoarece ele sunt direct conectate la diversele subunitati de prelucrare din
cadrul CPU, cum sunt unitatea aritmetica si logica (ALU), decodificatorul
instructiunii sau unitatea aritmetica de evaluare a adresei.

Registrele de uz general constituie nivelul 0 al memoriei pentru date (incluzind


adresele programului) si registrul instructiunii este nivelul 0 al memoriei pentru cod.
Caracteristica noua a unor procesoare de 16 si 32 biti, cum este iAPX286 (ce se va
discuta in urmatorul capitol), consta in faptul ca ele dispun de cateva registre dedicate
pastrarii de informatii temporare necesare gestiunii memoriei. Aceste registre se pot
afla, partial, sub controlul programului (privilegiat) dar, in general, sunt gestionate de
catre CPU.

4.4.2. Memorie cache pe circuit

Cresterea continua a vitezei de prelucrare a noilor microprocesoare necesita si sisteme


mai rapide de memorie. Intrucat timpul de acces al circuitelor de memorie descreste
in mod constant, timpul total de raspuns este afectat intr-o masura importanta de
intirzierile de interfatare, incluzind penalizarea de timp a transferului prin frontierele
circuitului.

Avind in vedere aceste conditii tehnologice, devine rationala introducerea unui nou
nivel de ierarhizare compus din memoria care nu este direct conectata la subunitatile
de prelucrare, dar implementata pe aceeasi placheta de siliciu ca si CPU. Desi acest
nivel, nivelul 1 al memoriei, este mai lent decat registrele, el necesita unele circuite de
interfata; totusi ea este mai rapida decat memoria realizata in exteriorul circuitului. La
acest nivel inca persista distinctia intre date, cod si informatii de gestiune a memoriei.

101
Memoria cache pe circuit destinata programului este, uneori, organizata ca stivele de
tip FIFO, al carui virf este constituit de registrul instructiunii. Aceasta organizare
simpla devine posibila ca urmare a modului aproape liniar al extragerii
instructiunilor, cu perturbari create de executia instructiunilor de salt. Deciexista o
probabilitate ridicata ca urmatorul cuvint de cod ce trebuie sa fie extras sa se afle la
adresa urmatoare.

Instructiunile de salt videaza stiva FIFO, deoarece distrug traseul liniar prin spatiul
de adresare. Deci, pentru un scurt timp, efectul favorabil al memoriei cache pe circuit
dispare, ca urmare a necesitatii de a aduce noi cuvinte de cod din memoria externa.
Dar instructiunile necesita un anumit timp pentru executia lor in interiorul CPU, ceea
ce permite unitatii de gestiune a tamponului de memorie sa umple rapid stiva FIFO
mai rapid decat are loc vidarea ei de catre CPU, care extrage instructiuni. Deci, dupa
executia unei instructiuni de salt, sirul de asteptare in interiorul circuitului a
instructiunilor se reface.

Poate aparea un conflict intre CPU, care trebuie sa execute un ciclu de catire/inscriere
a memoriei externe, si unitatea de gestiune a stivei FIFO, care trebuie sa execute un
ciclu de catire din memorie pentru a completa sirul de instructiuni. In astfel de situatii
ciclul necesar prelucrarii de date este prioritar.
Referirile necesare accesului la date se fac dupa un model mai putin predictibil decat
cel pentru acces la cod, motiv pentru care memoria cache pe circuit este organizata ca
o memorie cu acces aleator, compusa dintr-o parte de date si o alta de eticheta (tag),
asa cum se vede in figura 4.2. In general, atit componenta DATA, cat si cea TAG, au
acelasi numar de cuvinte. DATA pastreaza valorile datelor, iar TAG pastreaza
informatia corespunzatoare despre adresa CPU utilizata pentru acces la date. Cand
CPU emite o adresa, unitatea de comanda a memoriei cache efectueaza operatiile din
figura 4.3. Acest tip de organizare cache, folosita pentru memoria cache pe circuit, este
numit "complet asociativ", deoarece memoria TAG este adresata prin continutul sau.

Adresa CPU

Adresa virtuala
(de la CPU)

Memoria
“Tag”

Adresa in
memoria cache

Memoria
Fig. 4.2. Organizarea generala a memoriei cache “Data”

Continutul
locatiei referite
102
Implementarea memoriei cache pe circuit indica un numar de probleme arhitecturale.
In primul rand, memoria TAG este mare comparativ cu memoria DATA, deci se
consuma o mare arie de siliciu pentru gestiunea memoriei. In al doilea rand unele
studii efectuate prin simulare [17] au aratat ca introducerea memoriei cache pe circuit
creste, in loc sa descreasca, viteza ceruta pentru transferul prin frontiera circuitului.
Exista un mic numar de implementari cache pe circuit, cum este cazul
microprocesorului Zilog Z8000 [18]. Memoriile cache pe circuit, in adevaratul inteles
al notiunii, sunt, in prezent, limitate la instructiuni, intrucat ele nu ridica mari
probleme si reprezinta o imbunatatire fata de sirurile de instructiuni, fiind posibila
memorarea intregului cod pentru o mica bucla in memoria circuitului
microprocesorului, ceea ce elimina necesitatea reincarcarii codului buclei la fiecare
noua executie, asa cum este cazul sirului de instructiuni. Pe de alta parte, costul
implementarii sirului de instructiuni este mai mic decat cel pentru implementarea
mecanismului cache pentru instructiuni.

In fine, tehnica de tip cache este folosita si pentru a memora informatiile cu cea mai
ridicata fracventa de utilizare, destinate gestiunii memoriei in acelasi circuit cu CPU
sau intr-un circuit destinat special gestiunii memoriei (memory management

Obtinerea adresei
virtuale din CPU

Cautare in tag pentru match cu


adresa virtuala

DA NU
Gasit?

Extrage informatia Incarca informatia din


localizata memoria principala

Fig. 4.3. Operarea unitatii de comanda a memoriei cache (pe chip)

unit - MMU). O astfel de unica memorie cache este comandata pe baza principiului
LRU (least recently used - cea mai veche informatie folosita), care inlocuieste cea mai
veche informatie folosita cu noile date cerute de catre CPU si copiate din memoria
externa acesteia. Nu toate mecanismele de comanda a memoriei cache pe circuit sunt
necontrolabile prin program, dar ele sunt implementate prin mijloace hardware si
prezenta lor tinde sa fie transparenta fata de programator.

103
4.4.3. Memorii cache pe placheta

Aceleasi motive care justifica introducerea de memorii cache pe circuit recomanda


realizarea lor pe aceeasi placheta cu a CPU. Intr-adevar, intirzierea introdusa de
circuitele de interfatare, ca si de transmisia si regimurile tranzitorii ale informatiilor
pe magistrala sistemului necesita, adesea, introducerea unei stari de asteptare (wait
state), mai ales pentru microprocesoa- rele foarte rapide, atunci cand se adreseaza
memoriei care nu se afla pe aceeasi placheta. Mai mult, desi memoria cache pe
placheta este realizata utilizind circuite cu semiconductoare ca memorie pe urmatorul
nivel de ierarhizare (memorie primara), exista intotdeauna memorii cu
semiconductoare avind diferite viteze. Deci, memoria cache pe aceeasi placheta
permite obtinerea de timpi de acces la sistemul de memorie apropiati de cei oferiti de
memoria cache de mare viteza, dar la un pret apropiat de cel al memoriei mai mari si
mai lente (memorie primara).

In sistemele multiprocesor apare un motiv suplimentar de introducere a memoriei


cache. In acest sistem, concurenta intre diferitele CPU pentru accesul la memorie
conduce la intirzieri care au ca efect cresterea timpului mediu de acces la memorie.

Gestiunea memoriei de tip cache presupune existenta unui anumit tip de hardware.
Organizarea din fig. 4.2. ramine valabila si pentru memoria cache pe aceeasi placheta
cu CPU, dar, intrucat memoria cache in acest caz este mai mare, sunt necesare alte
mecanisme de gestionare pentru a mentine diversiunea memoriei TAG cat mai mica
posibila.

S-au studiat cerintele pentru asemenea mecanisme suplimentare. Pentru ilustrarea lor
este necesara introducerea urmatorilor parametri:

- dimensiunea cache: dimensiunea memoriei DATA, exprimata in numar de unitati


adresabile de catre CPU;

- dimensiunea blocului: dimensiunea celei mai mici unitati de memorie care poate fi
manipulata de mecanismul de gestiune cache. Fiecare acces la alocatie de memorie
in cadrul unui bloc este privit ca o referinta la bloc. Mai mult,orice transfer in
conjunctie cu memoria primara se face printr-un bloc intreg (in general, dimensiunea
blocului este o putere a lui 2);

- dimensiunea multimii (set size): numarul de locuri diferite in memoria DATA unde
organizarea cache permite stocarea oricarui bloc citit din memoria primara (si
dimensiunea multimii este, in general, o putere a lui 2).
Fig. 4.4 indica un mod posibil de a converti adresele emise de catre CPU in adrese ale
memoriei DATA. Fie n numarul de biti de adresa a CPU si k < n numarul de biti
necesari pentru a adresa memoria DATA.

104
Dindu-se dimensiunea blocului B=2b, cei mai putini semnificativi b biti de adresa ai
CPU sunt copiati in adresa memoriei DATA, deoarece offsetul in cadrul blocului nu
este luat in considerare de catre mecanismul de conversie a adreselor.
a-b-s x b

TAG

s x b

Fig. 4.4. Mecanismul de conversie a adresei pentru memoria cache cu S=2 s

Daca se noteaza cu S dimensiunea multimii, adresa CPU poate fi transformata in una


din cele S adrese folosite pentru memoria DATA. Deci bitii s ai adresei cache sunt
obtinuti prin transformarea prin intermediul memoriei TAG, in timp ce bitii ramasi x
= k-s-b sunt determinati in mod unic din adresa CPU, apoi sunt copiati. Intrucat bitii
x, ilustrati in fig. 4.4., determina setul de blocuri posibile in cadrul memoriei de date,
iar localizarea exacta in cadrul multimii nu este supusa la restrictiii din partea altor
biti de adresa, transformarea celor mai semnificativi n-b-x biti ai adresei emise de
catre CPU in cei mai semnificativi s biti ai adresei de memorie cache ar trebui
efectuata, in mod ideal, de un set de memorii asociative (cate una pentru fiecare set).

O alta solutie este cea din figura 4.5., unde se folosesc doar memorii RAM. In acest
caz, numarul de biti utilizati pentru memoria TAG sunt dati de

2k-b * (n-k+s),

care realizeaza corespondenta intre dimensiunea memoriei cache (2 k), dimensiunea


blocului (2b), dimensiunea multimii (2s) si dimensiunea spatiului adreselor CPU (2 n).
Prin modificarea valorii lui s se obtin urmatoarele trei organizari clasice:

a) s=0 (organizarea indexata): fiecare bloc din memoria primara este transformat
intr-un unic bloc al memoriei cache;

b)0 < s < h-b (organizarea partial asociativa de seturi): orice bloc din memoria
primara poate fi transformat intr-un numar limitat de seturi ale blocurilor memoriei
cache;

105
RAM1

Comparator Activare
Set 1

RAM2

Comparator Activare
Set 2
Spre
DATA

RAMS

Comparator Activare
Set S

SAU

Cache miss

Fig. 4.5 Implementarea memoriei TAG pentru scheme de tip set cache, fara a utiliza
memorie asociativa

c)s = h-b (organizarea complet asociativa): orice bloc al memoriei primare poate fi
transformat in orice bloc al memoriei cache.
Din relatia data mai sus rezulta ca valorile mari ale lui s conduc la dimensiuni mari
ale memoriei TAG. Pe de alta parte, unele rezultate experimentale [19] au evidentiat
in mod clar ca, prin cresterea dimensiunii setului, creste probabilitatea de acces in
memoria cache. In acelasi timp, aceleasi studii au aratat ca dimensiunea de 2 sau 4 a
setului conduce la performante foarte apropiate de cele ale organizarii complet
asociative.

Din cele de mai sus decurge preferinta proiectantului pentru memorii cu organizare
partial asociativa, cu o dimensiune mica a setului. De exemplu, VAX 11/780 are o
memorie cache de 8 kocteti cu dimensiunea setului 2 si dimensiunea blocului 8.

Realizari de memorie cache - 1

106
Principle of locality:
Programele executa secvente
Programele au bucle
Matricele sunt memorate in blocuri contigue
Datele neinrudite sunt plasate in acelasi segment

Realizari de memorie cache - 2

107
Realizari de memorie cache - 3
Notiuni,
Write definitii
through cache - prezinta datele imediat

Write back cache - retine datele pana cand este necesara inscrierea unui intreg
bloc (posted write)

Dirty cell

Organization

Realizari de memorie cache - 4


Notiuni, definitii
Tag subsystem, memory subsystem divizate in refill lines de dimensiuni egale (n
cuvinte, n - putere a lui 2)
Obisnuit: 4 - 64 octeti

Refill line boundary


Transferul se face in unitati de dimensiune egala cu cea a refill line

108
Realizari de memorie cache - 5

Tag in memorie asociativa:


Daca memoria principala are N refill
lines, atunci sunt necesari log2 N biti
de adresa pt refill lines. Toate
componentele simultan  scumpa

Realizari de memorie cache - 6


“Direct-Mapped”

Partitioneaza memoria in k coloane cu N refill lines / coloana.


Se foloseste low address interleaving  cuvinte consecutive de
memorie se afla in refill lines diferite  cache refill mapped
Cache are o coloana cu N randuri, fiecare aratand o refill line

109
Realizari de memorie cache - 7
“Direct-Mapped”

110
Realizari de memorie cache - 8
“Set-Associative”
(Combinatie intre Fully-Associative si Direct-Mapped)

Realizari de memorie cache - 9


“Sector-Mapped”

Cache refill lines sunt grupate in sectoare, numite si randuri (rows).


Cache mapeaza oricare sector al memoriei principale in oricare sector cache ⇨ se
foloseste o memorie asociativa.
Refill lines isi pastreaza ordinea in cadrul sectoarelor ⇨ memoria asociativa
mapeaza doar adrese de sectoare.
Cache foloseste “validity bits”, cate unul pt fiecare refill line, pt a pastra evidenta
refill lines aflate in memoria cache.

111
Realizari de memorie cache - 10
“Sector-Mapped”

4.4.4. Memoria primara

Memoria primara constituie cel mai mare subsistem de memorie adresabil direct de
catre CPU. Toate programele ce se ruleaza (cod si date) trebuie memorate in memoria
primara, ca si informatiile necesare gestionarii memoriei. Totusi, nu toate programele
sunt gata de a rula in paralel si, chiar cand un program este executat, el foloseste doar
un subset al spatiului sau virtual de adresare pe durata unei anumite faze.

Tehnicile de gestiune a continutului memoriei primare necesita un anumit suport


hardware, dar algoritmii sunt implementati prin software. De aici decurge o varietate
de solutii posibile.

Trebuie remarcat ca memoria primara si registrele sunt doua niveluri ierarhice


prezente intotdeauna intr-un sistem, in timp ce celelalte niveluri s-ar putea sa
lipseasca.

112
4.4.5.Memoria de masa

Informatia care nu este imediat necesara CPU (programe care nu sunt gata de rulare
sau subspatii de adresare care nu sunt necesare in faza curenta) este memorata in
dispozitive cu mediu magnetic de stocare, care ofera un mare volum de memorare la
costuri unitare mici, dar cu timpi de acces cu cel putin trei ordine de marime mai mari
decat cei ai memoriei primare.

4.4.6. Consideratii privind costul si performanta

Succesul organizarii ierarhizate a memoriei este datorat bunelor performante si


costuri implicite, deoarece costul pe bit este apropiat de cel al celei mai lente memorii
din sistem, in timp ce performantele obtinute sunt comparabile cu cele ale celor mai
rapide memorii din ierarhie.
In tabelul 4.1. sunt indicate caracteristicile memoriilor folosite la diferitele niveluri ale
ierarhiei; ele permit evaluarea costurilor si performantelor unui sistem de memorie.
Costul pe bit de memorie este dat de formula:
4

m c
i 0
i i

m
i 0
i

unde mi reprezinta dimensiunea nivelului i al ierarhiei, iar c i este costul corespunzator


pe bit. Din acelasi tabel se poate vedea ca dimensiunea intregii memorii este
dominata de cea a novelurilor celor mai lente, fapt ce justifica afirmatia privind costul
global pe bit.

113
Tabelul 4.1. Caracteristicile diferitelor niveluri ale unui sistem ierarhic de memorie

NUME DIMENSIUNE TIMP ACCES

Registre 16 -32 0.1 ns

Cache pe circuit 16 kB - 256 kB 1 - 2 ns

Cache pe placheta 265 kB - 1 MB 8 - 10 ns

Memorie principala 128 MB - 1 GB 50 - 70 ns

Memorie secundara 8 GB - 128 GB 10 ms

Performantele depind de localizarea adresei memoriei la care se face acces in cadrul


ierarhiei. Intrucat fiecare nivel are proprii timpi de acces si de transfer, timpul de
acces la memorie poate fi evaluat doar ca valoare medie, sau probabila, folosind
urmatoarea expresie:
4
T   piTi
i 0

Prin pi s-a notat probabilitatea ca adresa de acces sa se afle in nivelul i, iar T i este
timpul de acces la datele implicite. Nivelurile ridicate sunt gestionate la nivel de bloc,
indeosebi pentru memoriile pe medii magnetice. De aceea valoarea lui T i trebuie sa ia
in consideratie timpul necesar pentru transferul intregului bloc.

Valoarea lui T depinde in masura esentiala de probabilitatile p i. Ar fi de dorit ca pi sa


fie cu atit mai mare cu cat i este mai mic. Experienta arata ca valorile lui T i sunt
apropiate de timpul de acces pentru memoriile cache pe aceeasi placheta cu CPU.
Pentru memoriile cache pe circuit nu se dispune de date concludente, deoarece
numarul de microprocesoare folosind aceasta structura este foarte mic.

114
4.4.7. Ierarhizarea memoriei in sistemele multiprocesor.

Organizarea ierarhizata a memoriei are mai multe avantaje, dar poate genera
probleme in sistemele multiprocesor, deoarece structura ierarhizata intra in conflict cu
necesitatea de a efectua, in mod corect, multiple operatii de catire/inscriere. Problema
majora in utilizarea unui sistem ierarhizat de memorie in sisteme mutliprocesor
consta in existenta mai multor copii ale acelorasi date in mai multe niveluri, fapt ce
impune acualizarea tuturor acestor copii pentru a pastra integritatea datelor.

Pentru mai multa claritate se considera un exemplu. Se presupune ca un sistem este


compus din mai multe plachete cu microprocesoare si cu memorie proprie, fiecare
placheta fiind conectata, prin intermediul unei magistrale multiprocesor la o memorie
comuna (fig. 4.6.). Memoria are o structura ierarhica ale caror niveluri cu numar mic
(0,1,2) sunt implementate in memoria locala, in timp ce nivelurile cu numar mare (3 si
4) sunt realizate in memoria comuna. S-au folosit aceleasi numere de niveluri ca in fig.
4.1.

Daca programul rulat de procesorul i realizeaza accesul la locatia x, continutul


acesteia este copiat in memoria cache proprie la adresa x'; apoi are loc modificarea
continutului lui x', asa ca valorile continute in x si x' nu mai sunt identice. Daca un al
doilea program, rulat de procesorul j, are nevoie de continutul aceleiasi locatii x, el va
folosi o valoare diferita de cea curent utilizata in procesorul i, in pofida faptului ca
este vorba de aceeasi adresa virtuala.

Solutia acestui tip de probleme depinde de ierarhizarea nivelurilor implicite.


Problema memoriei cache proprii a fost intens studiata [20],[21],[22]. De asemenea
ramine deschisa aceeasi problema pentru memoria cache pe circuit. Ca urmare,
introducerea tehnicii de tip cache la microprocesoarele evoluate intirzie, folosindu-se
doar pentru operatia de tip read-only, adica pentru operatii implicand programe.

115
Fig. 4.6. Exemplu de organizare ierarhizata a memoriei intr-un sistem multiprocesor

4.5. Mecanisme simple de gestiune


In acest subcapitol sunt comentate tehnici simple de gestiune a memoriei, care nu
necesita suport hardware, dar ofera un grad redus de flexibilitate pentru gestionarea
spatiului aflat la dispozitia utilizatorului. Aceste metode ofera exemple de gestiune
sub controlul deplin sau partial al programului si ilustreaza avantajele altor tehnici,
devenite posibile in urma disponibilitatii microprocesoarelor moderne.

4.5.1. Memorii cu bancuri suplimentare

Aceasta tehnica este specifica sistemelor cu microprocesoare din perioada de inceput,


ea fiind conceputa pentru extinderea memoriei adresate dincolo de limitele impuse de
numarul de linii de adresa (de regula 16) ale microprocesoarelor de 8 biti. Ideea de
baza este aceea a extinde cimpul de adrese prin adaugarea de biti suplimentari. Ca
urmare a limitarilor CPU, acesti biti suplimentari trebuie produsi de catre
microprocesor intr-o operatie separata fata de cea de adresare normala.

In figura 4.7. se indica organizarea hardware a memoriei. Selectarea unuia din mai
multele bancuri de memorie se face pe baza continutului unui unic registru R, care
contine bitii cei mai semnificativi ai adresei, partea cea mai putin semnificativa a
acesteia fiind produsa de catre CPU. Dupa inscrierea registrului R cu informatia
necesara selectarii unui anumit banc, accesul la datele si codul din acesta se face doar
cu ajutorul submultimii de adrese emise de catre CPU. Cand apare necesitatea
referirii la o locatie dintr-un alt banc are loc modificarea continutului lui R, ceea ce
rezulta in comutarea bancurilor.

116
R1

R2

Fig. 4.7. Memorie sub forma de bancuri comutabile.

Tehnica descrisa nu necesita un suport hardware special, toate functiile de gestiune


fiind efectuate de catre programator. Aceste operatii sunt:

- partitionarea datelor si codului programului astfel incat fiecarecomponenta sa


incapa intr-un alt banc, iar comutarea intre bancuri sa nu fie prea frecventa;

- scrierea programelor prin considerarea operatiilor posibile de comutare a


bancurilor pentru accesul la operanzi, scriere care necesita inserarea de cod necesar
modificarii continutului registrului exterior R.

Trebuie notat ca a doua din operatiile mai sus descrise poate fi efectuata daca
programul este scris in limbaj de asamblare; programele in limbaje de nivel inalt
necesita compilatoare si editoare de legaturi speciale care sa poata face fata problemei
comutarii bancurilor. Astfel de instrumente de dezvoltare a programelor nu sunt
disponibile in mod curent, fapt ce complica elaborarea programelor pentru sistemele
ce adopta solutia mentionata.

Un alt dezavantaj al metodei consta in alocarea statica, rezultat al necesitatii


gestionarii prin program a datelor si codului. In felul acesta se suprima orice
posibilitate de realocare automata, cu scopul folosirii mai eficiente atunci cand starea
sistemului necesita reasignarea memoriei.

117
4.5.2. Overlay

A doua tehnica discutata a fost larg utilizata in minicalculatoare, indeosebi in


modelele PDP 11 ale firmei DEC la care nu se folosea paginarea la cerere. Ea mai este
utilizata pentru rularea de programe mari pe microcalculatoare personale. Tehnica
presupune ca programul este partial rezident in memoria principala, restul fiind
memorat pe disc. Cand o parte a programului stocat pe disc devine necesara unitatii
centrale, aceasta parte este adusa in memoria principala in locul altei parti a
programului, care nu este necesara la acel moment. Intrucat diferitele subspatii ale
spatiului programului se pot incarca in aceeasi zona de memorie, apare suprapunerea
acestor subspatii; de aici decurge si numele tehnicii de gestiune a memoriei: overlay
(suprapunere).

Este esentiala evitarea situatiilor cand doua parti distincte si care se pot suprapune ale
programului sa fie simultan necesare in memorie pentru executarea programului.
Singurul care poate face aranjamentele cerute de tehnica overlay este programatorul,
pentru ca el cunoaste modul de evolutie a programului si care anume sectiuni ale lui
trebuie sa fie rezidente in memorie la un anumit moment de timp.

Aceasta partitionare se poate efectua prin structurarea intregului program intr-un


arbore de module, pentru care toate modulele de pe un nivel se pot suprapune.
Arborele de suprapunere se poate construi urmarand arborele apelarii procedurilor.
Radacina este reprezentata de programul principal, care este permanent rezident in
memoria principala, iar toate procedurile apelate direct de catre programul principal
se pot suprapune, pentru ca ele sunt apelate una cate una, nici una din ele ne
necesitind prezenta alteia.

Din nefericire, un numar de motive fac realizarea arborelui de suprapunere o


problema netriviala. In primul rand, modulele superpozabile trebuie sa aiba,
aproximativ, aceeasi dimensiune,ca sa poata fi continute in acelasi spatiu de memorie.
Pentru exemplificare se poate considera fig. 4.8. O a doua problema este generata de
minimizarea operatiilor de instalare in si evacuarea din memoria principala a
modulelor (swapping). Cu cat numarul acestor operatii este mai mare, cu atit eficienta
de ansamblu este mai mica. Aceasta cerinta conduce la recomandarea realizarii de
module de mari dimensiuni. Pe de alta parte, gestionarea memoriei se face cu mai
buna eficienta daca modulele superpozabile sunt de mici dimensiuni. Deci, la
realizarea arborelui de suprapuneri, programatorul trebuie sa realizeze compromisul
intre cerintele privind memoria si cele referitoare la eficienta executiei.

Fig. 4.8. Exemplu de alocare a memoriei in tehnica overlay.


a) arbore de suprapuneri; b) alocarea initiala a memoriei; c) alocarea dupa apelarea
modulului E; d) alocarea dupa apelarea modulului C; e)alocarea dupa apelarea
modulului F; f) alocarea dupa apelarea modulului G.

O data solutionate problemele referitoare la elaborarea arborelui de suprapuneri,


programatorul se poate baza pe instrumente software de dezvoltare necesare

118
elaborarii taskului final, intrucat exista editoare de legaturi care se preteaza utilizarii
tehnicii overlay. La executie, cu program construit conform tehnicii mentionate
efectueaza apelari ale sistemului de operare ori de cate ori este necesar a folosi o
procedura care, la acel moment, nu este rezidenta in memoria principala. Se poate
vedea ca implementarea tehnicii overlay nu necesita mijloace hardware speciale, cu
exceptia unor unitati rapide de disc, care sa permita incarcarea cu mare viteza in
memoria principala a sectiunii cerute a programului. Adresele de program generate
de compilatoare nu depind de structura arborelui de suprapunere, intrucat apelurile
la procedurile externe sunt solutionate de catre editorul de legaturi, fie in modul
normal, fie prin inserarea de apeluri catre sistemul de operare.

Tehnica overlay este un exemplu tipic pentru metodele care combina cunostintele
programatorului despre comportarea programului cu comutarea automata a
sectiunilor de program, cu scopul implementarii mecanismului de gestiune a
memoriei. Principalul dezavantaj al metodei este legat de pregatirea arborelui de
suprapuneri si necesitatea de a incarca in memorie un intreg modul, chiar daca doar o
parte a lui este necesara. Ca efect se pot obtine performante mai slabe decat cele
oferite de alte tehnici de gestiune, complet automate. Pe de alta parte, este perfect
posibila rularea unor programe cu dimensiuni superiore celei a memoriei fizice
disponibile.

4.6. Swapping
Intr-o masina functionind in regim de multiprogramare este posibila executia
concurenta a mai multor programe. De aceea, este salutara ideea de a pastra in
memoria principala doar programele care sunt gata de rulare.

Conform politicii de swapping (comutare intre memoria principala si cea secundara),


un program care asteapta terminarea unei operatii I/O (care poate dura cateva
milisecunde),este evacuat din memorie (swapped out). Cand el devine din nou gata
de rulare, sistemul incearca sa gaseasca un spatiu adecvat in memoria primara, in care
sa incarce programul in discutie. Daca nu exista spatiul disponibil, programul este
inscris intr-o lista de asteptare, in vederea sosirii momentului la care se creeaza
spatiul necesar de memorie. La fiecare evacuare de program in memoria secundara,
rutinele de implementare a mecanismului de gestiune a memoriei incearca sa incarce
in memoria principala un program din lista de asteptare.
Conversia adresei virtuale in adresa fizica de memorie principala se face prin
adunarea adresei virtuale la adresa de inceput a zonei de memorie in care s-a efectuat
incarcarea. Deoarece aceasta operatie de relocare trebuie efectuata la fiecare ciclu de
memorie, apare necesitatea de hardware specializat, care sa efectueze relocarea
intr-un mod care sa nu conduca la lungirea timpului de executie drept consecinta a
aplicarii tehnicii swapping. Acest hardware specializat, implementat adesea intr-un
singur circuit, se numeste unitate de gestiune a memoriei (MMU-memory

119
management unit) si poate fi considerat drept o extensie a CPU, care efectueaza cu
mai mare viteza functii asociate gestiunii memoriei. Fiecare tehnica de gestiune a
memoriei necesita propriul tip de MMU. Totusi, sistemele cu multiprogramare au
intotdeauna nevoie de o astfel de unitate hardware.

Ori de cate ori un program este lansat sau relansat in executie, adresa de baza a zonei
dee memorie in care se afla stocat un program este incarcata intr-un registru special al
MMU. Un alt registru contine dimensiunea programului, fapt ce permite ca, pe durata
executiei acestuia, sa se poata detecta tentativa de adresare intr-un spatiu exterior
celui al programului curent. Acest test simplu permite protejarea fiecarui program
impotriva unor actiuni periculoase - involuntare sau nu - efectuate de catre alte
programe.

Fig. 4.9 Situatie in care tehnica swapping nu foloseste in mod optim memoria

Tehnica swapping de gestiune a memoriei este simplu de implementat, dar are si


dezavantaje ce nu se pot neglija. In situatia din fig. 4.9. programul PROG2 trebuie
evacuat, eliberand spatiul de memorie pe care il ocupa. Totusi, actiunea nu creeaza
suficient spatiu pentru a incarca in memorie nici unul din programele aflate in lista de
asteptare, chiar daca volumul total de memorie disponibila (1000 + 2000 = 3000
cuvinte) ar permite incarcarea lui PROG7. Tehnica swapping considera un program
drept un bloc a carui incarcare se poate face doar intr-o zona de locatii contigue de
memorie, deci ea nu permite folosirea micilor fragmente de spatii libere de memorie,
spatii a caror dimensiune totala devine importanta dupa un numar de operatii
swapping. Acest efect este numit fragmentarea memoriei si urmarile sale se pot
atenua,inlocuind tehnica swapping cu cea de segmentare.

4.7. Segmentarea
Procesul de segmentare presupune spargerea programelor in mai multe segmente
pentru care nu este necesara stocarea in zone adiacente de memorie, desi fiecare din
ele trebuie incarcat intr-un bloc compact de memorie. Acest lucru diminueaza efectele
fenomenului de fragmentare, devenind posibila utilizarea si a unor zone de memorie
de mai mici dimensiuni.

Segmentele corespund unor submultimi logice ale programului. Se poate considera,


spre exemplificare, segmentul de cod si segmentul de date. Segmentarea poate fi mai
pronuntata decat atit, putind exista mici segmente compuse din una sau mai multe
rutine sau din una sau mai multe structuri de date.

Mecanismul de conversie a adreselor implicit de tehnica de segmentare este complex,


deoarece sistemul de operare trebuie sa dispuna si sa intretina o tabela cu descriptorii

120
segmentelor pentru fiecare program. Fiecare element al acestei tabele este compus
din:

- adresa baza;

- dimensiunea segmentului;

- atribute (folosite pentru a verifica daca accesul efectuat este corect).

In figura 4.10. se prezinta algoritmul utilizat pentru conversia adreselor. Identificarea


segmentului este facilitata de existenta unei submultimi de adrese virtuale.
Descriptorul acestuia este extras din tabela de descriptori ai segmentelor. Dupa
aceasta, conversia de adresa se face similar cazului tehnicii swapping.

Relocarea este critica din punctul de vedere al performantei sistemului, intrucat ea


trebuie efectuata la fiecare ciclu memorie. Deci, daca tabela descriptorilor segmentului
ar fi pastrata in memoria principala, apare necesitatea unui ciclu suplimentar de acces
la memorie, ceea ce dubleaza timpul cerut de efectuarea unui ciclu memorie.

Depasirea acestei dificultati se face stocand tabela descriptorilor segmentelor intr-o,


mica dar foarte rapida, memorie RAM cu care este prevazuta MMU. Dimensiunea
limitata a acestei memorii speciale necesita folosirea tehnicii de swapping intre
aceasta si memoria principala a sistemului.

Fig. 4.10. Schema de conversie a adresarii ceruta de segmentare. Mecanismul de


segmentare

Un alt tip de problema apare in cazul in care numarul de segmente depaseste


cantitatea ce poate fi stocata in memoria RAM a MMU. In acest caz, memoria rapida
din cadrul MMU se poate utiliza ca memorie cache, in care se pastreaza cei mai recent
utilizati descriptori de segment. Cand se initializeaza procesul de conversie a
adreselor, MMU cauta in memoria sa interna descriptorul de segment; daca el nu este

121
gasit, descriptorul este citit din memoria primara si copiat in memoria interna.
Principiul localitatii programelor indica o probabilitate ridicata ca descriptorul sa se
afle in memoria interna a MMU, cel de al doilea ciclu de memorie este doar arareori
necesar , deci nu influenteaza intr-un mod important performanta de ansamblu.

Un alt punct important, referitor la intirzierea de relocare, este viteza cu care se face
adunarea indicata in partea de jos a fig. 4.10. Adresa fizica de m biti se obtine prin
adunarea portiunii de k biti (k =< m), adresa baza, cu offsetul de h biti (h =< m). h
determina dimensiunea maxima a segmentului, intrucat nu este posibil, intr-un
segment dat, sa se adreseze o informatie cu un offset mai mare decat 2 h-1. Cei mai
semnificativi m-k biti nu sunt adunati, de fapt, ci doar copiati din adresa virtuala in
adresa fizica, asa ca adunarea are loc doar pentru k biti (daca h+k > m). Deci, cu cat
numarul k este mai mare,cu atit intirzierea provocata de adunare creste, ceea ce
recomanda utilizarea de valori mici pentru k. Pe de alta parte , adresa baza permite
fixarea unui numar de 2m-k frontiere de segment, asa ca valori mici ale lui k vor
augmenta procesul de fragmentare. Valorile tipice pentru situatii practice ale
diferentei m-k sunt, adesea, intre 4 si 8.

4.7.1. Memorie virtuala segmentata

Cand s-a discutat despre localitatea programelor s-a aratat ca executia programelor
evolueaza printr-o serie de faze, iar spatiul de adresare la care se face acces in cadrul
unei faze este mai mic decat intregul spatiu de adresare al programului. Daca
segmentele la care se face acces in cadrul unei faze sunt stocate in memoria primara,
programul este executat aproape la fel de repede ca in cazul in care toate segmentele
sale s-ar gasi in memoria primara, deoarece -practic- toate operatiile de acces au loc la
segmente existente in aceasta. Cand se genereaza o referire la un segment absent, el
este adus in memoria principala, inlocuind, eventual, alte segmente continute de
memoria amintita.

Implementarea mecanismului presupune ca MMU sa verifice prezenta segmentului


adresat, ceea ce presupune testarea unui anumit bit in descriptorul segmentului: acest
bit este 1 cand segmentul este incarcat si zero cand el este evacuat din memoria
primara. Evacuarea se face mai rapid daca segmentul nu a fost modificat de la
incarcarea in memorie, deoarece nu mai este necesara copierea sa in memoria de masa
(de regula, acest lucru esteadevarat in cazul segmentelor de program). Acesta este
motivul pentru care fiecare descriptor de segment are un fanion indicand starea de
modificat / nemodificat a segmentului in discutie. Initial, fanionul are valoarea 0 si
este inscris cu 1 la fiecare operatie de inscriere a unei locatii din codul segmentului.

O alta caracteristica importanta, chiar esentiala, pentru arhitectura hardware a unui


sistem folosind tehnici de segmentare este data de posibilitatea intreruperii de catre
CPU a executiei in mijlocul unei instructiuni si de reluare a instructiunii exact de la
punctul la care a survenit intreruperea. In aceste cazuri mecanismele clasice pentru
intreruperi si capcane nu mai sunt necesare, deoarece ele sunt activate doar la sfirsitul
instructiunii, asa ca ele nu pot fi utilizate in tratarea unor defecte ale segmentelor ,

122
defecte care pot aparea oricand pe durata desfasurarii unei instructiuni. Instructiunea
nu poate fi terminata daca a aparut un defect de segment , deoarece executia ei ar
conduce la o eroare ireparabila.

Desi ultima varianta de tehnica de segmentare are mai multe avantaje (cum sunt cele
legate de posibilitatea de rulare a programelor al caror spatiu de adresare este mai
mare decat cel al memoriei fizice disponibile), ea are si o serie de neajunsuri. Cel mai
important este legat de dimensiunile neuniforme ale segmentelor, fapt ce complica
gestionarea spatiului de memorie, deoarece, cand se pune problema incarcarii in
memoria primara a unui segment de program, s-ar putea sa nu existe spatiul necesar,
intrucat segmentul evacuat avea dimensiune mai mica, deci memoria eliberata este
insuficienta. Rezulta fie necesitatea unor algoritmi complecsi de inlocuire a
segmentelor,fie mentinerea permanenta a unui spatiu neutilizat de memorie. Una din
tehnicile de rezolvare a acestei probleme este paginarea, care divizeaza spatiul
programului in submultimi de aceleasi dimensiuni.

4.8. Paginarea

Pentru evitarea unor probleme de alocare specifice segmentelor de lungime variabila


intregul spatiu de memorie se partitioneaza in blocuri de dimensiuni egale, numite
pagini.

Solutia are importante consecinte in ceea ce priveste relatia programatorului cu


spatiul de adrese, intrucat paginarea elimina legatura intre organizarea logica a
programului si paginile de memorie. Singurele componente care iau in considerare
partitionarea spatiului programului in pagini sunt cele ale mecanismului de gestiune
a memoriei. In mod analog, memoria fizica este privita ca un set de blocuri, fiecare
din ele avind dimensiunea unei pagini, fapt ce permite stocarea unei pagini intr-un
bloc de memorie. Ca si in cazul segmentarii, nu este necesara alocarea de blocuri
contigue de memorie pentru pagini contigue ale programului.

Fig. 4.11 indica alocarea unui program in memoria unui sistem functionind in regim
de multiprogramare. Paginile, ca si segmentele, pot fi partial stocate in memoria
principala a sistemului. Cand se face o referire la o adresa virtuala dintr-o pagina ce
nu se afla in memoria primara, mecanismul de paginare copiaza intr-un bloc intrega
pagina continind adresa mentionata. Mecanismul se numeste "cerere de pagini"
(demand paging), intrucat paginile sunt aduse in memorie cand sunt solicitate de
catre program.

123
Fig. 4.11. Alocarea memoriei intr-un sistem cu paginare

In decursul timpului s-au dezvoltat mai multe tehnici de paginare, care pot fi grupate
dupa cum urmeaza:

- mecanisme care determina momentul la care o pagina trebuie copiata in memoria


principala. Cea mai des utilizata tehnica este cea bazata pe cererea de pagini, utilizata
de catre MMU ale unor microprocesoare moderne. S-au elaborat si alte metode, care
incearca predictia comportarii programului si incarca in memorie paginile presupuse
a fi utilizate de catre acesta in viitorul apropiat;

- mecanisme (sau tehnici de inlocuire) care folosesc algoritmi de selectare a


paginilor existente in memorie ce pot fi evacuate, eliberand, astfel, spatiul pentru alte
pagini;

- mecanisme ce folosesc un algoritm de determinare a cresterii / descresterii


numarului de blocuri de memorie folosite de un anumit program.

4.8.1. Suportul hardware al mecanismului de paginare.

Mecanismele hardware necesare pentru o implementare eficienta a paginarii sunt


foarte apropiate de cele folosite pentru segmentare. Principala caracteristica este
legata de posibilitatea de testare a adresei virtuale emise de catre CPU pentru a
determina daca pagina care o contine se afla sau nu in memoria principala.

124
Aceasta functie se poate realiza cu ajutorul descriptorilor de pagina,cu structura tipica
din figura 4.12. Descriptorul de pagina este similar cu cele de segment, principala
diferenta constind din absenta cimpului limita, deoarece paginile au o lungime fixa,
egala, adesea, cu o putere a lui doi.

Numar bloc * * Alte atribute *

Fanion prezent/absent______ Bit acces___

Bit modificare ___________________

Fig. 4.12. Exemplu de format al descriptorului de pagina

Mecanismul de paginare

4.8.2. Tabele de pagina.

125
Testarea si conversia adreselor de pagina se poate face prin mecanismul din fig. 4.13.
Adresa virtuala este compusa din numarul paginii si un offset in cadrul acesteia.
Numarul paginii poate fi impartit in mai multe cimpuri, fiecare folosit drept index
pentru adresarea unui descriptor intr-un tabel cu structura arborescenta, ale carui
frunze corespund descriptorilor de pagina. Continutul descriptorului de pagina este
folosit pentru a testa prezenta unei pagini in memorie si pentru a oferi bitii cei mai
semnificativi ai adresei fizice de memorie, in timp ce offsetul ii ofera pe cei mai putin
semnificativi.

Fig. 4.13. Conversia adresei pe baza unor tabele cu structura arborescenta

Numarul de niveluri ale arborelui de conversie a adresei constituie un parametru


important. Cu cat acest numar de niveluri este mai mare, cu atit timpul consumat
pentru obtinerea decriptorului de pagina este mai mare. In acelasi timp, tabela cu
structura arborescenta permite sistemului sa implementeze strategii de alocare a
memoriei puternice si flexibile. De exemplu devine comoda folosirea in comun a
aceluiasi subarbore de catre diferite procese, deci implementarea structurilor de date
comune si a procedurilor comune este imediata. Intrucat zonele comune au un
descriptor unic pentru fiecare pagina, actualizarea continutului acestuia ca urmare a
incarcarii sau evacuarii nu este mai complicata decat pentru paginile care nu sunt
comune. Desi corecta, schema necesita unele modificari care sa o faca apta pentru o
implementare eficienta. Principala problema consta in stabilirea tabelului de paginare
(PGT): daca pentru fiecare program se aloca un spatiu de adrese virtuale separat, este
necesar un PGT pentru fiecare program. De regula, spatiul virtual este mult mai mare
decat spatiul fizic, deci si numarul paginilor si al descriptorilor asociati este mare. In
consecinta, nu este posibila implementarea unei memorii mari si rapide in acelasi
circuit integrat in care se afla MMU, memorie ce ar servi efectuarii, fara o degradare
marcata, a operatiilor descrise in fig. 4.13.

Si in acest caz solutia problemei consta in ierarhizarea memoriei. Pe placheta de siliciu


a MMU se realizeaza o memorie mica, dar rapida, in care se pastreaza descriptorii
celor mai recent utilizate pagini. Pe durata unei faze a programului referirile sunt
axate pe un mic grup de pagini, deci descriptorul de pagina corespunzator adresei
emise de catre CPU se afla, de cele mai multe ori, in memoria MMU, si doar arareori
este necesar a recurge la memoria principala pentru a prelua un descriptor de pagina
din PGT.

Memoria cache de mici dimensiuni a MMU destinata stocarii descriptorului este


organizata ca o memorie adresabila prin continut (CAM - content-addressable
memory), deoarece adresele acestei memorii nu mai sunt legate de numarul de
pagina, intrucat ea memoreaza descriptorii de pagina cel mai recent utilizati.

O alta implementare, utilizata adesea in calculatoare mari, de tipul IBM 370, se


bazeaza pe o memorie CAM mai mare, care are alocat un cuvint pentru fiecare bloc de
memorie: fiecare bloc din CAM contine descriptorul paginii stocate in blocul
corespunzator al memoriei sau o indicatie ca blocul este vid. Descriptorul de pagina

126
are aspectul din fig. 4.14, in care cimpul adresei baza a fost inlocuit de cimpul
numarului paginii. Numarul paginii, emis de catre CPU, este utilizat ca intrare in
memoria CAM ce contine descriptorii paginilor continute in memoria principala.
Iesirea este constituita de adresa cuvintului din CAM in care se gaseste descriptorul
respectiv, sau o indicatie ca pagina nu este prezenta in memorie. Daca pagina se afla
in memorie, iesirea memoriei CAM furnizeaza direct bitii cei mai semnificativi ai
adresei fizice. Desi mai rapida, aceasta solutie necesita o memorie CAM mai mare. De
asemenea, schema permite realizarea de spatii de adresare distincte pentru fiecare
program doar daca, la fiecare comutare de procese, are loc salvarea/restaurarea
continutului memoriei CAM. In cazul schemei anterior descrise, mecanismul de
gestiune a memoriei cache aduce descriptorii in aceasta imediat ce ei devin necesari.

Fig. 4.14. Conversia de adrese utilizand memorie asociativa

4.8.3. Segmentarea cu paginare

S-au subliniat similaritatile intre segmenatre si paginare. De asemenea, este posibil de


a dispune de o tehnica de gestiune a memoriei care combina caracteristicile celor
doua metode, ceea ce conduce la o tehnica oferand alocarea simpla specifica paginarii,
ca si calitatile de protectie a memoriei specifice segmentarii. In acest caz
programatorul divizeaza intregul spatiu virtual in segmentele reflectind structura
logica a programului, ca in cazul segmentarii, apoi, fiecare segment este considerat
drept constind dintr-un numar de pagini, ca in cazul paginarii, asa ca alocarea
memoriei continua sa opereze cu elemente de lungime fixa. Mecanismele hardware
necesare sunt aceleasi ca pentru paginarea pura. Totusi, se constata o crestere a
fragmentarii, ca urmare a faptului ca, in cazul paginarii, numai ultima pagina ramine,

127
eventual, incompleta. La combinatia segmentare-paginare numarul de pagini partial
utilizate este egal cu numarul de segmente, intrucat se exclude folosirea in comun a
unei pagini de catre diferite segmente.

4.9. Principii privind protectia memoriei


In mediile cu multiprogramare necesitatea protectiei obiectelor de memorie (segmente
de cod, date sau combinatii) impotriva utilizarii incorecte este determinata de
cresterea cerintelor privind siguranta si, in acelasi timp, caracterul privat al acestora.
In cadrul sistemelor prevazute cu un mecanism corespunzator de protectie erorile
datorate unor cauze hardware sau software se propaga doar in obiectele de memorie
accesibile procesului in care a aparut eroarea. Tentativa de a realiza accesul la alte
obiecte, cu amenintarea unui posibil export al erorii, este detectata si marcata ca
ilegala si, in consecinta, blocata de mecanismele de protectie. In modul acesta, caderea
unuia sau mai multor procese din sistem nu conduce, in final, la caderea intregului
sistem. Mai mult, mentinerea in stare de izolare a erorilor constituie un important
instrument de depanare, intrucat ajuta la localizarea punctului in care a aparut
eroarea. Ea constituie si baza altor mecanisme intrebuintate in scopul cresterii
fiablitatii, cum sunt categorisirea (categorisation), recuperarea (recovery) si relansarea
(restart). Acelasi mecanism de protectie utilizat pentru localizarea erorilor protejeaza
si informatia din sistem impotriva utilizarii neautorizate, cu conditia ca sistemul de
operare sa faca imposibil accesul unui proces la obiecte pentru care nu are autorizatie.
Este posibila implementarea unui mecanism mai rafinat de protectie, permitind
sistemului sa specifice setul de operatii legale asupra unui obiect accesibil.

4.10. Medii inchise


Problema izolarii procesului (process isolation) reprezinta un element cheie in
localizarea efectelor erorilor. Ea impune ca nici un proces sa nu dispuna de posibilitati
superioare celor cerute de executareasarcinilor sale. In modul acesta, toate operatille
efectuate de un proces asupra obiectelor sunt constrinse la a fi in concordanta cu
drepturile alocate. Orice abatere de la aceste interactiuni predefinite este considerata
ilegala. Deoarece insesi drepturile unui proces sunt stocate in memorie, devine
necesar ca tabelul ce le contine sa devina un obiect special protejat.

Cea mai buna cale de a implementa principiul izolarii proceselor consta in a dispune
de un sistem cu mediu inchis (closed environment). Intr-un astfel de sistem un proces
ce ar urma sa efectueze o operatie asupra unui obiect trebuie sa arate mecanismului
de protectie a memoriei ca dispune de dreptul de a efectua acea operatie.

128
Situatia globala a drepturilor de acces acordate diferitelor procese in conjunctie cu
diferitele obiecte poate fi reprezentata prin forma matriciala din fig. 4.15, in care
fiecare coloana este asociata unui obiect si fiecare rand este asociat unui proces.
Continutul elementului (i,j) reprezinta setul de operatii ce pot fi efectuate de catre
procesul i asupra obiectului j.

acc(i) :codul dreptului de acces (access right code)


Diferitele seturi de drepturi de acces corespund diferitelor valori ale lui i

Fig. 4.15 Reprezentarea matriciala a drepturilor de acces

Exista doua metode de reprezentare a matricii din fig. 4.15: prin randuri si prin
coloane. In cadrul primei metode fiecarui proces ii este asociata o lista a drepturilor de
acces, eliminind toate elementele vide (corespunzind obiectelor pentru care nu exista
drept de acces). Lista se mai numeste si domeniu de acces (domain of access),
deoarece fiecare proces cunoaste doar obiectele la care are drept de acces, toate
celelalte obiecte din sistem fiindu-i ascunse. Cand se face o referire de catre CPU a
memoriei asociate unui obiect, domeniul de acces poate fi utilizat pentru gasirea
obiectului la care se face referirea. A doua metoda ataseaza fiecarui obiect o lista a
dreptului de acces pentru fiecare proces. Cand se solicita o operatie asupra unui
obiect se testeaza lista de acces asociata pentru a se vedea ca procesul solicitant detine
dreptul de acces la acel obiect.

Cele doua metode sunt asemanatoare. Diferenta principala intre ele este data de
costurile diferite ale operatiilor tipice necesare modificarii continutului matricii din
fig. 4.15.

4.10.1. Liste de drepturi

Drepturile sunt considerate ca niste chei si proprietarul are dreptul de acces la datele
protejate prin cheie prin faptul ca poseda cheia respectiva. Aceasta ide e conduce la
teste simple pentru asigurarea protectiei si permite libera circulatie si copierea
drepturilor (desi falsificarea unui drept sau augmentarea domeniului sau de actiune
trebuie interzise). Desi transferul de drepturi este o caracteristica dezirabile intr-un
sistem, ea devine o problema cand se impune revocarea unui drept. Acest lucru este
generat de posibilitatea ca dreptul, acordat initial doar unui singur proces, sa fie
copiat si transferat altor procese. Lucrurile se complica si mai mult cand se are in
vedere ca procesele au, de regula, durate de viata mai mici decat drepturile. Pentru

129
revoacrea unui drept sunt necesare operatii complexe, constind din inspectarea
tuturor proceselor, active sau nu, indiferent de mediul in care sunt memorate.

Un argument important in favoarea listelor de drepturi este dat de posibilitatea de a


stoca lista de drepturi a procesului in rulare intr-o memorie mica si rapida, ceea ce
creste viteza de testare a dreptului de acces. Listele de acces (despre care se va discuta
in paragraful urmator) sunt mult mai voluminoase si necesita o memorie rapida mai
mare.

4.10.2. Liste de acces

Metoda bazata pe liste de acces ofera un fel de directory centralizat, asociat fiecarui
obiect, continind drepturile de acces ale procesului: cand un proces realizeaza accesul
la un obiect, mecanismul asociat de testare examineaza drepturile procesului solicitant
si accepta sau refuza acestuia accesul la obiect. Fiecare operatie implicand fie un
obiect, fie drepturile de acces asociate, trebuie efectuata prin intermediul unui
administrator al obiectului (object manager), care testeaza validitatea operatiei. Deci,
toate operatiile, incluzind transferul de drepturi, trebuie sa urmeze aceeasi ruta, ceea
ce poate conduce la congestionarea ei. Pe de alta parte, drepturile de acces pentru un
anumit obiect sunt pastrate intr-un singur loc, fapt ce simplifica mult problema
revocarii unui drept. Intrucat legitimitatea accesului este verificata de catre obiecte, un
proces cunoaste toate obiectele din sistem, intrucat simpla cunoastere nu are nici un
fel de implicitie asupra dreptului de acces. Un element caracteristic al metodei bazate
pe liste de acces este necesitatea ca orice proces sa insoteasca cererea de acces cu un
identificator, cerut de catre mecanismul de protectie pentru stabilirea dreptului de
acces. De aceea, testarea listelor de acces este, in mod inerent, mai complicata si mai
consumatoare de timp decat testarea listelor de drepturi.

Intrucat ambele tipuri de liste constituie reprezentari diferite ale aceleiasi baze de
date, ele sunt echivalente din punctul de vedere functional si ofera acelasi grad de
protectie. Totusi, metoda bazata pe lista de drepturi ridica un numar mai mic de
probleme de implementare, ceea ce a facut ca microprocesoarele moderne sa o
foloseasca, in defavoarea metodei bazate pe lista de acces.

4.11. Domenii multiple


Uneori este necesara alocarea unor seturi diferite de drepturi procedurilor aceluiasi
proces. Un exemplu este oferit de invocarea unei functii a sistemului de operare:
procedura invocata are drepturi mai mari decat cea care o invoca, intrucat poate
manipula date interioare sistemului de operare.

In acest caz nu mai este posibil a asocia unui proces un domeniu de acces, data fiind
necesitatea unor domenii multiple. Fiecare procedura are drepturi permanente asupra
obiectelor sale locale (obiectele proprii acelei proceduri). Suplimentar, in momentul

130
apelarii, o procedura primeste un set de drepturi asupra unor obiecte nelocale,
drepturi conferite de catre chemator sub forma unor parametri ai procedurii. Operatia
se numeste validarea inidicatorilor (pointer validation), deoarece dreptul poate fi
utilizat pentru adresarea obiectelor, deci ele au un cimp care memoreaza un indicator
catre obiect.

Mijloacele hardware ce ofera suport pentru domenii multiple de acces trebuie sa


poate recunoaste necesitatea de a modifica lista drepturilorasociate programului in
rulare si ar trebui sa verifice ca drepturile transferate de catre chemator reprezinta un
subset al multimii drepturilor posedate. Acest test este necesar pentru prevenirea
cresterii necorespunzatoare a multimii drepturilor, rezultata din transferul spre o
subrutina a unei copii a listei drepturilor augmentata, fapt ce ar permite subrutinei sa
efectueze operatii interzise programului chemator.

Cu mici exceptii, unitatile de gestiune a memoriei din familiile microprocesoarelor


moderne nu dispun de mijloace hardware speciale pentru pentru implementarea
domeniilor multiple de acces in forma pura. In schimb, MMU sunt proiectate pentru
sprijinirea eficienta a domeniilor de acces asociate proceselor. Acelasi hardware poate
fi folosit pentru implementarea domeniilor multiple, cu o anumita degradare a
performantei, deoarece este necesara modificarea continutului memoriei interne a
MMU la fiecare apel de procedura.

4.12. Stari masina privilegiate


O alta metoda de implementare a domeniilor multiple se bazeaza pe utilizarea starilor
privilegiate ale masinii. Pe baza acestei abordari CPU isi poate asuma, la fiecare
moment, una dintre cele n stari privilegiate. Fiecare procedura este asociata cu o stare
privilegiata, asa ca, atunci cand una din ele isi incepe executia, CPU isi modifica
starea in concordanta cu numarul privilegiului asociat procedurii. De asemenea,
oricarui obiect i se asigneaza un numar de privilegiu.
Domeniul de acces al unei proceduri este constituit de catre toate obiectele din spatiul
virtual al procedurii, alecaror numere de privilegiu sunt mai mari sau egale cu starea
actuala a CPU (daca numerele mai mici indica privilegii de grade superioare). Acest
mecanism este usor de implementat, deoarece numarul privilegiului este memorat, in
mod normal, in registrul intern de stare a CPU, care este stocat in stiva cand se
apeleaza o procedura si este automat restaurat la terminarea executiei acesteia.
Numarul de privilegiu se poate determina fie prin specificarea lui in instructiunea de
apelare, fie prin catirea lui dintr-un descriptor adecvat al procesului. Prima metoda
presupune existenta unei instructiuni care sa permita implementarea ei; a doua
metoda se utilizeaza in sistemele care poseda modurile de lucru kernel (nucleu) si
user (utilizator), in care o instructiune de apel sistem produce modificarea starii
nucleului.

131
Un alt mecanism hardware cerut de implementarea unei masini cu stari privilegiate
consta in posibilitatea de a testa daca referirile sunt facute la obiecte cu numarul
privilegiului egal sau mai mare cu cel al CPU. Desi toate microprocesoarele moderne
implementeaza diferite stari pentru CPU care sunt recunoscute de mijloacele
hardware disponibile, doar putine din ele, cum este cazul microprocesorului
iAPX286, ofera mecanismele hardware pentru compararea starii CPU cu numarul
privilegiului obiectului adresat. Deci mecanismul starilor priviilegiate ofera protectie
doar pentru un subset de instructiuni speciale si pentru registrele interne.

Trebuie subliniat ca mecanismul bazat pe stari privilegiate, chiar in cazul


implementarii complete, violeaza principiul mediului inchis. Acest lucru se datoreaza
faptului ca procedurile cu numar mic al privilegiului au, adesea, mai multe drepturi
de acces decat cele strict necesare pentru a-si indeplini functia, facand mai dificila
detectarea erorilor produse de defecte hardware, deoarece nivelul lor de privilegiu le
permite manipularea de obiecte la care accesul nu ar fi necesar. Mai mult, devine
posibila cresterea multimii drepturilor prin transferul unor parametri neadecvati spre
procedurile privilegiate. De exemplu, daca un proces invoca o primitiva sendmessage,
care transfera un numar unei cutii postale care, in mod normal, nu ii este accesibila,
s-ar putea ca rezultatul sa constea in atasarea unui mesaj la acea cutie postala, fara a
poseda dreptul de a o face.

Un alt pericol pentru securitatea sistemului este dat de posibilitatea de apelare a unei
proceduri mai putin privilegiate. In acest caz devine posibil a apela o rutina bine
testata si a obtine rezultate eronate, deoarece rutina a apelat o procedura mai putin
meticulos testata, procedura ce a indus eroarea. In final, credibilitatea rezultatelor
obtinute de utilizator este inferioara nivelului dorit, ceea ce faciliteaza deteriorarea
programelor de nivel superior. Deci, in timp ce obiectele accesibile sunt doar cele cu
numar de privilegiu mai mare sau egal, procedurile apelabile sunt cele cu numar de
privilegiu mai mic sau egal.

4.13. Mijloace de sprijin pentru testarea drepturilor


Cea mai des folosita metoda de a atasa drepturi obiectelor de memorie in sisteme cu
microprocesoare consta in a atasa un set de fanioane, numite "drepturi", aceluiasi
descriptor al obictului utilizat pentru conversia adreselor virtuale in adrese fizice.
Aceasta tehnica permite MMU sa gaseasca drepturile asociate obiectului de memorie
adresat in descriptorul pe care l-a identificat in vederea conversiei de adrese, asa ca
ambele operatii se pt efectua in paralel. In consecinta, drepturile se asociaza
segmentelor sau paginilor, dupa cum se foloseste segmentarea sau paginarea ca
tehnica de gestiune a memoriei. Totusi, din punctul de vedere al protectiei memoriei,
intre cele doua moduri de gestiune exista o importanta deosebire.

132
Segmentele sunt subdiviziuni ale programului vizibile de catre programator, cel care
decide modul de organizare a programelor in segmente; deci, fiecare segment poate fi
ales astfel incat sa i se poata asocia un anumit drept. Pe de alta parte, metoda
paginarii nu permite programatorului sa structureze programul pe pagini, asa ca nu
eista nici o relatie intre continutul paginii si semantica programului, o pagina putind
contine un conglomerat de informatii care necesita - in scopuri legate de protectie -
diferite tipuri de drepturi. De exemplu, o aceeasi pagina poate contine cod si date,
accesul la cod facandu-se prin operatii de catire/inscriere. Rezulta ca nu este posibila
protejarea codului impotriva inscrierilor eronate, deoarece este necesar a permite
inscrierea in conjunctie cu datele din pagina. De aceea, segmentarea este de preferat
pentru o implementare eficienta a meccanismelor de protectie bazate pe drepturi. Pe
de alta parte, intrucat sistemele de paginare au avantaje importante privind alocarea
memoriei, segmentarea cu paginare pare a fi o buna metoda, combinind avantajele
atit ale segmentarii, cat si ale paginarii.

Desi drepturile au o durata lunga de viata, aceasta caracteristica este dificil de


implementat in sistemele cu microprocesoare, in cadrul carora drepturile sunt stocate
in descriptorii folositi pentru gestiunea memoriei. Apar probleme cand programele se
afla partial in memoria principala si partial pe disc. In acest caz, cimpurile fiecarui
descriptor folosit pentru evaluarea adresei fizice isi schimba continutul de fiecare data
cand pagina sau segmentul al care se face referire este adus din memoria secundara.
Este dificil a transfera drepturile prin transferul descriptorului de segment sau de
pagina, deoarece continuturile cimpurilor acestuia s-ar putea sa nu fie corecte. Mai
mult, proliferarea descriptorilor da nastere unor probleme legate de concordanta intre
diferite copii, care trebuie anulate cand un segment sau o pagina sunt evacuate si
actualizate cand acelasi segment sau pagina sunt incarcate in memorie.

In continuare se indica o lista a celor mai des utilizate drepturi de acces. Trebuie
mentionat ca unele din acestea pot fi atribuite simultan, intrucat se exclud reciproc:

- executie (execute only): cand fanionul asociat este 1, singurul drept posibil este
acela de a extrage instructiuni. Fanionul este folosit pentru protectia zonelor de cod;

-catire (read only): cand fanionul asociat este 1, drepturile posibile sunt catirea de date
si extragerea de instructiuni. Fanionul este folosit pentru protectia obiectelor de
memorie ce nu pot fi modificate;

-acces exclusiv la date (no CPU): cand fanionul asociat este 1, etragerea de instructiuni
este considerata ilegala. Fanionul este folosit pentru identificarea obiectelor de date.

4.14. Protectia prin mijloace hardware a memoriei

133
Listele de drepturi si listele de acces ofera un grad limitat de protectie impotriva
alterarii datelor si programelor pastrate in memorie, deoarece actiunea lor este
limitata la evitarea propagarii erorilor dincolo de transmiterea domeniului de acces.
Pentru detectarea rapida si,eventual, corectarea erorilor se utilizeaza frecvent mijloace
de protectie hardware. Necesitatea unui astfel de test provine din cresterea constanta
a dimensiunii memoriei, fapt ce contribuie la cresterea la circa 60 - 70% a ponderii
erorilor de memorie in totalul erorilor sistem [23]. In favoarea protectiei prin mijloace
hardware pledeaza si faptul ca, din punctul de vedere al volumului suplimentar de
memorie si a circuitelor necesare implementarii, metodele folosite pentru detectarea si
corectare a erorilor nu ridica probleme deosebite. In prezent exista mai multe circuite
integrate care efectueaza codificarea/decodificarea in vederea detectiei si corectiei
erorilor, ceea ce reduce costurile de implementare.

In cele ce urmeaza se vor ilustra solutii curent utilizate in acest domeniu.

4.14.1. Detectia erorilor de memorie

Cea mai simpla tehnica de detectare a erorilor este bazata pe bitul de paritate. Ea
foloseste un singur bit suplimentar pentru fiecare cuvint de memorie, in care se
memoreaza valoarea functiei "sau exclusiv" sau a functiei "si exclusiv" avind la intrare
bitii cuvintului de date asociat. In cazul functiei "sau exclusiv" paritatea este cu sot, in
celelalt caz ea fiind fara sot.

Inscrierea in memorie a unui cuvint este insotita de evaluarea bitului de paritate si el


se memoreaza simultan cu datele. La catirea aceluiasi cuvint de memorie sunt extrasi
bitii de date si cel de paritate. Un circuit hardware evalueaza paritatea bitilor de date
extrasi si o compara cu bitul de paritate evaluat la memorare. In cazul coincidentei
paritatii calculate cu cea memorata, se considera ca informatia citita este corecta. In
caz contrar se emita un semnal catre CPU, indicand detectarea unei erori de memorie.
Evident, paritatea cuvintului de date citit se calculeaza in acelasi mod ca la
memorarea cuvintului de date.

Mecanismul de testare a paritatii descris mai sus permite detectarea erorilor care
afecteaza un numar impar de biti ai cuvintului de date. Eronarea unui numar par de
biti trece nedetectata. Intrucat capacatatea de detectie/corectie a erorilor de catre un
cod este data de numarul maxim de erori detectate/corectate in cazul cel mai
nefavorabil, controlul paritatii permite evidentierea erorilor simple.

In fig. 4.16. s-a reprezentat o schema folosind circuite "sau exclusiv" pentru evaluarea
paritatii (cu sot) a unui cuvint de date de 8 biti. Schema poate folosi atit la testarea
paritatii cuvintului citit (in acest caz semnalul Bit de paritate are valoarea citita din
bitul de paritate asociat cuvintului si Eroare este semnal catre CPU), cat si la
generarea paritatii la inscrierea unui cuvint in memorie (Bit de paritate = 0 si iesirea
schemei furnizeaza informatia pentru bitul de paritate asociat cuvintului).

134
Daca un cuvint de date de n biti este folosit ca entitate pentru tehnica de detectie
bazata pe paritate, capacatatea de memorie ceruta de aceast a tehnica este de 1/n din
capacatatea memoriei propriu-zise. In practica, valoarea normala pentru n este 8.

4.14.2. Coduri detectoare/corectoare de erori

Tehnologiia memoriilor RAM dinamice a permis realizarea unor mari volume de


memorie pe o placheta cu cablaj imprimat, fapt ce a dus la larga utilizare a acestui tip
de memorii in sistemele cu microprocesoare. Din pacate, memoriile dinamice nu sunt
numai dense, ci si mai intens supuse erorilor decat memoriile statice. Din cauzele
obisnuite ale erorilor sunt de remarcat radiatiile (in special particulele alfa) si virfurile
de tensiune. Deci, chiar daca memoria dinamica functioneaza normal, este posibila
aparitia erorilor.

Fig. 4.16. Circuit de generare/testare a paritatii

Pentru a face fata acestor probleme se utilizeaza coduri cu redondanta, capabile nu


numai sa detecteze, ci sa si corecteze eventualelel erori. Cand, la catirea unui cuvint
de date, se constata o eroare, aceasta poate fi corectata si cuvintul reinscris in locatia
corespunzatoare. Daca eroarea a fost produsa de o particula alfa, memoria isi
recapata continutul normal. Daca eroarea este rezultatul unei defectari hardware,
inscrierea nu poate corecta valoarea informatiei stocate, in schimb CPU va primi
valoarea corecta pe care locatia adresata ar fi trebuit sa o contina.

Codul corector de erori cel mai des folosit pentru memorii dinamice este codul
Hamming ce permite detectarea erorilor duble si corectia erorilor simple. Acest cod
necesita un numar suplimentar de k biti pentru fiecare cuvint de date de n biti. asa
incat eroarea unuia din cei k+n biti ai cuvintului de cod sa produca o combinatie
binara unica si distincta de zero. Deci este necesara satisfacerea conditiei

k+n =< 2 k-1 - 1.

Inaintea stocarii in memmorie, fiecarui cuvint de n biti de date i se adauga cei k biti
de control. La catirea memoriei se extrag cei n-k biti memorati si se calculeaza asa
numitul sindrom. Daca valoarea sa este 0, se considera ca informatia citita este
corecta. In caz contrar, valoarea lui identifica in mod unic bitul eronat sau semnaleaza
prezenta erorii duble. Calculul bitilor de control necesita calcularea produsului intre o
matrice A de dimensiune (k-1) x n si vectorul de date D de n biti. Rezulta primii k-1
biti de control ai vectorului C, conform formulei:

d1*a1,i +d2*a2,i + ... + dn*an,i = ci, i=1,2,...,k-1

Ultimul bit de control este bitul de paritate (cu sot) al celorlalti k+n-1 biti ai vectorului
C.

135
Matricea A contine, pentru fiecare coloana, o combinatie unica de k-1 biti. Nu este
posibila combinatia in care sa figureze un singur 1. Iata un exemplu:
d1 d2 d3 d4

1 1 1 0 c1

1 0 1 1 c2

0 1 1 1 c3

c1 = d1 + d2 + d3
c2 = d1 + d3 + d4
c3 = d2 + d3 + d4
c4 = d1 + d2 + d3 + d4 + c1 + c2 + c3

Sindromul se obtine efectuind produsul intre o matrice A' de dimensiune (k+n) x n, si


vectorul de date si biti de control. Matricea A' este obtinuta adaugind un rand de 1
matricii A si concatenind-o cu o matrice de dimensiuni k x k avind forma:

0 1 0 ... 0

0 0 1 ... 0
.
.
.
0 0 0 ... 1

1 1 1 ... 1

Pentru exemplul considerat se obtine

d 1 d 2 d 3 d 4 c 1 c2 c 3 c4

1 1 1 0 0 1 0 0 s1

1 0 1 1 0 0 1 0 s2

0 1 1 1 0 0 0 1 s3

1 1 1 1 1 1 1 1 s4

s 1 = d 1 + d 2 + d 3 + c2
s 2 = d 1 + d 3 + d 4 + c3
s 3 = d 2 + d 3 + d 4 + c4
s 4 = d 1 + d 2 + d 3 + d 4 + c1 + c2 + c3 + c4

136
Cand continutul citit al locatiei de memorie este corect, sindromul este compus numai
din 0. Daca apare o eroare simpla, atunci s n = 1 si, de asemenea, devine 1 sindromul in
al carui calcul s-a folosit bitul eronat. In coonsecinta, vectorul sindrom capata valoarea
acelei coloane a matricii de control A' care contine bitul eronat. Daca s n = 0 dar
sindromul nu este nul, acest lucru semnifica aparitia a doua sau mai multe erori, dar
nu se dispune de informatiile necesare corectarii lor. In concluzie, codul folosit
permite detectia erorilor simple si duble, precum si detectia erorilor simple.

Alegerea elementelor matricii A, deci si ale matricii A', nu este nici pe departe atit de
empirica pe cat pare din exemplul considerat. Exista o teorie a codurilor, bine pusa la
punct, care ofera baze stiintifice de selectare a codului optim pentru o situatie data.

Costul suplimentar exprimat in consum de memorie este k/n. Ar parea ca este


rentabil a folosi cuvinte cu numar n de biti mare, ceea ce ar duce la scaderea
raportului k/n. Pe de alta parte, cu cat n este mai mare, creste si probabilitatea de
aparitie a erorilor, sau, altfel spus, creste probabilitatea ca numarul erorilor care apar
sa depaseasca numarul de erori corectabile sau detectabile de catre cod.

Din punctul de vedere al circuitelor secundare nu se ridica probleme deosebite,


deoarece tehnologia integrarii pe scara larga a permis realizarea, in mai multe
variante, a circuitelor care rezolva complet codificarea, detectia si corectia erorilor.
Circuitele pot fi folosite in structuri de cuvinte de memorie de l, 2 sau 4 biti, ceea ce
inlesneste munca proiectantului.

Bitii de control pot fi folositi si pentru protectia memoriei impotriva adresarii eronate.
In acest caz bitii de control sunt calculati prin luarea in considerare a bitilor atit de
date cat si de adresa. Cand se face accesul unui cuvint in vederea citirii se face
concatenarea bitilor de date si control cititi din memorie cu bitii de adresa, apoi se
verifica sirul astfel rezultat.

4.14.3 Reconfigurarea memoriei.

Codurile corectoare de erori permit unui modul de memorie sa se comporte corect


chiar in prezenta unui mic numar de erori in matricea memoriei, deoarece
continuturile incorecte sunt modificate asa incat, din exterior,ele sa apara corecte.
Daca eroarea se datoreste unui defect permanent, ea poate fi corectata de catre
mecanismul de corectie, dar nu poate fi indepartata pina la repararea defectului. Deci,
numarul acestor erori creste in timp pina cand ele nu mai pot fi corectate folosind bitii
redondanti.

Pentru cresterea fiabilitatii memoriei se pot folosi biti de rezerva. Memoria poate fi
considerata ca o matrice in care liniile corespund cuvintelor, iar coloanele - bitilor de
acelasi ordin din cuvintele memoriei.

137
Tehnica bitilor de rezerva foloseste un numar h de coloane suplimentare, asa ca
fiecare cuvint are h biti de rezerva. Folosirea de coloane suplimentare in loc de
randuri suplimentare este dicatata de structura circuitelor de memorie, care tind sa
aiba un mare numar de cuvinte foarte scurte, ceea ce face mai ieftina introducerea de
coloane suplimentare. In favoarea acestei alegeri pledeaza si faptul ca, daca se
defecteaza un circuit de memorie ce asigura o coloana, toate cuvintele vor prezenta
erori in aceasta coloana. Este mai simplua substitui coloana defecta cu una de rezerva.

Utilizarea eficienta a bitilor de rezerva presupune existenta unui cod redondant, care
sa localizeze coloana defecta, si un circuit de multiplexare, care sa reconfigureze
conexiunile la magistrale ale memoriei intr-un mod care sa permita utilizarea coloanei
de rezerva in locul celei defecte, asa cum se poate vedea in exemplul din fig. 4.17.

Fig. 4.17. Exemplu de implementare a tehnicii bazate pe biti de rezerva.

Desigur, erorile pot aparea in coloanele obisnuite, ca si in cele de rezerva. De aceea,


codul folosit trebuie sa considere toate coloanele memoriei pentru a evita inlocuirea
unei coloane defecte cu alta coloana defecta.

4.15. Concluzii
Complexitatea crescuta a aplicatiilor microprocesoarelor a facut ca organizarea
memoriei in sistem cu microprocesoare sa se apropie de cea a minicalculatoarelor sau
chiar a calculatoarelor puternice. De aceea, modelele de organizare a memoriei
elaborate pentru sisteme mari se regasesc si in lumea microprocesoarelor.

In acest capitol au fost prezentate cele mai importante tehnici de gestiune si protectie a
memoriei in sisteme cu microprocesoare. Datorita localitatii programelor devine
posibila ierarhizarea memoriei. In consecinta se pot obtine viteze comparabile cu cele
ale celei mai rapide componente a sistemului de memorie la preturi pe bit aproape
egale cu cele ale celei mai ieftine componente.

Ierarhizarea subsistemelor de memorie permite separarea adreselor fizice de cele


virtuale, fapt ce necesita existenta unui mecanism de conversie a adreselor.

S-au detaliat unele mecanisme de implementare si s-au prezentat mecanisme de


protectie a memoriei, esentiale in evitarea folosirii incorecte a obiectelor pastrate in
memorie.

In fine, s-au examinat mecanisme hardware de protejare a continutului locatiilor de


memorie impotriva erorilor, mecanisme care pot fi simple (de tipul celor ce folosesc
paritatea) sau complexe (utilizind codul Hamming).

R-read request; W-write request; G-grant request


Memorie_Multiport

138
Prioritati
 Fixate prin numarul dispozitivului

 Round robin

 Time multiplexed
Protocol al canalului (Channel protocol
DMA, canal DMA.
1) CPU creeaza program canal, il incarca in memorie la adresa P.
2) Emite o instructiune START I/O canalului si ii furnizeaza adresa P, dupa care
CPU efectueaza alte task-uri, nelegate de canal, pana la pas 3.
3) Canalul isi incarca PC cu valoarea P si executa programul canal fara interventia
CPU.
4) Programul canal controleaza dispozitivele I/O, care transfera datele direct in
memorie.
5) La terminare, canalul intrerupe CPU pentru a-l informa despre terminare. CPU
poate aloca un alt task canalului.

Organizarea Memoriei

139
Organizarea Memoriei:

Organizarea Memoriei – „High Order Interleave”:

140
„Low Order Interleave”

141
CAPITOLUL 5
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 sunt 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.

142
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 sunt complet
invizibile programatorului. Gestiunea memoriei se face in interiorul circuitului CPU,
asa ca sunt utilizate registre pentru pastrarea descriptorilor celor patru segmente: de
cod, de date, de stiva, pentru date suplimentare. Deci, cand 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 sunt 80286 (care
include, cum s-a aratat, si partea de gestiune a memoriei) si 80287, coprocesorul
matematic.

5.2. 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

143
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 sunt destinati alimentarilor, iar 57 sunt dedicati unor
semnale, dupa cum se va detalia in continuare.

D0-D15

Aceste semnale sunt 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 sunt 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, cat 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 sunt 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 cand M/IO = 1,


sau in conjunctie cu un port de intrare/iesire, cand M/IO = 0.

144
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 sunt 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). Cand 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 cand 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 sunt gata de a
efectua transferul de date. Cand 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

145
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. Cand 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 cat HOLD este activ, noul master emite semnale de
comanda pe magistrala. Cand 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

146
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 cand se executa o
instructiune WAIT; activitatile se reiau cand 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 2 20 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 (2 24), deoarece doar 24 pini ai
circuitului sunt 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; intrucat diferiti programatori pot folosi

147
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, cate 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 (2 14)
in modul protejat.

5.3. Principalele tipuri de date


Structurile de date de baza in sistemul iAPX 286 sunt 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 sunt:

- intregi cu semn, de 8 sau 16 biti. Numerele negative sunt reprezentate in


complement fata de 2. Cand 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 indicand o adresa. Ei sunt compusi din doua
entitati de 16 biti: un selector, care defineste numarul segmentului, si un offset,
indicand 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 cate 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.

148
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 07 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 | |
|____________________|
| |

149
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 sunt 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.

150
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 sunt incarcati in registrele de segment corespunzatoare. Deci, instructiunile
sunt 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 explicat 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
sunt 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

151
segmentului a celulei de memorie la care se realizeaza accesul (fig. 5.4.). In modul VA
selectorul segmentului are o structura mai complexa, indicand 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 sunt 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 cand rezultatul ultimei operatii este zero.

IF (interrupt enableflag)estedestinat mascarii/activarii intreruperilor exterioare


mascabile. Cand 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

152
(direction flag) indica sensul transferului de date in operatii cu siruri. Cand DF=1
transferul incepe cu ultimul element al sirului. Cand DF=0 transferul incepe cu
primul element al sirului ce se transfera.

OF (overflow flag) indica depasirea capacatatii 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 sunt 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 sunt date de instructiunile care
opereaza cu siruri, pentru care ambii operanzi sunt 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 explicata 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 cand referirea la memorie se face prin
operatii specifice stivei sau asupra sirurilor.

153
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 sunt simple si se intilnesc la multe


microprocesoare. Urmatoarele moduri de adresare, suntetizate in tabelul 5.2, sunt
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

154
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 sunt 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

155
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 sunt 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 sunt disponibile instructiunile ADD (adunare
obisnuita) ADC (adunare cu transport) sau INC (adunare cu 1). Scaderea se poate face
in mod normal (SUB), implicand 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. Catul 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 sunt
necesare si operatii de ajustare, care iau in consideratie transportul/imprumutul
rezultat din cifrele BCD cel mai putin semnificative. Pentru ajustare sunt 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
sunt utilizate in conjunctie cu operanzi ACCII.

156
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. Sunt
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 cand programatorul indica
in mod explicat 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
cand continutul registrului CX devine zero. Exista si alte prefixe, care se folosesc cu
unele instructiuni de comparare; ele permit oprirea repetarii fie cand continutul lui
CX devine zero, fie cand conditia indicata de prefix nu mai este respectata. Pentru
exemplificare, se poate cata :

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

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

Prefixele de repetare permit programatorului sa obtina operatii cu siruri, incarcand 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


catire-modificare-inscriere in structuri multiprocesor. Pe durata executiei instructiunii
prefixate cu LOCK semnalul hardware exterior LOCK este activ; pe durata cat 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
cand codul privilegiului programului nu este mai mare decat 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 sunt 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 sunt 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 sunt adaptati rezultatului compararii. Prefixul
REPE permite evidentierea primei neconcordante intre elementele corespondente ale
celor doua siruri, deoarece operatia de comparare inceteaza cand s-a detectat prima
inegalitate sau cand continutul contorului CX a devenit zero.

158
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 cand 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:intrucat 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 sunt 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. Cand 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, cat si pentru cei fara semn, deoarece limbajul de asamblare studiat
contine instructiuni de salt conditionat referitoare la rezultatul testarii atit a
argumentelor cu semn, cat si a celor fara semn.

159
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 cand 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
sunt echivalente) si LOOPNE sau LOOPNZ (si aceste doua instructiuni sunt
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 sunt


doar de forma neconditionata CALL, RET. Instructiunea RET poate fi insotita si de un
parametru, specificand numarul par de octeti care trebuie scosi din stiva inainte de
returnarea controlului. In acest mod se pot elimina parametrii inscrisi in stiva atunci
cand s-a apelat procedura.

Direct legate de utilizarea procedurilor limbajul mai dispune de doua instructiuni,


ENTER si LEAVE. Ele sunt 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,sunt 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 sunt 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

160
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 sunt privilegiate. Se pot cata


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) decat
de acele programe pentru care nivelul privilegiului nu este mai mare decat 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 sunt
vizibili din nivelul curent de privilegiu. In aceasta categorie intra instructiunile LAR

161
(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 cati, 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
cand linia BUSY se dezactiveaza. Cum WAIT si BUSY sunt 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 sunt folositi pentru mecanismul de
protectie a memoriei, asa cum se va vedea ulterior.

31 16 15 0
_______________________________________
| | |
| Selector | Offset |
|_________________|_____________________|

162
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 ruland 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 incat
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

163
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, indicand 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 cand A = 1


P - segment prezent in memorie cand P = 1
DPL - nivelul de privilegiu al descriptorului

164
Bit 4 = 1 segment de date sau cod
Bit 3 = 1 segment executabil
= 0 segment neexecutabil

C - segment conform ED - directia de expandare


R - catibil (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 sunt folositi de catre mecanismele de protectie, care
testeaza atit tipul dreptului de acces, cat 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

165
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. sunt 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 sunt indicate in fig. 5.13. Cele patru registre CS, DS, SS, ES
sunt 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 sunt 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

166
|____________|____________________________|
| | |
| | | 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

Cand 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 explicat 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.

Cand 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.

167
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, intrucat toate referirile la memorie sunt
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 : cand se face referire la un astfel de segment
este generata o capcana, indicand 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
sunt pastrati in acelasi tabel, GDT (global descriptor table). Izolarea realizata prin
utilizarea de adrese diferite de la un spatiu propriu la altul dispare cand se face acces
la segmentele globale. De aici pot aparea probleme daca segmentele globale sunt
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 sunt 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.

168
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 intreprande 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 cate 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 sunt 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 indicand 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 sunt 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 sunt urmatoarele:

a) segmentele de date sunt accesibile doar taskurilor cu acelasi nivel de privilegiu


sau cu nivel de privilegiu superior

169
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 cand
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 sunt 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, indicand nivelul de privilegiu al programului aflat in executie.

Cand 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 sunt supuse altor mecanisme
de testare, care se vor discuta mai tirziu.

170
Programele mai putin fiabile pot apela rutine mai privilegiate, transferandu-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.

Cand 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 indicand 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 sunt salturi sau apelari la adrese din segmentul de cod
cu acelasi niveluri inferioare de privilegiu. (Nu sunt 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;


- sunt satisfacute restrictiile privind nivelurile de privilegiu;
- adresa de destinatie a transferului constituie un punct corect de intrare.

Cand 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 |

171
| 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.

172
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 sunt 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 cate 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 sunt 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 sunt necesare
programelor utilizator nu sunt 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,
intrucat 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 sunt 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.

173
Cand 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 indicand 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
sunt mai privilegiate decat programul ce a apelat procedura, aceste registre sunt
incarcate cu un segment nul, asa ca orice tentativa de a le utiliza are ca efect generarea
unei capcane indicand 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 sunt executate fara a schimba CPL sau stiva. Sunt
permise exceptii similare de la regulile de protectie daca segmentul conform este
catibil; 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 sunt segmentul de stare a taskului TSS (task state
segment) si descriptorul de segment asociat lui, al carui format este ilustrat in fig.
5.16. _______________________________________________

174
| |
+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 sunt 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 sunt cele indicand segmentul si
offsetul stivei utilizate cand 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 sunt 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 sunt 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 cand cel curent si-a incheiat executia.
______________________________________
|_Rezervat (0 pt. compat. cu iAPX386)_|
|_P DPL Tip Baza 23-16 _|
|_ Baza 15-0 _|
|_ Limita _|

175
| |
| |
| |
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 cand 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;

176
- 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. Cand 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 sunt identice cu cele cerute de testele declansate cand se
apeleaza o subrutina printr-o poarta de apelare. Totusi nu sunt restrictii privind
nivelurile de privilegiu ale taskului chemator si taskului apelat, intrucat 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. Cand taskul curent
incearca a efectua o operatie implicand procesorul matematic se activeaza automat o
capcana (7), indicand 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 explicat prin programe
privilegiate.
Indicatorul intern de care s-a vorbit, indicand o comutare de taskuri, este reinscris cu
0 la aparitia capcanei generate de tentativa de utilizare a coprocesorului. Deci, orice
operatii ulterioare implicand coprocesorul se vor executa in mod normal, deci fara
influente asupra performantelor sistemului.

177
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. Cand 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 cand 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 cand 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 incat 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

178
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,sunt 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 sunt cauzate de
semnale speciale externe microprocesorului, indicand aparitia unui eveniment in
lumea exterioara. Capcanele sunt evenimente interne, produse de executia unei
instructiuni, instructiune ce necesita activarea capcanei.

Intreruperile externe sunt 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, sunt 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
capcane au formatul indicat in fig. 5.14, iar rolul lor este analog celui al portilor
pentru taskuri. Exista, insa, si diferente importante, intrucat 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

179
evenimente 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 rutinelor 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
sunt 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 prelucrarea lor, se foloseste acelasi spatiu ca
pentru taskul intrerupt. Pentru protejarea sistemului impotriva folosirii
necorespunzatoare a acestor porti ele sunt tratate aproape la fel cu portile de apelare.
De exemplu, cand se executa instructiunea INT, care solicita in mod explicat o
capcana, rutina de tratare asociata este activata numai daca valoarea codului CPL al
programului este cel putin egala cu valoarea codului DPL, memorat in poarta
corespunzatoare utilizata pentru accesul rutinei de tratare. 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)

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

Cand 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 explicat, 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 realizarea, si in acest caz,
a efectuarii unei comutari de taskuri, cu conditia ca, anterior, sa se fi inscris cu 1 bitul
NT din registrul 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 cand 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

181
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 cand 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 cand 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.

182
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 cand 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.

8 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 decat 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
catire 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 cand 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, cat 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 (suprainscriere,


supracatire). Ea este relansabila; fapt ce permite, ca si pentru capcana numarul 11,

183
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 (cand 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
capacatatile 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 incat 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.

184
Unitatea de interfata cu magistrala detine controlul asupra semnalelor care
interfateaza coprocesorul cu CPU. In acest scop se foloseste semnalul BUSY, care se
activeaza cand NEU incepe executia unei noi instructiuni si care se dezactiveaza la
terminarea executiei. Semnalul BUSY este testat de catre CPU la executia instructiunii
WAIT. Cand BUSY este activ CPU suspenda executia programului pina cand
coprocesorul semnaleaza terminarea instructiunii. Acest protocol intre CPU si
coprocesorul aritmetic permite utilizatorului sa poata executa, in paralel cu
coprocesorul, alte sectiuni ale programului. De exemplu, un program poate comanda
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. Cand programul are nevoie de rezultatul operatiei
aritmetice, efectueaza instructiunea WAIT, al carei efect este acela de a stopa
programul pina cand 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 decat cea de efectuare a
operatiei aritmetice de catre coprocesor.

5.11.2. Registre

80287 are opt registre de date, de cate 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 sunt direct adresabile, ca in cazul CPU, ci sunt gestionate


printr-un mecanism de stiva. Deci, ele sunt 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 | |

185
| escape | |
|___________________| |
| |
| |
| |
________|__________ | ___________________
| | | | |
| Executia altor | | | Executia |
| instructiuni | | | instructiunii |
| normale | | | escape |
|___________________| | |___________________|
| | |
| | |
| _________|_________________|
| | |
| | |
___|_________|_____ |
| | |
| WAIT | |
|___________________|

Fig. 5.20. Exemple de prelucrare paralela cu 80287

Cimp calificator
(tag)

79 78 64 63 0 1 0
____________________________________________ _____________
|semn | exponent | mantisa | | |
|_____|________________|_____________________| |_____________|
| | | | | |
|_____|________________|_____________________| |_____________|
| | | | | |
|_____|________________|_____________________| |_____________|
| | | | | |
|_____|________________|_____________________| |_____________|
| | | | | |
|_____|________________|_____________________| |_____________|
| | | | | | |_____|________________|
_____________________| |_____________|
| | | | | |
|_____|________________|_____________________| |_____________|
| | | | | |

186
|_____|________________|_____________________| |_____________|

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 sunt folosite pentru catirea starii coprocesorului si


pentru alegerea diferitelor optiuni de operanzi. Fig. 5.22. ilustreaza aceste registre.
Bitii mai putin semnificativi ai cuvintului de stare sunt fanioane indicand aparitia
unei exceptii, care este facuta cunoscuta CPU prin transmiterea 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 activare 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

187
| |
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 | |
| |
13 |_______|
| |
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)
|_______|

188
| |
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
| |
15 |_______|

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 indicatorul 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 unitate 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).

Cand CPU intilneste o instructiune ESC, codul si operanzii corespunzatori sunt


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 sunt, 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 coprocesorului 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 sunt

189
adresate numai relativ la registrul din virful stivei. Unul din operanzi este
intotdeauna continut 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 constante 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 instructiuni este de tipul push, iar
a doua - din clasa pop. Informatia din ST0 poate fi copiata ca intreg sau real, in
memorie sau registru, fara efectele specifice poeratiei pop, folosind instructiunile FST,
FIST, FBST. Pentru incarcarea in ST0 a constantelor 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. Sunt 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 examinare).

Compararea simpla a numerelor reale se face cu ajutorul instructiunii 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 insotirea de operatia pop.


FTST face exeminarea continutului unui registru operand. Comparatia se face cu
numarul 0 si codurile de conditie sunt inscrise corespunzator rezultatului.

Instructiuni aritmetice

Aici sunt 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 (tangenta) si FPATAN


(arctg). Operandul primei functii este ST0, iar cel al celei de a doua - ST0/ST1. De

190
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 logaritmul este inmultit cu
continutul lui ST1, ceea ce permite obtinerea logaritmului natural sau zecimal prin
incarcarea cu constanta corespunzatoare a lui ST1. In fine, se mai poate calcula 2m-1
(instructiunea F2XM1), cu m memorat in ST0.

Instructiuni de control

In acesta categorie sunt 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 coprocesorul (FINIT).

5.11.4. Exceptii

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

Coprocesorul detecteaza exceptii legate de operatii aritmetice; acestea sunt:

- 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 sunt 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 formatul dorit. Rezultatul este reprezentat in forma nenor-
malizata;

- impartitor nul: exceptia apare cand impartitorul este zero, iar deimpartitul nu este
zero sau infinit. Rezultatul este "set-to-infinity";

191
- operand in format nenormalizat: cel putin unul din operanzi este reprezentat in
forma nenormalizata;

- rezultat imprecis: indicatorul respectiv este inscris cu 1 si exceptia semnalata (daca


nu este marcata) cand rezultatul nu este reprezentat in formatul prescris.

Toate exceptiile listate sunt 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 cati
cuvintul de stare, ce permite identificarea exceptiei.

5.12. 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 sunt
potential sub controlul programului, deoarece CPU poate adresa, la un anumit
moment, numai segmentele ale caror selectoare sunt memorate in cele patru registre
de segment vizibile de catre programator. Acest fapt poate complica, intr-o anumita
masura, gestiunea segmentelor, 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 sunt insotite de un puternic set de teste, implementate prin
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 sunt supuse acelorasi legi de protectie folosite pentru gestiunea taskurilor
si apelarea procedurilor.

Exista o slaba ortogonalitate a organizarii registrelor si setului 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, implementate 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.

192
CAPITOLUL 6
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 sunt 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.

193
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), operand 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 incat sa se pastreze compatibilitatea cu


microprocesoarele din generatiile anterioare. In consecinta, registrele de 16 biti ale

194
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 sunt considerate ca
definind starea unui task, asa ca ele sunt 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

195
| |
|_________________________________| 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 cand 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 sunt folosite in conjunctie cu mecanismele de


gestiune a memoriei si de protectie. Ele nu sunt vizibile programatorului, fiind
manipulate de catre sistemul iAPX 386. Ele constituie partea "invizibila" a registrelor
de segment si sunt 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

Cand 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 sunt 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

196
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 sunt
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 sunt utilizati,in functiile lor sunt descrise in
continuare. PE (protection enable): foloseste la activarea modului protejat de
functionare (PE = 1). Cand 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)


cand 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 cand are loc o comutare de
taskuri. Acest fapt permite salvarea completa a contextului unui task incluzind si pe
cel al procesorului matematic) atunci cand 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.

197
Registrul CR3 contine adresa fizica baza in tabelul cu directorul de pagini (page
directory table). Intrucat paginile au dimensiuni de 4 Ko (2 12), 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 sunt accesibile (DR4 si DR5 sunt
rezervate pentru dezvoltari ulterioare). DR0, DR1, DR2, DR3 contin adrese de
intrerupere a executiei, iar DR6 (breakpoint status) furnizeaza informatii de stare.
Aceste registre sunt 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 intrerupe-
rea :executia unei instructiuni (instruction execution only), inscrierea unei informatii
(data write only) sau catirea / 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
sunt 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

198
cu un numar de biti mai mare de 32. In continuare sunt 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 (2 32);
- 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, cate una in cate 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 incat 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 sunt suntetizate in Tabelul
6.1.

Tabelul 6.1. Moduri de adresare in sistemul iAPX 386


______________________________________________________________
Tip Denumirea Intel Adresare
______________________________________________________________

199
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, cat 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 suntetic, 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 micro-
procesorului.

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 sunt permise doar programelor
cu numar de privilegii (CPL) adecvat.

200
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 sunt necesare instructiuni speciale: LDS si


LES incarca registrele PS si, respectiv, ES, cu cate 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 sunt disponibile instructiunile ADP (adunare
obisnuita) ADC (adunare cu transport) sau INC (adunare cu 1). Scaderea se poate face
in mod normal (SUB), implicand 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. Catul 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 sunt
necesare si operatii de ajustare, care iau in consideratie transportul/imprumutul
rezultat din cifrele BCD cel mai putin semnificative. Pentru ajustare sunt folosite

201
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. Sunt
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 cand programatorul indica
in mod explicat 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
cand continutul registrului ECX devine zero. Exista si alte prefixe, care se folosesc cu
unele instructiuni de comparare; ele permit oprirea repetarii fie cand continutul lui
CX devine zero, fie cand conditia indicata de prefix nu mai este respectata. Pentru
exemplificare, se poate cata :

202
REPZ - repetitia are loc atita timp cat ZF=1 sau ECX <> 0

REPNZ - repetitia are loc atita timp cat ZF=0 sau ECX <> 0

Prefixele de repetare permit programatorului sa obtina operatii cu siruri, incarcand 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


catire-modificare-inscriere in structuri multiprocesor. Pe durata executiei instructiunii
prefixate cu LOCK semnalul hardware exterior LOCK este activ; pe durata cat 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
cand codul privilegiului programului nu este mai mare decat cimpul IOPL din regis-
trul 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 sunt 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 sunt
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 sunt adaptati rezultatului compararii. Prefixul

203
REPE permite evidentierea primei neconcordante intre elementele corespondente ale
celor doua siruri, deoarece operatia de comparare inceteaza cand s-a detectat prima
inegalitate sau cand 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 cand continutul contorului ECX devine
zero. Daca se utilizeaza prefixul REPE,instructiunea permite depistarea primei necon-
cordante 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:intrucat 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
sunt 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. Cand testul esueaza se activeaza TRAP 5. Tot pentru
tratarea structurilor matriciale de date sunt 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

204
scaderii ipotetice a celor doi operanzi. Instructiunea CMP se foloseste atit pentru
operanzii cu semn, cat si pentru cei fara semn, deoarece limbajul de asamblare studiat
contine instructiuni de salt conditionat referitoare la rezultatul testarii atit a
argumentelor cu semn, cat 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 cand 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
sunt echivalente) si LOOPNE sau LOOPNZ (si aceste doua instructiuni sunt
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 sunt


doar de forma neconditionata CALL, RET. Instructiunea RET poate fi insotita si de un
parametru, specificand numarul par de octeti care trebuie scosi din stiva inainte de
returnarea controlului. In acest mod se pot elimina parametrii inscrisi in stiva atunci
cand s-a apelat procedura.

Direct legate de utilizarea procedurilor limbajul mai dispune de doua instructiuni,


ENTER si LEAVE. Ele sunt 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, sunt 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.

205
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 sunt privilegiate. Se pot cata


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) decat
de acele programe pentru care nivelul privilegiului nu este mai mare decat 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 sunt 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,

206
VERW, instructiuni ce permit verificarea posibilitatii de a cati, 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
cand linia BUSY se dezactiveaza. Cum WAIT si BUSY sunt 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 sunt, 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.

207
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 cate 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.

Cand 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, sunt urmatoarele:

a) segmentele de date sunt 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 cand
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 sunt 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;

208
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.

Cand 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 sunt supuse altor mecanisme
de testare, asa cum s-a vazut pentru sistemul iAPX 286.

Programele mai putin fiabile pot apela rutine mai privilegiate, transferandu-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;


- sunt 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 sunt guvernate de aceleasi


reguli ca instructiunea CALL;

209
- segmentele de cod conforme sunt 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 sunt similare modului de


tratare in cadrul sistemului iAPX 286. Particularitatile sunt 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 sunt 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
sunt 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 cate 32 biti, indicand 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

210
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 sunt 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. Suntetic, 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 cand R/W = 0 permite doar citirea
paginii referite.

Fig. 6.4 Mecanismul de paginare utilizat in sistemul iAPX 386

31 12 11 9 876543 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 876543 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

211
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 sunt 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 sunt, potential, sub
controlul programului (CPU poate adresa, la un anumit moment, numai segmentele
ale caror selectoare sunt 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, intrucat ne aflam inca departe de
conceperea si realizarea acelor programe de inteligenta artificiala care sa se substituie
programatorului.

212
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 sunt 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).

213

S-ar putea să vă placă și