Sunteți pe pagina 1din 91

Alex Mihăilă, 432B

Microcontrolere – 2016

MICROCONTROLER = circuit integrat care contine in aceeasi capsula, pe langa


procesor si memorii RAM si ROM, si circuite I/O specializate de tip porturi paralele, porturi
seriale, canale (circuite care gestioneaza logica de intrerupere) .

Pentru stocarea de informatii ce se mentin si dupa disparitia tensiunii de alimentare


au aparut si circuite ce sunt prevazute cu locatii de memorie EEPROM, cu stergere
electrica.

Diversitatea si multitudinea de periferice obtinute il fac apt pentru controlul


diverselor aplicatii, practic cu un astfel de circuit este posibila realizarea unui intreg
microsistem de calcul. Firmele notorii producatoare de microcontrolere: INTEL,
MOTOROLA, MICROCHIP, PHILIPS, ZILOG, ATMEL.

SoC: Sytem on a Chip : sistem pe un singur cip.


Respectivul sistem este realizat de fel dintr-un: UCP, oscilator cu cuart, 4 porturi I/O
pe cate un octet, 4 KB de memorie ROM, 128 B de memorie RAM, 1 port serial, 2
numaratoare(timere) de 16 biti si un controler de intreruperi.

Cursul va avea in vedere microcontrolerul Intel 8051, dezvoltat in 1980, cu o


arhitectura non-Von Nuemann si cu multe caracteristici de tip RISC.

Organizarea Memoriei
Intel 8051 are memoriile separate fizic : memoria de program si memoria de date.
Acest aspect poarta denumirea de arhitectura Harvard (stocarea separata a instructiunilor
si datelor=>2 magistrale care lucreaza in paralel: de date si de adrese).

1) Memoria de program :

- nu depaseste 64 kB(harta memoriei);


- este de tip ROM sau EEPROM;
- magistrala de adrese nu depaseste 2 B;
- de regula, pe cip, se afla ca parte integrata in nucleu 4kB, 8 kB sau 16 kB de program de
memorie interna, restul fiind externa (desi exista variante si cu toata memoria externa);
- validarea se face cu PSEN (Program Store Enable) : in ciclurile de citire din memoria
externa acesta se activeaza de 2 ori pe cicluri, el nu se activeaza atunci cand se executa un

1
Alex Mihăilă, 432B

program din memoria interna de program si nici in ciclurile care sa transfere date, cu
memorie externa de date;
- dupa instructiunea RESET, numaratorul PC se initializeaza cu 0;
- avem cateva locatii de memorie cu functii predeterminate, locatii de memorie rezervate,
iar acestea sunt:
a) initializare programe: 0000H÷0002H

b) vector de intrerupere tip 0: 0003H÷000AH

c) timer 0: 000BH

d) vector de intrerupere tip 1: 0013H÷001AH

e) timer 1: 001BH

2) Memoria de date :

Se imparte intr-o memorie externa de date:

- de 64 kB;
- accesata cu magistrala de date si adrese prin intermediul porturilor 0 si 2;
- validarea se face cu ajutorul semnalelor RD si WR;
- magistrala de adrese poate avea numai 1 B sau 2 B;
sintr-o memorie interna de date:
- accesate pe adrese de 1 B;
- capacitate de 128 B si impartita in 3 blocuri, accesibile pe adrese de 8 biti:
a) LOWER 128,

b) UPPER 128,

c) SFR Space.

Obs: b) si c), desi folosesc moduri de adresare diferite, ele impart acelasi spatiu de
adrese. SFR- Special Functions Registers.

2
Alex Mihăilă, 432B

*UPPER 128 - nu e implementata in 8051 clasic; este adresabila indirect prin registru la
variantele la care e implementata ; poate gazdui o stiva fiindca stiva este o zona de memorie
adresabila indirect, prin SP (desi putem si-n LOWER 128, dar in zona asta o gazduim de fel );
totodata acesta si SFR Space sunt fizic separate si adresate cu moduri de adresare diferite!

*LOWER 128 – accesibil si direct si indirect; aici avem deja caracteristici specifice de
microcontroler:

1. registrele generale sunt mapate in memorie : sunt de fapt locatii de memorie (32 de locatii,
primele 32 din memoria interna de date, de la 00H la 1FH), 4 bancuri grupate a cate 8 registre
(fiecare de culoare diferita), notate R0- R7;

2. o zona mica de 16 octeti, adresabil bit cu bit (putem reseta fiecare bit, dar mai ales oricare
din acesti biti poate fi conditie pentru un salt); aceasta zona poarta denumirea de BITMAP, iar
restul va fi memorie de date (Scratch pad area).

3
Alex Mihăilă, 432B

Memoria de date externa poate fi accesata doar prin intermediul instructiunii MOV X care
foloseste adresare indirecta, adresa de 16 biti si atunci va fi folosit registrul DPTR (Data Pointer
Register) pentru a genera adresa, dar pot fi folosite si adrese pe 8 biti – atunci va fi folosit R1.

Cazul 2 este util atunci cand memoria externa de date este de 256 octeti, avantajul este
dublu, este mai rapid si poate fi realizat mai repede de instructiuni pe 8b si raman linii libere ale
portului 2, care pot fi folosite in alte scopuri.

Aici registrele fac parte din harta memoriei ! (caracteristica tipica de microcontroler).
Zona acesibila pe bit este o caracteristica tipica de microcontroler (seta, reseta, oricare dintre cei
16 biti de acolo, sau oricare bit de acolo poate fi o conditie de salt).

4
Alex Mihăilă, 432B

Registrele
Avem 32 de registre generale, multifunctionale, nededicate, fara functii implicite (tipic
RISC), grupate in 4 seturi de lucru. Aceste registre generale vor fi considerate registre logice
(ele sunt mapate, pot fi translatate in cate 4 registre fizice). Fiecare set de lucru contine 8 registre
logice notate R0...R7.

Dar, avand doar 8 registre in setul de lucru, nu pare o caracteristica tipic RISC, insa,
faptul ca aceste registre sunt multifunctionale si, in general vorbind, fara functii dedicate, dar,
mai cu seama ca am mai multe seturi de lucru, n-avem ferestre, si ca trecerea de la un program la
altul se poate face trecand de la un set de lucru la altul=> n-avem nevoie sa salvam continutul
registrelor, deci e tipic RISC !!!

Registrele sunt toate, cu exceptia unuia (DPTR), pe 8 biti. Numaratorul de program nu ne


intereseaza, este ascuns.

Pe de alta parte avem o zona in memorie unde sunt mapate cateva registre speciale, SFR
(Setul de registre speciale) -->registre interne dedicate, adresabile in mod direct, iar adreselor
lor se afla in zona de adresare 80H – FFH, iar registrele ale caror adrese se termina in 0 sau 8 pot
fi adresate si la nivel de bit; registrele din aceasta zona sunt fizice.

 B = un registru cu rol predeterminat in instructiuni de inmultire si impartire; pentru


celelalte instructiuni el poate fi utilizat cu registrele generale; se mai numeste si registru
de extensie acumulator;
 ACC = registru acumulator ; existenta acumulatorului denota apartenenta CISC;
 PSW = program status word; de fapt registrul de fanioane / registrul de stare; este atribut
de arhitectura ; contine indicatorii de conditie cu urmatoarea structura:

CX AC FU RS1 RS0 OV - P
7 6 5 4 3 2 1 0

0- paritate (in acumulator);


1- indicator la dispozitia utilizatorului;
2- indicator de depasire;
3 si 4 - permit selectarea blocurilor 0-3 din memoria interna RAM dupa relatiile : 00 (bloc 0); 01
(bloc 1); 10 (bloc 2); 11 (bloc 3).
5- indicator la dispozitia utilizatorului, dar nu poate fi definit explicit;
6- transport auxiliar folosit in operatii BCD (binar codificat zecimal)
7- indicator de transport.
 SP = indicator de stiva; el este incrementat inaintea unei depuneri in stiva prin intermediul
instructiunilor CALL si PUSH . Dupa initializare, el este incarcat cu valoarea 07H, deci
stiva incepe de la 08H ; poate fi incarcat in program cu orice valoare;

 IP = registru de control, prioritati intrerupere;


5
Alex Mihăilă, 432B

 IE = registru de control, validarea intreruperii;

 SCON = registru de control serial;

 SBUF = buffer de date seriale folosit la transferul serie; fizic este alcatuit din 2 registre (
unul pentru receptie si unul pentru transmisie);

 TCON = registru de control pentru Timer (numarator);

 PCON = registrul de control al alimentarii;

 TMOD = registru de control al modului Timer;

 TH0, TL0 = 2 numaratoare pe cate 8 biti care alcatuiesc impreuna un numarator pe 16 biti
pentru Timer-ul 0;

 TH1, TL1 = ... pentru Timer-ul 1;

 P0,...P3 = registre ce corespund porturilor 0-3. Daca un port este iesire si se scrie 1 sau 0
intr-un RUN din registrele P0-P3, terminalul corespunzator al portului va avea nivelul
logic 1 sau 0;

 DPTR = data pointer register; unicul registru de 16 biti, folosit la adresarea indirecta a
unei locatii din memoria externa, accesibil si pe jumatati: DPH, DPL;

OBS: -2 dintre registre (R0 si R1) pot fi pointeri, nu toate, fiind constransa de structura;
-saltul de la un registru la altul se face cu ajutorul unui pointer !

6
Alex Mihăilă, 432B

7
Alex Mihăilă, 432B

Modurile de adresare
1. Adresarea directa : In acest caz adresa completa are 8 biti in formatul instructiunilor
curente; are un format compact specific microprocesoarelor RISC. Se poate utiliza atat pentru
memorii de date interne LOWER 128 ( nu si pentru UPPER 128), cat si pentru registre SFR.

2. Adresarea indirecta : Singurul mod de adresare in care avem adrese pe 16 biti, se pot accesa
256 biti de memorie interna de date (atat LOWER 128, cat si UPPER 128) sau 64 kb de
memorie externa.

Pentru adrese pe 8 biti se pot folosi registrele R0, R1 din LOWER 128 sau SP din SFR.
Pentru 16 biti se foloseste doar DPTR pentru memoria externa (din SFR).

DECI: SP, DPTR, R0, R1 sunt registrele prin care se face respectiva adresare !

3. Adresarea implicita (in registru) : Datele sunt accesate in unul din cele 8 registre din setul
de lucru. Selectia registrului vizat se face cu 3 biti chiar in codul instructiunii.

Anumite instructiuni se refera la anumite registre (acumulator sau pointer de date DPTR).
Selectia registrelor se face chiar in codul instructiunilor.

4. Adresarea imediata : O constanta care se afla in formatul instructiunii curente, imediat dupa
cod; poate fi pe 8b sau 16b .

5. Adresarea indexata : Se foloseste doar pentru memoria de program si pentru salturi(


registrul ACC contine deplasamentul); folosita si pentru tabelele de translatare cu DPTR sau PC
ca baza si ACC ca intrare in tabel.

6. Adresarea relativa: Se foloseste doar pentru memoria de program; aria de memorie pentru
salt este de la -128B la +127B relativ la primul octet dupa instructiune.

 Primele 4 moduri de adresare sunt pentru date, iar ultimele 2 pentru instructiuni.
 Primele 3 moduri de adresare opereaza in memoria de date, ultimele 3 in memoria
de program.

8
Alex Mihăilă, 432B

Setul de instructiuni
Este redus, avem putine instructiuni care sunt simple ( nu sunt compuse), tipic RISC.

1. Instructiuni aritmetice

Presupun utilizarea ACC; singurele operatii complexe in cadrul instructiunilor aritmetice


sunt cele de inmultire si impartire, unde se dubleaza acumulatorul ACC ( cu registrul extensie
acumulator B); de asemenea de precizat este ca respectivele operatii sunt cablate (bloc dedicat).

OBS: unde nu apare operandul „s” n-avem moduri de adresare !

Din punct de vedere al operatiilor aritmetice, acest procesor nu e RISC, ci CISC!


(foloseste acumulator si foloseste operanzi din memorie).

9
Alex Mihăilă, 432B

2. Instructiuni logice

Mai utilizate decat cele artimetice. ACC nu e folosit ca la i8086 direct in instructiuni, el
este un registru de lucru normal.

Nu se poate folosi orice mod de adresare pentru operandul „s” . Daca folosim sursa ca
acumulator este greu de realizat hard (cost de implementare si moduri de adresare restrictive ).

RL, RLC, RR, RRC sunt de fapt impartirea si inmultirea cu 2 (adresare imediata in
memoria de program).

10
Alex Mihăilă, 432B

3. Transferurile de date cu memoria interna

Ele se executa cu memoria interna UPPER 128 si LOWER 128, dar nu si cu SFR. Pentru
a folosi si DPTR avem o instructiune speciala de 16 biti (a 4-a din tabelul de mai jos) care
incarca in pointerul de date o adresa de 16 biti adresabila imediat.

Din punct de vedere al transferurilor de date, Intel 8051 sunt de clasa B (transfer memorii-
>registre sau memorie>porturi).

Adresarea in stiva se face indirect prin registrul SP si stiva creste in sus, LIFO, (a 2-a
abatere fata de i8086 unde acolo crestea in jos). Cum accesarea stivei se face cu adresarea
indirecta prin indicatorul de stiva = > stiva poate ajunge in LOWER 128 si in UPPER 128 daca
exista, dar nu si-n setul de registre speciale SFR. De asemenea, transferul in si din stiva se face
pe 8 biti, nu 16 cum e la Intel 8086 !

PUSH s;
(SP) ←(SP) + 1;
((SP)) ← (s)
POP d ;
(d) ← ((SP));
(SP) ← (SP) – 1;

Alt aspect: memoria externa se acceseaza doar cu MOVX !

11
Alex Mihăilă, 432B

4. Transferurile de date cu memoria externa

Toate instructiunile folosesc adresarea indirecta si acumulatori, deci microprocesoarele


sunt de clasa A.

Primele 2 instructiuni se folosesc pe 8 biti, iar urmatoarele 2 pe 16 biti. Folosirea lui


DPTR impune utilizarea celor 8 biti ai PORT 2 ca magistrala de adrese.

5. Citire din tabele de translatare in memoria de program (LOOKUP TABLES)

Aceste instructiuni se folosesc doar pentru conversiile intre tabele; ele se mai numesc si
instructiuni de conversie / translatare. Folosesc doar modul de adresare imediata !

12
Alex Mihăilă, 432B

6. Instructiuni pe bit

Caracteristica tipic de microcontroler ! (permite decizii in functie de bit!)

Instructiunile pe bit acceseaza un bit si formeaza 2 clase de informatii. Bitul accesat /


folosit poate fi setat sau resetat in functie de instructiune. Bitii sunt adresati in LOWER 128 si
SFR.

Fanionul de transport ( CY) face parte din PSW deoarece bitii sunt adresati doar in
LOWER 128 si SFR, avem adresare directa.

Salturile se fac cu adresare relativa -128 la +127B in memoria de program fata de pozitia
instructiunii curente.

13
Alex Mihăilă, 432B

7. Salturile

Procesoarele difera prin complexitatea testelor, salturilor si combinatiilor posibile intre


teste si salturi; in cazul nostru n-are decat salturi simple !

Salturile sunt instructiuni de control; din punct de vedere al structurii exista 2 tipuri de
salturi si anume salturi propriu-zise si apeluri de subprograme (nu exista transfer de parametrii).

Primele 6 sunt salturi neconditionate, iar urmatoarele sunt salturi conditionate. Toate
salturile conditionate folosesc adresarea relativa.

A 2-a instructiune realizeaza un salt indirect la o adresa calculata in timpul executiei


programului.

JMP – mnemonic genral folosit pentru urmatoarele:

a) SJMP – face salt cu adresare relativa, avand un format pe 2B (Short Jump); destinatia este
specificata ca o adresa relativa fata de valoarea curenta a PC codificata in al doilea octet al
instructiunii; plaja in care poate avea loc saltul este de +127, -128 fata de valoarea curenta a PC;

b) LJMP – face un salt cu adresare directa si format pe 3B (Long Jump); codifica adresa de salt
pe 16 biti in octetii 2 si 3 ai instructiunii, deci destinatia saltului poate fi oriunde in spatiul total
de 64kB al memoriei de program;

c) AJMP – face salt cu adresare directa cu o constanta pe 11 biti si are format de 2B (Absolut
Jump); adresa de salt e codificata cu 3 biti (de la 8 la 10) in octetul care contine si codul
instructiunii +8 biti (de la 0 la 7) intr-un octet suplimentar, iar bitii cei mai semnificativi ai
adresei (de la 11 la 15) se iau din valoarea contorului de program.
14
Alex Mihăilă, 432B

RETI – fata de RET activeaza si intreruperile ;

DJNZ – este ciclu cu contor, „s” se foloseste drept contor .

*Pentru instructiunea CALL :

a) ACALL – Absolute CALL

b) LCALL - Long CALL

Ambele incrementeaza PC pana la adresa urmatoarei instructiuni si salveaza in stiva


aceasta valoare care va reprezenta adresa de intoarcere !

Desfasurarea in timp a instructiunilor


Din punct de vedere al desfasurarii in timp a instructiunilor, Intel 8051 functioneaza ca un
microprocesor de tip RISC deoarece avem uniformitatea desfasurarii in timp a instructiunilor.

Un ciclu masina are 6 stari, fiecare stare are 2 perioade de tact (pentru sincronizarea unor
actiuni elementare din cadrul fiecarei stari), deci fiecare ciclu masina are 12 perioade de TACT.

In general instructiunile dureaza 1 ciclu masina. In starile S1 si S4 din ciclul masina are
loc cate un ciclu de FETCH intalnit la INTEL 8086.

Instructiunea MOVX, ce transfera un octet intre acumulator si memoria externa de date,


necesita 2 cicluri masina; in acest caz nu mai exista ciclu de FETCH in carul celui de-al doilea
ciclu masina.

15
Alex Mihăilă, 432B

Gestionarea Memoriei
A. Memoria virtuala: compusa din 2 subdivizini logice: segmente
(SEGMENTAREA) si pagini (PAGINAREA).
„Segmentarea” si „Paginarea” memoriei virtuale pot fi mecanisme distincte, de
sine statatoare, sau pot coexista.
Bazele principiului gestionarii memoriei apar in mecanismul segmentarii memoriei
microcalculatorului, in subdiviziuni logice numite segmente , iar in interiorul lor adresarea este
liniara. Orice localizare in memorie se face relativ la baza segmentului, iar fixarea fizica a bazei
unui segment este transparenta utilizatorului.

Conceptul nou care apare la microprocesoarele evoluate este acela al realizarii unei
memorii virtuale. Exista 3 principii fundamentale pe care se bazeaza gestionarea unei memorii
virtuale. Deci, SEGMENTAREA:

1. Segmentele sunt de dimensiuni variabile, strict izolate ( exista si la microcontrolerele de acum


segmente care au 2 deosebiri fundamentale: nu mai sunt fixe, nu mai risipesc memorie, si nu se
suprapun, au o protectie sporita) . Astfel, un dezavantaj major al segmentarii deja discutat
dispare (in acel caz risipeam memorie, in acest caz mulam memoria exact pe dimensiunea sirului
de date ce-l dorim procesat).

2. Segmentele sunt inzestrate cu proprietati care permit personalizarea segmentelor si protectia


informatiei din segmente. Informatia acum este incapsulata !

3. Segmentele pot fi mutate intre memoria interna (fizica) si memoria externa . Memoria virtuala
este de regula mult mai mare decat memoria fizica; orice poate face parte din memoria virtuala,
iar granitele fizice devin transparente (Memory Swaping).

Memoria virtuala reprezinta totalitatea hartilor logice de memorie, ce poate fi formata


prin concatenarea numarului maxim de segmente ce pot fi definite, fiecare presupus la
dimensiunea maxima. Fizic, memoria virtuala se gaseste peste tot unde informatia poate fi
stocata. Ea cuprinde totalitatea resurselor de memorie ale microcalculatorului (interne si
externe), limitele fizice fiind transparente utilizatorului. Gestionarea memoriei reprezinta
mecanismul de translatare din AL ( adresele logice) -->AF (adrese fizice) la microprocesor, si
din adrese virtuale (AV) --> adrese fizice (AF).

Organizarea Liniara (Fizic) Organizarea Segmentata (Logic)

Acces continuu in memorie Memorie divizata in segmente


Spatiul adreselor de la 0 la 2^n-1 (n linii de In interiorul segmentelor, adresarea este
adresare) liniara, relativa la baza segmentului
Adresa fizica este la dispozitia utilizatorului Adresa fizica este transparenta utilizatorului
AF este atribut de arhitectura! AF NU este atribut de arhitectura !
16
Alex Mihăilă, 432B

Gestionarea memoriei bazata pe principiile segmentarii incurajeaza alte concepte precum:

a) multiprocesarea (realizata la nivel de program sau instructiune);

b) protectia proceselor a caror izolare rezulta in mod natural prin definirea segmentelor si a
atributelor acestora, precum si interschimbarea locurilor proceselor intre memoria interna si
memoria externa.

La i8086, modului real ii corespunde modului virtual sau mod protejat (real - > notiunea
de segment, adresare liniara, iar virtual -> se formeaza memoria virtuala ce trebuie gestionata).

Alternativ avem : PAGINAREA

Principiile paginarii memoriei virtuale sunt:

1. Paginile sunt fixe ca dimensiuni, dar riguros concatenate in memorie, una dupa alta (analogic
cu o carte!).

2. De asemenea au si ele proprietati de securizare asupra informatiei continute.

3. Paginile pot fi mutate intre memoria interna ( fizica) si cea externa (Page Swaping).

Din aceasta alternativa putem deduce urmatoarea definitei pentru memoria virtuala:

Totalitatea hartii logice a memoriei care poate fi formata prin oncatenarea numarului
total de pagini.

Daca „Segmentarea” si „Paginarea” coexista, paginile sunt, de regula, subdiviziuni ale


segmentelor.

Ca fapt, INTEL are 2 tipuri de pagini, ARM are 4 !

17
Alex Mihăilă, 432B

 EXEMPLU de SEGMENTARE a memoriei virtuale (16 biti):

*Un procesor poate avea ambele metode de gestionare. De pilda, INTEL le contine pe
amandoua, ARM are doar Paginarea!

*Unele procesoare organizeaza memoria pe cip, ori procesor extern. De pilda, INTEL pe
cip, ARM are circuit extern !

i80286 este primul reprezentat din familia INTEL care foloseste microprocesor de
gestionare a memoriei implementat pe cip. Este un procesor pe 16 biti. Memoria lui virtuala are
2 componente : AE si Selector. Adresa virtuala este formata din 4 octeti (adr32).

*AE = OFFSET, adresa efectiva este adresa in interiorul segmentului si utilizatorul trebuie sa o
conceapa ca fiind relativa la baza unui segment predefinit. Este precizata de modul de adresare
aferent tipului de instructiune pe care o adreseaza. Cu aceasta componenta cautam in interiorul
segmentului;

*SELECTORUL = nu mai este adresa segment a 2-a componenta; formata din 2 octeti (adr16);
cu aceasta componenta selectam segmentul; modul de adresare nu mai e direct, ci e indirect !

Un segment poate avea orice marime intre 1B si 64 kB (maximul posibil). Selectorul are
16 biti si este compus din 3 entitati informationale: INDEX= 3 biti; TI = 1 bit (indicator de
tabela), RPL = 2 biti (nivel de privilegiu cerut).

SELECTOR = INDEX ↑ TI ↑ RPL

Pentru identificarea si definirea segmentelor se folosesc numai 14 biti din selector, deci
numarul maxim de segmente este 2^14 = 16kB segmente, iar dimensiunea memoriei virtuale
este:

2^14 segmente * 2^16B/segment = 2^30 B= 1GB

Privilegiul cerut este utilizat de mecanismul privilegiilor multinivel. In mod real


AF=adr24.

In mod real, harta memoriei fizice = 2^24=16MB

18
Alex Mihăilă, 432B

 EXEMPLU de SEGMENTARE a memoriei virtuale (32 biti):

Avem : Intel 386, 486, Pentium, Core.

Acum AV= adr48 => dimeniunea maxima a unui segment = 2^32B=4GB

SELECTOR = adr16; numarul maxim de segmente = 2^14 (16k segmente); doar 14 biti
utilizabili

Dimensiunea memoriei virtuale: 2^14*2^32B/segment=2^46=64TB

Harta memoriei fizice: 2^32B=4GB

si AF= adr32

*In ambele cazuri, 16 biti si 32 biti, observam cateva aspecte importante de retinut:

a) O prima metoda de securitate : TI (table indicator) = >impartirea memoriei virtuale in 2


jumati, si anume TI=0, jumatatea in care accesul este foarte restrictionat si nu se pot modifica,
jumatatea adreselor globale, si TI=1, jumatatea adreselor locale; TI este folosit pentru a
identifica segmentul de lucru;

b) RPL – Requested Privilege Level; un nivel de privilegiu.

Concluzii: NICIODATA nu ajung la segmentul vizat direct !

Plecam de la SELECTOR => DESCRIPTOR = >Segmentul Vizat

19
Alex Mihăilă, 432B

Tabele de Descriptori
Descriptorul contine informatii despre localizarea segmentelor in memoria virtuala,
despre dimensiunea segmentelor si despre propietatile segmentelor (inclusiv cele de
securitate).

Avem:

1) Descriptorii segmentelor

Nu am cum sa ajung la un segment decat printr-un descriptor aferent! Acesti descriptori


permit identificarea segmentelor uzuale de lucru ( de programe si / sau de date).

2) Descriptorii speciali de control : folosite in intregul sistem etc.

a) descriptorii segmentelor de sistem : pentru segmente care sunt folosite de


microprocesor in mecanismul gestionarii memoriei;

b) descriptorii „segmentelor de stare a proceselor” : pentru implementarea


mecanismului multiprocesarii (multitasking);

c) porti care sunt similare cu niste descriptori : porti de intrare in anumite segmente
(analogic cu o incapere, prin care intram printr-o usa etc. ).

EXEMPLU : descriptor de tip x86, de sistem, de translatare.

Intel are descriptorii pe 8 octeti; o tabela de descriptori la INTEL poate avea 2^13 descriptori;
exista 3 clase de informatie in imaginea urmatoare:

20
Alex Mihăilă, 432B

- ROSU: indica prima informatie de care am nevoie ( unde este segmentul ); contine AF a bazei
segmentului vizat ;

- GALBEN: limita, de 16 sau 20 de biti ; dimensiunea relativa la baza a segmentului (cat de de


mare e segmentul); nu iesim inafara segmentului ! (violarea protectiei in caz contrar)

- ALB: acces la cel de-al 6-lea octet, in segmentul vizat.

NIMIC in memorie nu este inafara unui segment . TOTUL se afla in segment,


inclusiv si descriptorii : tabelele de descriptori .

Tabelele de descriptori sunt:

GDT- tabela de descriptori globali; unde gasim descriptori pentru eventualele segmente de
lucru, din spatiul adreselor, dar vom gasi sigur descriptorii pentru segmentele de sistem;

LDT- tabela de descriptori locali, gasim descriptorii cu care lucreaza utilizatorul;

Si GDT si LDT sunt in spatiul adreselor globale, sunt segmente de sistem, protejate
speciale ele asigurand mecanismul de lucru; in LDT avem descriptori pentru spatiul adreselor
locale (segmente de lucru in spatiul adreselor locale); in GDT descriptorii sunt doar pentru
spatiul adreselor globale (segmente de sistem, segmente de lucru).

21
Alex Mihăilă, 432B

Translatarea unei adrese virtuale


Pornim de la o adresa virtuala si trebuie sa ajungem la o adresa fizica! Acest lucru se
efectueaza in 2 pasi:

- gasim subdiviziunea in care avem informatia dorita, segmentul adica;

- gasim informatia dorita, in interiorul segmentului care l-am gasit la pasul 1; la baza
segmentului se aduna offset-ul ;

INDEX: isi ia de undeva baza unui tabel de descriptor, fata de baza indexul ii spune unde se afla
descriptorul (baza-alb), apoi citeste adresa fizica a bazei, apoi limita sa verifice ca nu cumva acel
offset adunat la baza sa depaseasca dimensiunea!

OBS: Target Segment (o zona de memorie in care dorim sa gasim ceva), adresare indirecta;

* idee: Nu are cum sa gaseasca segmentul decat folosind un descriptor ( ori mai multi);
descriptorul este intr-o tabela din memorie deci folosim ADRESARE INDIRECTA CU
MEMORIA !!!

*Esenta Paginarii sau Segmentarii: adresarea indirecta cu memoria;

22
Alex Mihăilă, 432B

Comentariu:

a) intai trebuie sa gasesc subdiviziunea logica in care se gaseste informatia dorita(in cazul
de fata segmentul);

b) se gaseste informatia dorita in interiorul segmentului pe care tocmai l-am gasit ; la


baza segmentului se adauga offset-ul (adresa efectiva).

Translatarea adresei virtuale in adresa fizica in cazul in care informatia vizata se afla in
spatiul adreselor globale

TI=0 – procesorul stie deja ca trebuie sa caute in GDT !

Un registru in care sunt stocate baza si limita GDT-ului: GDT_BASE si GDT_LIMIT.

Din adresa virtuala, mai intai citeste TI ( stie ce tabele de descriptori implica) => ma
intereseaza doar GDT, citeste din registrul aferent unde se afla si ce dimensiunea are, apoi
foloseste INDEX-ul ca sa afle unde sa-l citeasca fata de baza.

23
Alex Mihăilă, 432B

*Descrierea formala a semanticii translatarii virtuale in adresa fizica, in spatiul adreselor


globale, pentru un procesor x86

(CS) | (SS) | (DS) | (ES) [ | (FS) | (GS)] ≡ SELECTOR


SELECTOR ≡ INDEX ↑TI ↑RPL
TI ←0
INDEX ←INDEX * 8
(GDTR) BAZA_GDT ↑ LIMITA_GDT
Octet_0descriptor ← (BAZA_GDT + INDEX)
Se verifică dacă: INDEX ≤LIMITA_GDT
[Octet_6l descriptor ↑] Octet_1descriptor ↑ Octet_0descriptor ≡LIMITA
[Octet_7descriptor ↑] Octet_4descriptor ↑ Octet_3descriptor ↑ Octet_2descriptor ≡BAZA
data | cod_instrucţiune ← (BAZA +AE)
Se verifică dacă: AFdata | cod_instrucţiune ≤BAZA + LIMITA

Comentariu:

- Selectorul se afla in registrele segment;


- Adresa efectiva se afla in formatul instructiunii curente sau intr-un registru (IP/SP);
- Campul Index este preluat si inmultit cu 8 pentru ca sunt pe Intel (informatiile sunt
aliniate, nu pot sa am spatii; alinierile in tabela sunt din 8 in 8);

24
Alex Mihăilă, 432B

Ajungerea in segmentul tinta se face printr-un descriptor gasit in LDT !


Microprocesorul gaseste mai intai GDT (E UNICA, usor de gasit) -> dupa LDT
(selectorul pentru LDT este intr-un registru special – LDTR – selectare pentru diverse tabele –
abia aici foloseste indexul meu ca sa gaseasca descriptorul aferent – citeste dimensiune /
proprietati) -> segmentul tinta (adresa mea efectiva, adunata la baza segmentului proaspat gasit).

observatii:
 indiferent de proces, golosim GDT !
 trecem prin 2 nivele de adresare indirecta cu memoria, astfel dureaza mai mult timp !

25
Alex Mihăilă, 432B

Descrierea formala a semanticii translatarii adr virtuale in fizice in spatiula adreselor locale
pentru un procesor compatibil x86 :

(GDTR) ≡BAZA_GDT ↑ LIMITA_GDT


(LDTR) ≡ SELECTOR_LDT
SELECTOR_LDT ≡INDEX_LDT ↑ TI_LDT ↑ RPL_LDT
TI_LDT ←0
INDEX_LDT ←INDEX_LDT *8
Octet_0LDT ← (BAZA_GDT + INDEX_LDT)
Se verifică dacă: INDEX_LDT ≤ LIMITA_GDT
[Octet_6l LDT ↑] Octet_1LDT ↑ Octet_0LDT ≡LIMITA_LDT
[Octet_7LDT ↑] Octet_4LDT ↑ Octet_3LDT ↑ Octet_2LDT ≡BAZA_LDT
(CS) | (SS) | (DS) | (ES) [ | (FS) | (GS)] ≡SELECTOR
SELECTOR ≡ INDEX ↑ TI ↑ RPL
TI ←1
INDEX ←INDEX* 8
Octet_0descriptor ← (BAZA_LDT + INDEX)
Se verifică dacă: INDEX ≤LIMITA_LDT
[Octet_6l descriptor ↑] Octet_1descriptor ↑ Octet_0descriptor ≡LIMITA
[Octet_7descriptor ↑] Octet_4descriptor ↑ Octet_3descriptor ↑ Octet_2descriptor ≡BAZA
data | cod_instrucţiune ← (BAZA +AE)
Se verifică dacă: AFdata | cod_instrucţiune ≤BAZA + LIMITA

Comentariu:

- Ordinea octetilor este una anume;


- Procedeul este unul general; particularitati sunt unde citesc octeti(pentru ca fiecare
inseamna altceva) si acolo unde inmultesc cu 8 index-ul – datorita alinierii Intel !
- Nu avem voie sa iesim in afara segmentelor!!!!! Asta e doar una dintre verificari

26
Alex Mihăilă, 432B

Modalitati de organizare a proceselor:

Avem 4 situatii de lucru cu memoria virtuala:

a) un utilizator (un sistem incapsulat, embedded) si un proces; putem avea descriptorii de GDT
aici + mai e nevoie de niste descriptori de sistem;

b) un utilizator, mai multe procese : inca nu ne punem problema protectiei intre utilizatori, ori
protejarea soft-ului de baza intre utilizatori...GDT este clar necesara (asigura toti decriptorii
pentru toate segmentele de lucru, dar asigura si multiprocesarea ! );

27
Alex Mihăilă, 432B

c) sistemele cu mai multi utilizatori, cu cate un proces/utilizator : daca am mai multi


utilizatori trebuie sa fim securizati de ceilalti utilizatori si ei la randul lor la fel; folosim mai mult
LDT (mai multi descriptori pentru programe, segmentele de program si de stiva), un LDT
asociat fiecarui proces; dar si GDT exista in continuare (nu putem gestiona intregul sistem fara
GDT!)

d) cazul real: fiecare utilizator poate rula mai multe procese.

Fie 3 utilizatori cu mai multe procese fiecare; GDT in continuare prezent !

- nu exista o corespondenta biunivoca intre procese si LDT !

28
Alex Mihăilă, 432B

Anatomia descriptorului de segment:


Pornim de la exemplul INTEL: de tip a si b1 !

- rosu : pozitia absoluta a segmentului vizat ; adresa fizica a bazei segmentului vizat;
- alb : (cel numit acces e obligatoriu pentru orice Intel) – modelul de la octetul 6
exista pentru procesoarele pe 32 de biti !
- galben : dimensiunea relativa la baza segmentului !

Comentariu:

- ne bazam pe cele 3 principii ale segmentarii discutate la inceput; tot ce vorbim aici se
bazeaza pe ele; (proprietati/securitatea segmentelor etc.);
- translatarea are mereu 2 pasi, pentru ca nimic nu se afla in afara subdivizunilor logice –
segmentele;
- Offset -> informatia in segment; selector-> segmentul; pentru gasirea segmentului
folosim descriptorul corespunzator;
- avand multi descriptori, trebuie cautati in memorie => s-au facut tabelele de segmente
=> trebuie sa trecem CEL PUTIN printr-un descriptor => ilustrarea conceptului de
adresare indirecta!!!!
- Intel aloca pentru orice descriptor – 8 octeti; 8 octeti si pentru paginare => avem nevoie
de pozitia absoluta a tintei, dimensiunea tintei si proprietatile (access – de fapt aici sunt
codificate drepturile de acces in segmentul tinta).

29
Alex Mihăilă, 432B

Legenda:

S P/D : octetul de acces ; camp de 1 bit / 2biti / 4 biti;

Campul verde : cel mai important bit , face deja distinctia dintre 2 clase de descriptori –
dintre tipul a si tipul b1;

Nibble-ul din dreapta : semnificatie speciala (0010 inseamna: atentie, vizezi un LDT,
indiferent ca e pe 16 sau 32 de biti);

Bitul P : inseamna prezent – foarte important – ilustreaza al treilea principiu al


segmentului – arata ca este sau NU in memoria fizica (interna);

la 0 – aduce segmentul vizat in memoria interna; 1- merge mai departe

DPL - un numar intre 0 si 3; fundamental intr-un mecanism de protectie;

P/D - de program sau de date

obs: o stiva in care nu pot scrie, nu e stiva!

C- permite sistemului de operare o exceptie ( inscrie programul intr-un segment si-l


executa) !

A- implementarea unei tehnici LRU (last recent used), utilizat cu memoriile CACHE;
gasesc segmentul cel mai putin accesat si il dau afara; in caz ca nu avem loc (P=0 si nu il poate
aduce).

30
Alex Mihăilă, 432B

altele:

la C : (la 0 = este intrerupere daca P/D=1)


la ED : (la 1 = este intrerupere daca P/D=0)
la R : (la 0 = este intrerupere daca P/D=1)
la W : (la 0 = este intrerupere daca P/D=0)

Respectivul Nibble este doar pentru microprocesoarele de 32 de biti de la INTEL =>


strategie foarte interesanta a inginerilor pentru a prevedea o compatibilitate viitoare!

Punctul forte al acestei familiii de procesoare: COMPATIBLITATEA , D, ( de la 8086


pana la Core-urile curente sunt toate comptabilite), un program pentru 8086 ruleaza si azi!

GRANULARITATE ( G) – cuanta de informatie folosita de microprocesor pentru transferuri


intre memorie si microprocesor – transfer fie pe BYTES sau pe PAGINI;

2^24 maxim octeti sau 2^32 pagini => maxim 4GB

Paginarea la x86 poate sa aiba mai multe granularitati; la Pentium au aparut si pagini de
4MB!

ED = daca e 1(creste in jos) e segment de stiva, daca e 0 (creste in sus) e segment de


date obisnuit !

31
Alex Mihăilă, 432B

Verificarea faptului ca nu iesim in afara segmentului este facuta folosind aceleasi entitati,
indiferent de modul in care o sa creasca stiva!

CONLUZII

 BAZA şi LIMITA localizează şi definesc mărimea segmentului; ED reglementează


modul în care se interpretează LIMITA;
 P şi A asistă sistemul de operare la schimbul informaţiei între memoria internă şi externă;
 S indică tipul se segment vizat: de sistem (LDT), de date, de program;
 R şi W definesc modul de acces al informaţiei în segmente – protecţie;
 DPL şi C asigură protecţia conform mecanismului privilegiilor multi-nivel.

Indiferent de familia de microprocesoare, ne asteptam ca un descriptor sa contina pozitia


absoluta a segmentului in memorie si dimensiunea acestuia (care, am aflat acum, depinde si de
granularitate !).
Dimensiunea este extrem de necesara de a fi precizata in descriptor pentru ca se face de catre
microprocesor verificarea absolut obligatorie => CA NU intentionez din greseala / in special sa
ies in afara granitelor segmentului vizat.
Alta informatie absolut necesara -> sa se arate daca segmentul este disponibil este sau NU
in memoria interna; microprocesorul are nevoie sa gaseasca FIZIC in memoria interna
informatia dorita; daca nu e, trebuie sa o aduca, eventual folosind informatii suplimentare gasite
tot in descriptor!
Legat de protectie: microprocesorul este informat de tipul de segment tinta – in functie de
acesta, are drepturi de acces diferite (FOARTE IMPORTANT);
PRIORITATE: Date de sistem > Stiva > Date de lucru.

*Pozitie absoluta -> Dimensiune (depinde de granularitate) -> Disponibilitate SAU NU in


memorie interna -> Informatii despre drepturile de acces / protectie (tipul de informatii /
drepturile utilizatorilor).

32
Alex Mihăilă, 432B

Registre cache folosite în mecanismul segmentării :

Mecanismele care ignora/ scurteaza mecanismul segmentarii au ca rezolvare registrele


cache !
Cache (in cazul nostru) – hidden (ascuns) – REGISTRE CARE NU SUNT ATRIBUTE
DE ARHITECTURA !
Respectivele registre sunt asociate NUMAI cu registrele in care pot stoca selectoare!
(doar ele au extensie CACHE) .
*LDTR – poate stoca selectoare - are cache;
*GDTR – nu are selectoare - NU are cache;

Mecanismul este foarte simplu:


Pas 1: Se parcurge intregul mecanism al translatarii din capitolul precedent -> cand ajungem la
ultimul descriptor din lantul de translatie; o data cu identificarea segmentului tinta, informatia
din descriptor este copiata in registrul cache aferent registrului care contine selectorul;
Pas 2: Orice acces ulterior in acelasi segment nu mai parcurge intreg lant al translatarii ci preia
informatiile despre segmentul tinta din registrul cache -> VITEZA MAXIMA;

Daca se trece la alt segment -> registrul cache este golit si se repeta pasii; cand se ajunge
la ultimul descriptor, noua informatie din noul descriptor este copiata in registrul cache.

Observatii:
 Accesul intra - segment este MULT mai des decat inter-segment!!!!!
 Pe parcursul translatarii am mai multi descriptori; ce conteaza intotdeauna este ultimul din
lant

33
Alex Mihăilă, 432B

Registrele CACHE aferente microprocesoarelor de 32 de biti:

34
Alex Mihăilă, 432B

Mecanismul paginarii : mecanism alternativ de gestionare a memoriei foarte


folosit !
Cele mai importante familii de procesoare o folosesc; insasi notiunea de „embedded
systems” trebuie redefinita, intrucat ele pot acum gestiona memoria mai eficient, folosi
paginarea, memoriile cache, multiprocesarea = > extrem de puternice si le putem considera
sisteme cu resurse definite, nu limitate!

Exemplul pentru familia x86, unde paginarea coexista cu segmentarea doar pentru
procesoarele de 32 de biti, sau 64 biti, iar segmentele sunt divizate in pagini;

Exemplu de paginare a segmentelor în memoria virtuală :

- o data stabilita granularitatea ea se pastreaza; pozitiile paginilor sunt pastrate; sunt DOAR
una dupa alta;
- paginarea si segmentarea pot sa fie separate sau pot sa co-existe si sa se ajute reciproc.

Paginarea e cu linie punctata pentru ca poate sa existe sau nu; daca exista => adresa
furnizata este numita adresa liniara iar mecanismul paginarii o transforma in adresa fizica.

35
Alex Mihăilă, 432B

Paginarea cu 2 nivele

Trebuie sa parcurg cele 2 etape:


1. Trebuie sa gasesc pagina in care este informatia;
2. Apoi sa gasesc informatia, in pagina gasita anterior;
Ca sa ajunga la informatie, in adresa liniara (totusi adresa virtuala, doar un alt tip) – exista
intotdeauna campuri – fiecare cu semnificatia si lungimea lui; in cazul de fata avem un camp
care permite sa gaseasca informatia in cadrul paginii – offset.
Dupa, microprocesorul trebuie sa ajunga sa gaseasca pagina in care se afla informatia; Pagina
musai trebuie sa fie descrisa! => are nevoie de macar UN DESCRIPTOR , ei aflati in memorie
in structuri similare => o consecinta logica este adresarea indirecta cu memoria, aceeasi idee
fundamentala ca si la segmentare; fiindca sunt 2 nivele => am nevoie de o tabela de descriptori
ca sa gasesc pagina si inca o tabela sa gasesc informatia !
I. Tabela de pagini – descriptorii pentru toate tabele de pagini;
II. Directori de tabele de pagini – toate tabelele de pagini;
(cam aceleasi lucruri cu GDT si LDT)
36
Alex Mihăilă, 432B

!!!Mai am nevoie de un INDEX ca sa gasesc in pagina informatia => numiti de Intel : tabela,
director, offset .
a) DIRECTOR este un câmp de 10 biţi. Aceştia, concatenaţi cu 00, formează adresa
relativă la bază a elementului vizat din director. Concatenarea cu 00 este normală
pentru că un element are 4 B, deci informaţia este "aliniată" din 4B în 4B;

b) TABELA este un câmp de 10 biţi. Tot prin concatenare cu 00 formează adresa


relativă la bază a elementului selectat dintr-o tabelă a paginilor;

c) OFFSET este un câmp de 12 biţi care localizează informaţia în pagina selectată.


Evident şi această adresă este relativă la adresa fizică a bazei paginii.

 Ca si la GDT, pozitia directorului care e unul singur -> inauntrul procesorului; in el gasesc
adresa fizica a bazei directorului tabelei de pagini;
 Din descriptor citeste informatia ca sa citeasca tabela de pagini vizate – pozitia,
proprietati, etc.
 Dupa ce a gasit tabela de pagini, foloseste TABLE ca sa gaseasca un descriptor pentru
pagina vizata; de aici microprocesorul citeste informatiile despre pagina vizata => gaseste
ceea ce cauta !

*Pagina standard pentru Intel, pe care o cauta uP de obicei -> 4kB (si ARM are) -> offsetul
este de 12 biti=> 2^12 =4kB
Raman 20 de biti de impartit intre cele 2 campuri -> Intel a ales sa ramana egale(chiar daca
pot fi si altfel) -> directorul si tabele vor avea dimensiuni egale -> avem parte de o uniformizare
=> 2^10 descriptori posibili de gasit; ne-ar mai trebui sa stim cati octeti ocupa un descriptor;
Intel a decis ca acestia sunt suficient de mari cu 4B.
INFORMATIA ESTE ALINIATA DIN 4 IN 4, acum !

Comentariu pe scurt:

Ca sa gasesca pagina cauta un descriptor, intr-o tabela de descriptori !!! – foloseste index-
ul pentru asta; Ca sa gaseasca tabela de pagini procesorul se uita intr-un director de tabele
(inaccesibil utilizatorului) .

Procesorul cauta adresa fizica a bazei diretorului de tabele, il gaseste, in interiorul


directorului de tabela, folosind un index; gaseste un descriptor ==> citeste adresa fizica a bazei
unei tabele de pagini, in care tabela folosim celalalt index => gaseste un decriptor din care
citeste intre altele adresa fizica a paginei vizate, iar in pagina informatia gasita: offset+adresa
efectiva la baza.

37
Alex Mihăilă, 432B

EXEMPLU: pentru INTEL 386, 486 Pentium, Core

Un descriptor de 4B se presupune ca trebuie sa aiba anumite informatii:

 Informatiile de principiu sunt aceleasi; exista doar anumite particularitati;


 Pozitie a paginii / directorului de pagini vizate; pozitia inseamna numarul de octeti ai
adresei efective pentru ca pozitia este una ABSOLUTA ;
 Dimensiune? NU! Pentru ca paginile sunt fixate la 4kB; nu avem de ce sa discutam
acest parametru!
 Proprietati? In toate aceste sisteme informatiile sunt aliniate => Paginile sunt
aliniate! Paginile sunt riguros una dupa alta, au toate 4kB, deci nu pot gasi pagini
decat pe multiplu de 4096 => orice adresa fizica are 12 de 0 (ultimii 12 biti adica,
pentru ca sunt multiplu de 4096) – de ce as stoca 0-uri? Folosesc respectivii 12 biti
ca stochez altceva, pentru ca stiu ca mereu se aplica acest caz .

LEGENDA:

38
Alex Mihăilă, 432B

Desfasurarea formala a semanticii:

cu :

Element director – descriptor; se gaseste adaugand la baza index-ul inmultit inainte cu 4(pentru
aliniere);
Element tabela – descriptor;

sesizam ca:

- adresa virtuala e impartita in 3 parti: director, tabela, offset;


- se retine adresa fizica a bazei directorului;
- mai departe cauta in director; foloseste primul index; il aliniaza si gaseste cei 4 octeti
corespunzatori unui descriptor cu care se vizeaza o anume tabela; numai 2 octeti +1/2 sunt
cititi (momentan atat ma intereseaza);
- abia dupa folosirea ultimui index gasim adresa fizica a paginii;
- (CR3) – CONTROL REGISTER NUMBER 3- apare peste tot, nu numai la Intel; nu am
voie sa o schimb nicaieri; (baza directorului de tabela de pagini )

39
Alex Mihăilă, 432B

Fie adresa liniara data; se cere translatarea in adresa fizica, daca se dau informatiile
urmatoare:

CONCLUZII:

1. Urmatoarele, dupa ce AL a fost dat, sunt date de utilizat: cate 4 octeti in 2 zone de
memorie;
2. Procesorul preia adresa virtuala si o imparte in campurile (director, tabela, offset);
3. Citeste apoi adresa fizica de 32 biti a bazei direotului de tabela;
4. Aliniaza primul index, inmultit cu 00;
5. Primul descriptor care-l doreste il gaseste aliniat;
6. Baza tabelei la fel;
7. Baza tabelei este si ea aliniata la randul ei;
8. Urmatorul index e 249 *4 = > al 2-lea descriptor de care avem nevoie, iar aliniate...
9. Baza paginii contine doar 2 octeti si jumatate ....
10. Pe undeva: adresa fizica translata din adresa virtuala initiala
11. Aici se observa bine protectia in actiune: daca schimbam un singur bit in ipoteza
problemei, se schimba si ultimul rand (solutia).

40
Alex Mihăilă, 432B

In imaginea de sus avem o metoda de a micsora timpul de translatare a adresei virtuale in


adresa fizica ;

Prima data cand discutam de o memorie cache, o memorie invizibila pentru utilizator, un
cache special, tabela de adrese (TLB- translation look-aside botoom - > o mica memorie in care
se pot stoca adrese virtuale si adrese fizice asociate lor); cand pornim un proces, aceasta
memorie e goala (nu fizic, ci doar ca semnificatie), procesorul e trimis sa caute informatie in
memorie si intampinam 2 situatii:

41
Alex Mihăilă, 432B

a) „cache hit” - A cache hit is a state in which data requested for processing by a component or
application is found in the cache memory. It is a faster means of delivering data to the processor,
as the cache already contains the requested data.

b) „cache miss” - Cache miss is a state where the data requested for processing by a component
or application is not found in the cache memory. It causes execution delays by requiring the
program or application to fetch the data from other cache levels or the main memory.

obs:

 Un TLB cu 32-64 de adrese in interior, are un cache-hit de peste 90%; daca cresc peste
64, nu depasesc cu foarte mult rata de succes de la 64; de la 32 la 64 se modifica doar
putin, nu foarte mult.
 De ce aceasta rata de 90% e atat de buna? predictibilitatea programelor scrise cu aceste
procesoare! Programele decurg fie secvential (usor de intuit ca mereu am adresa
anterioara), fie am salturi – pot sa fie de 2 feluri: daca vreau sa fac in cadrul unui ciclu =>
ele revin in ciclu de sute-mii-milioane de ori-> predictibilitate foarte mare; !!!!

De asemenea, salturile sunt ineficiente: golesc cozi, strica pipeline-urile, incetinesc


procesul de translatare !

De ce e buna segmentarea, de ce nu? si pentru paginare la fel?

Facem segmentare in primul rand pentru modularizare (imi doresc sa am module cu


programele utilizate, cu datele utilizate, e foarte usor sa trec de la un modul la altul + avem
avantajul segmentelor care se muleaza pe dimensiunea dorita ( ex: date de 64 kB atunci avem
segment de 64 kB ! ) ; al doilea rand: protectia (segmentul este cuanta de protectie !), in
interiorul lui, informatia este protejata

Dezavantaj: timpul de translatare al adresei virtuale (desi exista mecanimse de compensare,


precum registrele cache).

Paginarea, impreuna cu segmentarea sunt doar o masura de protectie in plus; daca-i doar
paginare atunci doar paginarea este securitatea optima: al doilea rand: eficacitatea transferului
de informatie, mai ales intre memoria interna si externa, transfer pe pagini, nu pe bytes

Dezavantaj: tot timpul ! (la fiecare paginare trecem prin multe calcule, mai ales adresarile
intermediare care afecteaza timpul !)

42
Alex Mihăilă, 432B

Principiile paginarii :
Paginile au dimensiuni fixe si sunt riguros concatenate.

Intotdeuna parcurgem ele 2 etape: intai gasim pagina (avem nevoie de macar un index
care ne trimite la macar un descriptor, apoi informatia in interiorul ei (pentru ultima folosim un
offset, o adresa efectiva) = >trebuie sa stim cat de mare e memoria de paginat, cat de mari sunt
adreslee fizice la care vreau sa ajung (cati biti are Av si AF) ; cate nivele de adresare indirecta cu
memoria avem .

Odata dupa aflarea celor de sus, avem 2 mari etape: impartim in campuri adresa virtuala,
decidem semnificatia fiecarui camp si dimnsiunea sa (offset obligatoriu + niste indexi), numarul
de campuri si dimensiunea lor este impusa de numarul de pagini si numarul de nivele de
adresare indirecta cu memoria.

Nu putem trece la paginarea propiu-zisa pana nu decidem dimensiuna descriptorului!

AV: se descompune in campuri, numarul de campuri este dat de numarul de nivele cu


adresare indirecta cu memoria ( avem un camp pentru offest, si un camp pentru fiecare index de
care avem nevoie).

Trebuie sa intelegem semnificatia campurilor si dimnesiunea lor ;

In mod evident, offset (sau AE) este impus; cautarea octet cu octet in pagina dorita; atunci
offset-ul este dat de numarul de octeti din pagina! Numai dupa ce imi dau seama ca semnificatia
offset este de a cauta octet cu octet! In acest caz, dimensiunea in octeti a paginii imi da
dimensiunea offsetului in biti;

4 kB => offset de 12 biti; 16kB=> offset de 2^4 * 2^10;

Cat de mari sunt descriptorii? sunt neaparat un numar de octeti puterea lui 2, pentru a asigura
toata informatia necesara despre un descriptor! De ce? => vectori de intrerupere formule !

exemplu de situatie: daca nu ne ajung 4 octeti nu o sa trecem sa facem 5 ci 8 ! (putere a lui 2 !)

43
Alex Mihăilă, 432B

Index-ul si dimensiunea descriptorului imi dau dimensiunea tabelelor de nivel 1, de nivel


2 etc. ; nu e obligatoriu ca descriptorii sa fie egali in cele 2-3 tipuri de tabele folosite!

Campurile: AE obligatiu 12 biti; urmatoarele ... (aici nu avem tabele director! nu e INTEL).

44
Alex Mihăilă, 432B

-Observam ca nu avem nicio urma de vreun director!

-Adresa virtuala e impartita in 3 campuri, cu denumiri adecvate (repet, nu e INTEL !)

Tabela de nivel 1 si tabela de nivel 2 : avem descriptori de 4B in ambele, nu specificam


unde sunt situati;

Alinierea entitatilor se face din 4 in 4 kB; alinierea indexilor , intrarile in tabele doar din 4
in 4 octeti!

45
Alex Mihăilă, 432B

MECANISMUL PROTECTIEI:
Tipuri de protectie:

Ideea de protectie – nu se aplica doar microcontrolerelor, ci prelucrarii oricarui tip de


informatii; nu exista sisteme de prelucrare a informatiei fara sisteme de protectie; noi ne ocupam
de protectia informatiei IN MEMORIE in acest capitol.

Ce protejam de fapt?

 Protejam tipurile de informatii; exista mereu o ierarhie a informatiilor dupa importanta;


PROGRAM > STIVA > DATE OBISNUITE
 Daca avem multi-user + multi-tasking – protectia intre utilizatori; uC trebuie sa se ocupe
de acest lucru, utilizatorul nu trebuie sa se ocupe => PROTECTIE INTER-TASK
INTER-PROCES!
 La fel de importanta: protectia intra-task: programul il protejam de utilizatori.

Diverse mecanisme de protectie:

1. Prin translatarea din adresa virtuala in adresa fizica.


2. Mecanisme suplimentare: uneori se ajuta cu translatarea, alteori sunt independente: un
astfel de mecanism: mecanismul privilegiilor multi-nivel.

Ce inseamna de fapt asigurarea protectiei?

Fundamental => in functie de tipurile de protectii propuse, stabilim niste reguli; aceste
reguli vor fi exprimate, pe cat posibil, numeric, ai uP sa sa le verifice on-chip; daca o astfel de
verificare esueaza, se genereaza un mecanism numit violarea protectiei – se genereaza o
intrerupere software dedicata!(e foarte simpla pentru ca intreruperea software presupune
apelarea unei proceduri dedicate acelui tip de violare aparut !)

Notiuni de baza ale protectiei :

 Importanta e subdiviziunea logica a memoriei folosita – nu e neaparat segment (ca pe


slide), poate sa fie si pagina; daca am si segmentare si paginare (ca la x86) –
SEGMENTUL ESTE CEL IMPLICAT SI NU PAGINA; segmentul e de cele mai
multe cuanta de informatie protejata !

 Segmentul sau pagina reprezinta cuanta de informatie protejata – cuanta e cea mai mica
zona de memorie cu o protectie uniforma, in care regulile sunt aceleasi; nivelul de
informatie este acelasi; daca trec peste granitele subviziunii, stric protectia: aceste
subdiviziuni nu se suprapun niciodata; (segmentele au baza si limite care le permit sa nu
se suprapuna!; paginile sunt riguros concatenate)

46
Alex Mihăilă, 432B

 TASK – nu e un program ci o colectie de programe; deosebirea fundamentala fata de un


program este alocarea dinamica a resurselor (registre, stiva, date, timp de procesare, dar si
nivele de protectie, reguli de protectie, nivel de importanta a informatiei, care se poate
schimba de la un program la altul!) - asa cum cuanta de memorie protejata este segmentul
/ pagina – programul este cuanta de organizare a informatiei in care avem acelasi nivel de
importanta a informatiei, aceeasi protectiei; in cadrul unui program nu se schimba regulile
– exista o corespondenta biunivoca intre un segment si un program – intr-un segment
avem un program!

Protectia rezultata din gestionarea memoriei:

 Adresarea indirecta cu memoria – niciodata nu ajungem direct la un segment / pagina;


trecem prin macar UN DESCRIPTOR; descriptorul este tot in memorie, intr-un segment
care contine descriptori;
 Pot separa / asigura o protectie intra-proces BRUT, impartind memoria virtuala in 2
jumatati cu masuri de protectie diferite; in una sa fie modulele sistemului de operare si
una utilizatorii; (TI=0 – adrese globale; TI=1- adrese locale).
 Masuri diferite de protectie: tabele de descriptori diferite (GDT si LDT) – primul pas de
protectie intra-proces;
 Apoi asigur o protectie inter-program; pentru ca modulele de date sunt separate de cele de
program;
 In octetul de acces aflam ce putem sa facem, ce drepturi avem cu segmentul tinta;

obs: cuanta de informatie se defineste cu : ALTE_PROPRIETATI

VERIFICARILE :

Ce se intampla cronologic pe un x86 – sunt pasi facuti de orice procesor care trece din virtuala
in fizica;

1. Vrem sa stim daca am incarcat selectorul corect – x86 are segmente dedicate pentru
diverse tipuri de informatii; o data incarcate in SS, tot ce e incarcat e sub forma de stiva;
- trebuie sa stim daca selectorul e valid; verificam daca ne asteptam sa gasim sau nu
segmentul vizat; uP si SO au datoria sa aduca segmentul tinta, daca el nu este in memoria
interna;

- se verifica ulterior sa nu cumva sa iesim din segment;

2. Verificari privind tipurile de informatii (ex: daca vizez un program, nu am cum sa vreau
sa scriu acolo).

47
Alex Mihăilă, 432B

1. Verificări la încărcarea selectorului:

– Verificarea tipului de segment relativ la registrul segment folosit; câmpuri implicate: S, P/D,
ED
– Verificarea existenţei descriptorului pentru segmentul vizat; câmpuri implicate: ACCES
– Verificarea dacă segmentul vizat este în memoria internă; câmpuri implicate: P
– Verificarea respectării regulilor nivelelor de privilegii; câmpuri implicate: DPL, C

2. Verificări la încărcarea descriptorului în registrul cache:

– Verificarea dacă sunt respectate limitele segmentului; câmpuri implicate: LIMITA, ED


– Verificarea dacă segmentul este folosit conform atributelor din octetul ACCES; câmpuri
implicate: W, R.

Observaţii:
 GDT nu poate fi accesată de către oricare utilizator – mecanism suplimentar de
protecţie; ea conţine informaţii despre LDT şi deci impune configuraţia segmentelor de
sistem şi, implicit, a segmentelor de lucru.
 GDT şi LDT au, de regulă, dimensiuni fixate indiferent de evoluţia numărului de
segmente de lucru
 Pentru un program: ACCES = 00H – „descriptor nul”..

Tabelele de descriptori sunt initiati de catre SO cu dimensiune maxime; exista conceptul


de descriptor nul(tip x86) => de aceeea avem descriptori ce descriu sau descriptori care rezerva
zona de memorie.

48
Alex Mihăilă, 432B

Protectia rezultata din mecanismul privilegiilor multi-nivel

Este foarte general! Exista aplicatii ale acestuia in tot felul de situatii!

Informatia in general (memorie sau porturi) este clasificata! Clasificate ierarhic ca


importanta!

Nivele de protectie

nivel 0 – cel mai privilegiat; conţine nucleul sistemului de


operare: gestionarea memoriei, multiprocesarea, controlul
resurselor I/O;
nivel 1 – restul sistemului de operare;
nivel 2 – soft dedicat şi supervizor sistem;
nivel 3 – soft de aplicaţii

 Exemplu de aplicare a acestui principiu intr-un sistem de


prelucrare a informatiei;(nivelul 3 poate sa fie neprotejat, fiind folosit de utilizatori)
 Acest exemplu cu 4 nivele nu trebuie neaparat sa fie pentru x86; nu toate sistemele au
atatea nivele; chiar si x86 are protectie cu 2 nivele; 4 a fost ales pentru ca poate sa fie
cuantificat cu 2 biti!
 4 nu este tipic Intel; tipic Intel este faptul ca nivelul 0 e cel mai bine protejat; e o
conventie;

Algoritm de lucru

Verificare “on chip” a „autorizaţiei” de acces în funcţie de „clasificarea” informaţiei


vizate → se semnalează “violarea protecţiei” →se generează o întrerupere soft dedicată →
se iniţiază o procedură de răspuns adecvată !

 Mecanismul general este acelasi; mecanismul stabilirii unor reguli, verificarii lor,
generarii unor intreruperi software si apelarii unei proceduri adecvate de raspuns;
 Ce inseamna reguli? Verificarea relatiei intre nivelul de clasificare a informatiei vizate si
autorizatia pe care o entiate o are pentru a accesa acea informatie.
 Ce inseamna autorizatie? Clasificare unei entitati(student) reprezinta autorizatia in
momentul in care entiatea vrea sa faca o actiune / sa intre intr-un segment.

Analogie: Segmentul este sala de laborator in care vrea sa intre studentul; studentul este
programul !

49
Alex Mihăilă, 432B

Reguli generale de protectie impuse de priviligiile multi-nivel


1. Datele pot fi accesate în segmente cu acelaşi nivel de privilegiu sau în segmente
aflate pe nivele mai puţin privilegiate. Tot ce discutam aici se refera la instructiuni foarte
normale, bine cunoscute, ale unui uP oarecare : MOV, LOAD, STORE (daca e RISC).

2. Programele pot fi accesate (CALL, JMP) în segmente cu acelaşi nivel de privilegiu.


Accesul prin nivele este restricţionat: se face numai prin PORŢI : INT- intrerupere software,
RET , IRET.

Exemplu:

Orice mecanism are reguli, trebuie gestionate niste exceptii corect; orice exceptie e o
bresa de securitate, dar e absolut necesar sa le avem; la regula 2. avem o exceptie: POARTA.

Cat timp nu discutam exceptii, NU se pot apela intre ele programele de pe nivele diferite
de protectie!

 un program activ – are autorizate;


 program in asteptare – este doar clasificat.

Un program isi transforma clasificarea in autorizatie ca sa poata accesa informatia !

observatii:

 programul acceseaza datele si nu invers;


 nivelul 0 este conventia uzuala INTEL (cel mai ridicat nivel de protectie);
 orice program poate sa fie apelat sau apelant.

50
Alex Mihăilă, 432B

Protectia datelor si a segmentelor


a) Accesul datelor
Datele pot fi accesate în segmente de date (selectoare în DS, ES, FS, GS, SS) sau în
segmente de program citibile (selector în CS).

Indicatori ai nivelului de privilegiu:

 DPL : nivelul de privilegiu al descriptorului (biţii 5-6 din ACCES); clasifică nivelul de
privilegiu al segmentului de date şi autorizează în cazul segmentului de program;

obs:
- este practic clasificarea segmentului TINTA; nu al descriptorului! El imi arata clasificarea
segmentului tinta, nu al descriptorului in sine!
- DPL nu este in descriptor, ocupa o pozitie in octetul de acces!
- nu este atribut de arhitectura !

 RPL : nivelul de privilegiu cerut (biţii 0-1 din SELECTOR); este nivelul impus
de cel care furnizează selectorul.

obs:
- poate fi folosit doar pentru o micsorare a nivelului importantei adresarii tintei;
- se gaseste in selector, care el este atribut de arhitectura !
- este atribut de arhitectura!

 CPL: nivelul de privilegiu curent (menţinut automat de către procesor);


este nivelul de privilegiu al segmentului curent de program care dă autorizaţia de acces.
Deci: CPL = DPL al descriptorului accesat cu SELECTOR din CS, pentru programul curent.

obs:
- fizic vorbind, DPL si CPL sunt IDENTICE (semnficatile lor insa pot fi diferite)!
- nu este atribut de arhitecutra; discut de el doar pentru program !
 EPL: legat de program;

51
Alex Mihăilă, 432B

Regula 1 devine:

max (CPL, RPL) ≤ DPL


EPL = max (CPL, RPL)
EPL ≤ DPL

comentariu:
- RPL poate fi doar crescut numeric, nu scazut=> trebuie sa fie mai mare ca DPL al
nivelului tinta;
- autorizatia efectiva a unui program care vrea sa acceseze niste date, trebuie sa fie mai
buna sau egala cu clasificarea datelor tinta (sensul inegalitatii si max apar pentru ca 0 e
nivelul de protectie cel mai ridicat; daca e pe dos, se schimba sensul inegalitatii si
max devine min) !

*adică, pentru accesul datelor în segmente de date şi în segmente de program non-conforme,


programul curent trebuie să fie cel puţin tot atât de privilegiat ca şi segmentul vizat
(autorizaţia programului trebuie să fie mai puternică decât clasificarea segmentului).

In materie de verificari !
Verificarea 1:
1. Se face verificarea tipului de informatii; exista moduri diverse de a avea access la diverse
tipuri de informatii; in general segmentele de date pot fi citite/scrise; programele nu pot fi
scrise niciodata, dar le pot citi;
2. Un segment de stiva trebuie sa poata sa fie inscriptionabil; daca nu este inscriptionabil NU
are cum sa fie segment de stiva.

52
Alex Mihăilă, 432B

Verificarea 2: a algoritmului
max(CPL, RPL) ≤ DPL

 DPL – pentru segmentul vizat (clasificare)


 CPL – pentru programul care rulează (autorizaţie)

Excepţii:

a) pentru stivă trebuie ca: DPL = CPL;

Stiva e mai pretioasa decat un segment de date implicit; e tratat la un nivel de importanta
mai mare

b) segmentele de program "conforme" (C=1) sunt exceptate.

Verificarea 3: ca nu depasim limita segmentului vizat


Pentru ED = 0 trebuie ca AE curentă ≤ LIMITA
Pentru ED = 1 trebuie ca AE curentă >LIMITA

Exceptii:
a) Stiva trebuie tratata in mod special! Sa nu spunem vreodata ca un segment de stiva ar
putea sa nu fie citibil sau ca nu putem scrie in el ! Faptul ca DPL=CPL , stiva e tratata ca
nivel de importanta a unui segment de program, pentru ca multe programe ruleaza cu
informatii din stiva si fara ele nu se poate !
b) La x86, in segmentul de access, exista un bit prin care pot sa suspend temporar regulile;
EXCEPTII FARA DE CARE SISTEMUL NU FUNCTIONEAZA; exemplul cel mai bun:
UN SEGMENT DE PROGRAM NU POATE FI INSCRIPTIONAT! Ca sa scriu in ele
trebuie SUSPENDATA aceasta regula! – asta este o exceptie, care e evident, o bresa de
securitate.

53
Alex Mihăilă, 432B

b) Accesul segmentelor de program


Autorizatia programului CURENT trebuie sa fie egala cu clasificarea programului
tinta !

-Segmente de program care sunt doar executabile (selector în CS).

-Instrucţiunile folosite sunt de tip “JMP”, “CALL” şi “RETURN”.

Accesul de la un program la altul se face cu instructiuni clasice – tot ce discutam aici se


refera la ce am facut semestrul trecut (INT mai poate fi folosit sa ajung de la un program la altul
– si o data cu el mai am IRET – de returnare) .

Cand trecem de la un program la altul: SALTURI! PROGRAMUL APELANT FACE


UN SALT CATRE PROGRAMUL APELAT.

VERIFICAREA I:

Se verifică tipul de segment în funcţie de registrul segment în care se încarcă selectorul


(CS) şi în funcţie de octetul ACCES ţinând seama că segmentul este de tip “EO” .

VERIFICAREA a II-a – se aplică Regula 2:


CPL = DPL
DPL – pentru programul vizat (clasificare)
CPL – pentru programul care rulează (autorizaţie)

*Excepţie:
-segmentele de program „conforme” (C=1) sunt exceptate

Observaţii:
a) CALL către segmente de program(nu la un segment de date!) cu nivel de privilegiu mai
mare se face numai prin porţi.
b) RETURN se poate face la un segment de program cu acelaşi nivel de privilegiu sau mai
puţin privilegiat.

VERIFICAREA a III-a:

Se verifică încadrarea în LIMITA indicată de descriptor:


AE curentă ≤ LIMITA

54
Alex Mihăilă, 432B

Transferul controlului intre nivelele de protectie


Instrucţiunile folosite sunt de tip “JMP”, “CALL” şi “RETURN” (mai sunt si INT si IRET).

• Transfer intra-segment: nu se schimbă nivelul de privilegiu.


Salturi in interiorul segmentului, astfel calsificarea nu se modifica.
• Transfer inter-segment, la acelaşi nivel de privilegiu: regula 2 este respectată.
Construtirea unor module de program=> permise.
• Transfer inter-segment la nivele diferite de privilegiu: se folosesc porţi.
O sa fie nevoie de programe la nivele superioare. De la nivelul 3poate am nevoie de de
nivele superioare pentru a fi folosite.

Porţile NU sunt descriptori. Ele arata ca un descriptor doar.

• Porţile reprezintă un nivel suplimentar de adresare indirectă. Acest aspect confera proobabil
protectie.
• SELECTORUL pentru o poartă se încarcă obligatoriu în CS. Poarta are sens cand trec de la un
program la altul. Portile nu se folosesc la apelare a datelor, a segmentelor!
• Se utilizează pentru:
- apelarea programelor la nivele diferite de privilegiu;
- răspunsul la cererile de întreruperi;
- multiprocesare.

E nevoie sa ma duc la un alt nivel – in general NU, pentru ca trebuie sa fac intrasegment;
orice salt intersegment insa este MULT mai simplu pentru ca pastrez nivelul de clasificare (2 la
2; 1 la 1)!
Daca fac intrasegment se poate sa schimb nivelul de protectie(2 in 3; 2 in 1 etc.).

Cea mai importanta exceptie facuta de sistem are un nume sugestiv : GATE.

O poarta inseamna in esenta un nivel supliemtar de adresare indirecta cu memoria;


confera cel mai probabil protectie;
Nu am nevoie de poarta decat daca trec de la un program la altul !

55
Alex Mihăilă, 432B

Poarta de Apelare pentru Procesoarele compatibile IA32.

Cand se impune utilizarea portii de apelare, Adresa Virtuala (AV) a informatiei vizate este
in poarta si nu la utilizator.
ROLUL PORTII: sa contina adresa corecta de intrare, sigura, in programul tinta, in
programul la care se face saltul (indiferent de tipul saltului).
Spre deoosebire de descriptorii de tip a si b1, care aveau 3 tipuri de informatii (Adresa
Fizica- AF- a bazei segmentului, dimensiunea segmentului, proprietatile segmentului). In cazul
portii de apelare compusa din AE(OFFSET)+SELECTOR= ADRESA VIRTUALA. (informatia
adresei virtuale de fapt se gaseste in POARTA ! ) avem un octet de ACCES si un numarator de
cuvinte pe 5 biti.
Selectorul destinatie nu este la dispozitia utilizatorului chiar daca RPL (bitii 0 si 1 ai
octetului 2) este atribut de arhitectura, in cazul portilor nu conteaza acest aspect !
Octetul ACCES al unei porti are bitii 0->3 dau tipul. Cand b3 este 1 vom avea procesoare
compatibile cu procesoarele INTEL pe 32 de biti, iar cand este 0 vom avea procesoare
compatibile cu INTEL pe 16 biti. Cand b4=0 avem descriptorul de sistem. Bitul 5 si 6 reprezinta
DPL (nivelul de privilegiu al portii). Bitul 7 indica prezenta.
Dupa ultimii 4 biti (TIP) putem avea urmatoarele tipuri de porti:
 poarta de apelare: la 16 biti (0 1 0 0) , la 32 biti( 1 1 0 0).
 poarta de proces: la 16 biti (0 1 0 1) , la 32 biti( 0 1 0 1).
 poarta de intreruperi: la 16 biti (0 1 1 0) , la 32 biti( 1 1 1 0).
 poarta pentru capcane: la 16 biti (0 1 1 1) , la 32 biti( 1 1 1 1).

56
Alex Mihăilă, 432B

In cazul portilor, DPL se refera strict la poarta, in timp ce pentru descriptorii de tip a si b1
se refera nu numai la descriptori, dar si la segmentul vizat prin acel descriptor, deci se face
clasificarea segmentului vizat. Etapele apelarii prin poarta:

1. Din AV care insoteste instructiunile JMP, CALL si INT (fara RETURN, care nu are
AV, este implicita !) se pastreaza doar selectorul ; OFFSET-ul se ignora deoarece se identifica
un descriptor de tip b3.

2. Se fac urmatoarele verificari:


- SELECTORUL DESTINATIE sa nu fie nul.
- SELECTORUL DESTINATIE sa fie in limita tabelei de decriptori vizata.
- Descriptorul vizat sa fie pentru segment de program.
- Segmentul de program sa fie prezent si in LIMITA impusa .
- CPL apelant <= DPL poarta.

3. Se determina adresa informatiei din segmentul vizat folosind mecanismul translatiei cu


AV din poarta fomarta din SELECTOR DESTINATIE si OFFSET DESTINATIE cu observatia
ca RPL din OFFSET se ignora.

4. Se determina necesitatea schimbarii nivelului de privilegiu si se admit :


CPL >= DPL –pentru CALL
CPL =DPL pentr JMP
CPL <= DPL pentru RETURN

5. Se face schimbarea nivelului de privilegiu daca este necesar; autorizatia programului


care vrea sa treaca controlul prin alt program, poate trece prin poarta doar daca autorizatia
este suficienta.

6. Se selecteaza si se actualizeaza noua stiva corespunzatoare noului nivel de privilegiu


pentru a mentine integritatea sistemului; in cazul unui proces fiecare nivel de privilegiu isi are
propria stiva; procese diferite chiar aflate la acelasi nivel de privilegiu au stive diferite.

CONCLUZIE : Poarta garanteaza ca toate transferurile la un nivel superior de privilegiu se fac


printr-un punct de intrare sigur si nu in mijlocul unei proceduri sau al unei instructiuni sau la o
procedura „vulnerabila”.

OBS: Fiecare nivel de privilegiu are propria stiva – chiar daca e vorba de acelasi task
(intr-un task pot sa trec de la o clasificare la alta) – stivele sunt clasificate si ele pe nivele
corespunzatoare de asemenea.

57
Alex Mihăilă, 432B

Transferul controlului programului de la o poarta apelanta la una apelanta pentru


procesoare compatibile INTEL in mod virtual in spatiul adreselor virtuale cu si fara poarta de
apelare e prezenta in figura ( in stanga e fara poarta, in dreapta e cu poarta !):

4 masuri de gestionare a bresei de securitate !


- sa avem o poarta;
- sa avem dreptul sa trecem prin poarta, clasificata si ea la randul ei;
- daca folosesc salturi propriu zis, cu sau fara poarta, tot n-am voie la alt nivel;
- am voie doar, folosind CALL, la nivele superioare, niciodata la nivele inferioare;

Doar selectorul e folosit, OFFSET-ul se ignora (se citeste din poarta).

58
Alex Mihăilă, 432B

Tranferul controlului programului pentru progrrame compatibile INTEL, in modul virtual


in spatiul adreselor locale cu si fara poarta de apelare. Urmatorul desen este unul foarte general,
nu specific INTEL:

Accesul de la un program la altul, in spatiul adreselor globale, fara poarta in stanga, cu


poarta in dreapta!

Daca acest segment e la alt nivel de priviliegiu? Se intampla ce vedem in partea dreapta !

INDEX-ul si indicatorul de tabela, in cazul de fata 0, ma duc undeva in interiorul GDT ca


sa gasesc descriptorul segmetului vizat, OFFSET e folosit ca sa se faca trecerea la pozitia primei
instructiuni a progamului apelat (Stanga).

Rolul portii e sa furnizeze adresa virtuala corecta! (Dreapta)

Ne arata unde gasim portile de apelare si ne arata nivele de adresare indirecta cu memoria
( 1 in stanga, 2 in dreapta), daca poarta se gaseste in LDT, atunci sunt 3 nivele (in GDT
descriptorul, apoi poarta din LDT, apoi segmentul tinta !).

59
Alex Mihăilă, 432B

Schimbarile de stiva cauzate de portile de apelare

Etapele de actualizare a stivei sunt:

- se selecteaza o noua stiva ce nivel de privilegiu corespunzator noului CPL;


- noua valoare a indicatorului de stiva ((SS):(SP)) este incarcata din TSS (segmentul de
stare al procesului);
- campul numarator de cuvinte (5 biti) indica numarul de pozitii din stiva care vor fi copiate
din veche stiva in noua stiva. Acest lucru se realizeaza transparent pentru utilizator;
- se verifica daca informatiile care urmeaza a fi copiate au loc in noua stiva;

SS – noul continut al (SS)

SP – noul continut al (SP)

Daca se face trecerea de la o stiva la alta, varful noii stive este gasit in segmentul de stare
al procesului.

In noua stiva sunt copiate la baza si la varf coordonatele vechii stive si locul in care s-a
facut apelul. In noul nivel de privilegiu se stie intotdeauna istoria apelantului.

OBS: INTEL, nu in ingeral !

60
Alex Mihăilă, 432B

Explicatia utilizarii instructiunilor de tip CALL la portile de apelare

Transferul cu instructiunea CALL se face cu nivele mai privilegiate pentru ca stiva


modului apelat sa se afle la dispozitia procesului cu un nivel de privilegiu mai mare si nu invers.
Evident, RETURN se face catre nivele cu un nivel de privilegiu inferior.

CALL, nu JMP : Este interzis transferul controlului catre alte nivele de privilegiu prin
instructiuni de tip JMP pentru ca nu exista posibilitatea de a salva selectorul din CS si nu exista
posibilitatea de a identifica nivelul autorizatiei din descriptorul aferent selectorului. Cand se face
JMP, noul program nu se stie de unde a venit pentru ca nu se face stocarea locatiei de unde se
vine; verificarile se pot face, deci, doar cu instructiuni de tip CALL, nu JMP => SALTURILE
NU-S EFICIENTE !!!

Cand trecem de la stiva de nivel 3 pe 2, stiva devine accesibila celei de pe nivelul 2; daca
trecem de la 2 la 3, stiva devine exclusa, inseamna ca o stiva de la un nivel de privilegiu mai
ridicat ar deveni disponbila =>niciodata ! (CALL si nu JMP, apel si nu salt propriu-zis; saltul
propiu-zis nu lasa urme !).

Sinteza modalitatilor de transfer al controlului programului - aplicarea Regulii


2:
1. Un modul de program poate apela (CALL) un modul mai privilegiat (numeric – nivel mai
mic) numai prin poarta de apelare.

2. Este interzisă apelarea unui modul de program mai puţin privilegiat (numeric – nivel mai
mare).

3. Apelul la acelaşi nivel de privilegiu este permis şi poarta de apelare e opţională.

4. Este interzis saltul (JMP) către alte nivele de privilegiu.

5. Saltul la acelaşi nivel de privilegiu este permis şi poarta de apelare e opţională.

Ideea fundemtantala – trebuie sa avem o poarta si sa stim ca exista;! dupa, trebuie sa am


voie sa trec prin poarta (autorizatia mea >= cu clasificarea portii) –> deci portile trebuie sa fie pe
nivelul 3 (nivelul utilizatorului).

61
Alex Mihăilă, 432B

EXEMPLE :

In imaginea de sus avem o reprezentare gresita a situatiei : e exclus ca mai multe


programe sa fie simultan galbene (adica sa fie autorizate). Lucram pe sisteme cu un procesor,
unde exista un program care ruleaza la un moment dat, iar toate celalalte sunt clasificate, nu au
voie sa aiba toate CPL! (5 desene diferite trebuiau sa fie de fapt, pentru fiecare CPL).

Inainte de a comenta imaginea de mai sus, trebuie sa specificam urmatoarele aspecte:

62
Alex Mihăilă, 432B

Trebuie sa avem o poarta, trebuie sa stim ca ea exista !

Trebuie sa am dreptul sa trec prin poarta, autorizatia


mea trebuie sa fie mai buna sau egala cu clasificarea
portii (Accesibiliatate maxima e pe nivelul 3) !

Ajustarea nivelului de privilegiu:

ARPL r16|mem16, r16

operand 1: SELECTORUL procedurii apelate (care


se ajustează);
operand 2: SELECTORUL procedurii apelante.

Dacă RPL din operandul 1 este numeric mai


mic decât al doilea, ZF<-1 şi RPL din operand 1
devine egal cu RPL din operand 2. Altfel, nu se
întâmplă nimic.

Instrucţiunea ARPL este inserată în modulul de program de la nivelul 1 de privilegiu;


RPL este ajustat – devine mai mare numeric -> nivelul efectiv de privilegiu se micşorează
max (CPL, RPL) = max (1, 3) = 3 > DPL .

Cu alte cuvinte, ce face d efapt ARPL – degradeaza autorizatia unui program atunci cand
este apelat de pe un nivel inferior;
Exemplu din imaginea gresita: prima instructiune din CPL1 este un ARPL1; cand este
apelat de un program de nivelul 3, RPL-ul lui devine 3; => in momentul in care va incerca sa
acceseze datele de pe nivel 2 nu va mai putea, pentru ca n-o sa mai aiba drepturile. El nu isi
modifica clasificarea, pur si simplu isi modifica temporar RPL-ul numai cat timp este accesat de
un program inferior => autorizatia lui efectiva in timpul acest va fi 3 !

63
Alex Mihăilă, 432B

Avem 5 programe in imaginea gresita :

- CPL3: program in nivelul 3, clasificat 3, in momentul in care devine activ, are autorizatia 3 si
incearca sa ajunga la nivelul 0 (doar printr-o poarta, stie ca exista, dar fiind de nivel 3, si poarta
de 2, acest program nu poate ajunge acolo vreodata, la nivelul 0 ) !

- CPL2: clasificat pe nivelul 2, in momentul rularii autorizatia 2, accesul pe nivel 0 e imposibil;


trebuie folosita o poarta, stie ca exsita (clasificarea portii este 2), deci trece prin poarta, CALL,
poate accesa nivelul 0!

- CPL1: program clasificat 1, autorizatia e 1, accesarea la nivelul 0 e imposibila, 0 nu e egal 1,


dar stie ca exista o poarta, ajunge la ea; 1 e mai bun decat 2, deci trecerea prin poarta e posibila,
face CALL si ajunge la nivelul 0 !

- (de jos)CPL0: 0 mai bun decat clasificarea portii, CALL si se ajunge la nivelul 0, desi se putea
face si direct accesul, fiind la acelasi nivel cu destinatia !

- (de sus)CPL0: poate face CALL, poate face JUMP, trece direct la destinatia dorita !

PROTECTIA PAGINILOR

Protectia paginilor pentru INTEL 386, 486, Pnetium, Core. Descriptorii din directorul de
tabele si tabelele paginilor.

64
Alex Mihăilă, 432B

Pentru protectia paginilor folosesc campurile R/W si U/S . Daca U/S =0 avem pagina sau
tabela supervizorului care poate fi folosita numai de module de program privilegiate (CPL=0,1
sau 2) si U/S=1 avem pagina sau tabela utilizatorului care poate fi folosita la orice nivel. R/W=1
=>supervizorul poate scrie in pagini daca are si permisiunea suplimentara data de un camp din
CR0 .

Daca segmentul este cuanta de informatie; el este cel protejat; daca nu am segmentare si
am paginare-> pagina este cuanta de informatie protejata; daca cele 2 coexista (ca la Intel),
atunci segmentul ramane cuanta de protectie; pagina este doar o subdiziviune a segmentului, dar
nu are de regula parte de cine stie ce securitate !

 U/S – User Supervisor – asociat nivelelor clasificate(2,1,0); utilizatorul este intotdeauna


nivelul 3;
 De fapt se reduce la 2 nivele protectia pe nivele facuta de Intel pe 4.
 Directorul de tabele de pagini si tabelele paginilor sunt pe nivele clasificate; paginile ele
insale pot fi pe nivelul 3 sau cele clasificate.
 R/W – da permisiunea de scriere in pagina; in general, in pagini chiar nu se scrie (scrierea
in pagina se semnealeaza prin bitul Dirty – pagina nu are voie sa fie modificata pentru ca
e parte dintr-un segment) – in orice caz nu se modifica directorul de tabele.

Întreruperi şi excepţii în modul virtual (protejat)


Variantă de transfer al controlului

Procedura generală de răspuns la o cerere de întrerupere:

1. se salvează în stivă locaţia curentă a programului – adresa virtuală (CS) ↑ (EIP)


2. se salvează în stivă registrul de fanioane (EF)
3. [ se resetează fanionul IF ]
4. se salvează în stivă codurile de eroare
5. se transferă controlul la rutina de deservire a întreruperii (“Interrupt Handler”) prin
mecanismul adresării indirecte, folosind o “tabelă cu descriptori de întrerupere”.

OBSERVATII:

 Intreruperile sunt strans legate de protectie!


 Avem o tabela de descriptori de intreruperi!
 La Intel, pentru compatibilitate cu modul real, există 256 de tipuri de întreruperi şi deci
256 de posibile rutine de deservire a întreruperilor.
 O parte dintre tipurile de întreruperi sunt rezervate

65
Alex Mihăilă, 432B

Variante de întreruperi:

• Întreruperi propriu-zise (“hard”): - nemascabile


- mascabile
• Excepţii: - capcane -> “trap” (întreruperi soft)
intreruperi software clasice ce folosesc tabele de intreruperi (nu vectori de intrerupere ca
la AMP), dupa efectuare instructiunii curente ;
- greşeli –> “faults”
exemplu : segmentul tinta nu e prezent, in cazul unei translatari din virtual in fizic; face pe
dracul in 4 si aduce segmentul in memorie(sau face loc in memorie);
- greşeli fatale –> “aborts”

tot in timpul rularii unei instructiuni, ca cele FAULTS; exemplu: daca depasesc limita
unui segment – greseala impardonabila ; daca e prea grava, poate sa apara un system crash, se
reseteaza totul (tipic: apare o eroare si se repeta a doua oara – dupa ce e prezentata o data
eroarea, user-ul face eroarea in continuare-> crash!).

Observam ca-n modul virtual continui sa am intreruperi Hardware (venite din exterior, de
la terminale dedicate). In modul real putem disctua si despre intreruperi SOFTWARE, care de
fapt sunt instructiuni la baza !

Rutinele de deservire a întreruperilor sunt în segmente din memoria virtuală. Tabela cu


vectori de întrerupere Tabelă cu descriptori de întrerupere (IDT). Există o singură IDT aşa
cum există o singură GDT.

Ca şi pentru GDT, există (la Intel) un registru dedicat pentru localizarea tabelei:
(IDTR) = BAZA_IDT ↑ LIMITA_IDT
IDT conţine:
1. porţi de proces.
2. porţi pentru întreruperi.
3. porţi pentru “capcane”.

66
Alex Mihăilă, 432B

Porti pentru interuperi

Sunt descriptori de tip b3 – asemănătoare porţilor de apelare!

tip 0110 Poartă de întrerupere pentru IA16


tip 1110 Poartă de întrerupere pentru IA32
tip 0111 Poartă de “trap” pentru IA16
tip 1111 Poartă de “trap” pentru IA32

OBSERVATII:

 Procedurile de raspuns de obicei sunt pe alt nivel (ex: eu sunt pe 3, am procedura de


raspuns pe 2,1,0 -> am nevoie de porti pentru apelare).
 Aici gasesc adresa virtuala a procedurei tinta.
 DPL-ul NU e clasificarea tintei; e clasificarea mea mai degraba; pentru tinta o sa am alt
descriptor; prin poarta doar trec, nu descrie ea nimic !

Modul de apelare a rutinelor pentru deservirea întreruperilor:

1. Întreruperile propriu-zise sunt vectorizate către porţi de proces din IDT.

2. Excepţiile utilizează în mod normal porţi pentru capcane:


- poarta conţine adresa virtuală a rutinei de deservire a întreruperii (indiferent de adresa virtuală
asociată instrucţiunii)
- procedura de răspuns lasă nemodificat fanionul IF
3. Excepţiile pot utiliza porţi pentru întreruperi numai pentru compatibilitate cu modul real:
- poarta conţine adresa virtuală a rutinei de deservire a întreruperii
- procedura de răspuns resetează fanionul IF exact ca în modul real

Accesul la o poartă e posibil numai dacă Regula 1 a privilegiilor multi-nivel este respectată.

67
Alex Mihăilă, 432B

Se folosesc “coduri de eroare” – informaţii adiţionale trimise în stivă înainte de transferarea


controlului la rutina de deservire a întreruperii.

- INDEX şi TI sunt luate din selectorul asociat segmentului în care a apărut excepţia
- I = 1 indică faptul că INDEX se referă la IDT şi nu “direct” la GDT sau la o LDT
- EXT = 1 indică faptul că instrucţiunea curentă nu e responsabilă pentru generarea excepţiei
(de exemplu, referinţa la un segment non-prezent)

68
Alex Mihăilă, 432B

Multiprocesarea
Daca avem foarte multa memorie, ne punem problema daca nu cumva putem rula mai
multe procese simultan (multitasking – multiprocesare) = adica modul in care un procesor,
impreuna cu sistemul de operare se face, se preface, ca ruleaza mai multe programe; de fapt in
task-ul 1 sau A, exista posiblitatea sa se ruleze o secventa ; la un moment dat se opreste, se
intrerupe rularea secventei 1 si trece la task-ul 2....etc.

Mecanism din care putem deduce modalitatile de prelucrare a informatiei ; un procesor


poate sa se prefaca si sa dea impresia ca ruleaza mai multe procese simultan; la nivel de
instructiune exista multi-threading !

exemplu : sir de led-uri aprinse, una pe rand, la o anumita frecventa, par aprinse simultan.

Segmentul de stare al procesului şi descriptorul aferent (TSS – tasl state segment) :


un segment special de sistem dedicat salvarii chestiutelor in memorie (conţine toate informaţiile
esenţiale legate de resursele unui proces); fiecare proces are propriul TSS unic, nu exista un TSS
pentru 2 procese !

TSS e descris, ca orice segment de către un descriptor special de control de tip b2 numit
descriptor TSS– desciptor de sistem.

TSS conţine: - o porţiune obligatorie;


- o porţiune la dispoziţia utilizatorului.

Portiunea obligatorie:

 parte statica: fixate din momentul in care a inceput sa ruleze si nu se mai schimba :
pozitia GDT, pozitia LDT, pozitia directorului in tabela de pagini;
 parte dinamica: continutul registrelor normale se schimba; ruleaza o secventa, avem o
anumita stare a registrelor, rulam iar...alta stare!

CAMPURI:

randurile cu [ ] – campuri tipice INTEL ! restul sunt la modul general pentru procesor ce
suporta multitasking !

• selector legătură TSS anterior;


• bazele stivelor de pe nivelele privilegiate;
• [adresa directorului paginilor pentru IA32 – CR3];
• adresa efectivă a instrucţiunii curente şi conţinutul tuturor registrelor atribute de arhitectură;
• selectoarele din registrele segment;
• selectorul din LDTR;
• [bitul de „trap” pentru schimbarea procesului – T ; când T=1 apare INT 1];
• [BAZA „tabelei de I/O permişi”].
69
Alex Mihăilă, 432B

Structura portiunii obligatorii pentru un TSS ; in stanga – pe 16 biti, dreapta 32 de biti !

partea dreapta:
-galben: partea statica
-alb:partea dinamica

70
Alex Mihăilă, 432B

Sunt fixate bazele stivelor pe nivelel clasificate: 2,1,0, toate sub forma de AV; mai e
normal sa gasim continutul registrelor; e normal sa mai gasim continutul acelor registre care au
selectoarele segmentelor de lucru;

Pentru microprocesoarele INTEL compatibile pe 32 de biti avem adresa directorului


paginilor data de CR3.

Astfel de segmente pastreaza o istorie ; de ce? pentru ca sa pot sa gestionez protectia,


trebuie sa stiu de unde am venit !

Un TSS are:
LIMITA >= 42 pentru IA16 (44B);
LIMITA >= 100 pentru IA32 (104B).

Dimensiunea maximă este cea permisă în mod normal pentru orice segment.

BAZA „tabelei de porturi I/O permise” conţine adresa efectivă (offsetul adresei) din TSS care
este baza tabelei propriu-zise.

*Există 2 mecanisme de a asigura protecţia porturilor:

1. nivelul de privilegiu al porturilor I/O;


2. tabela de biţi pentru porturile I/O permise.

INTEL clasifica toate porturile la fel – cu un indicator care se numeste


IOPL(Input/Output Privilege Level) – se gaseste in registrul de fanioane si clasifica toate
porturile la fel.

*Tabela de biţi pentru porturile I/O permise asigură o protecţie individuală a porturilor
I/O. În tabelă există un bit corespunzător fiecărui port; dacă bitul în tabelă este 1, accesul la port
este interzis (în pofida eventualului acces garantat de Regula nr. 1 pentru întreaga hartă a
porturilor).
*Cum fiecare port are un bit corespondent (harta a porturilor), pentru microprocesoarele
Intel şi Intel-compatibile, sunt 64kporturi de câte 1B fiecare=>tabela are 8 kB.

71
Alex Mihăilă, 432B

Pentru procesul din imaginea anterioara se pot accesa:


-porturile cu nr. 8, 9, 10, 11 şi 12 pe octet
-porturile cu nr. 8 şi 10 pe 2 octeţi
-portul cu nr. 8 pe 4 octeţi

Descriptorul „segmentului de stare al procesului” (TSS)

Exista un registru special care ne permite sa ajungem la TSS, un TASK REGISTER (TR).
Decriptorul TSS este situat obligatoriu in GDT. Descriptor special de control, de tip b2.

(TR) = SELECTOR pentru localizarea descriptorului de TSS în GDT.

Structura descriptorului: exemplu INTEL

Descriptor de segment- aceleasi tipuri de informatii ca orice descriptor de segment;


BAZA este adresa fizica a bazei TSS-ului, LIMITA este dimensiunea relativa a TSS-ului (in
cazul asta e si o limita inferiora), iar octetul de ACCES ca si nibble-ul suplimentar are aceleasi
informatii care le stim foarte bine;

 s=0 segment de sistem –> nibble-ul la dreapta lui e un cod !


 s=1 in schimb -> mai multe coduri.

Ce tipuri de informatii gasim in general in descriptori si porti? (2 clase de infromatii care


le putem avea: descriptorii propriu-zisi, in care indiferent ce segment vizeaza, informatiile sunt
aceleasi (pozitie, dimensiune, propieteati); a 2-a clasa sunt portile, doar legaturi de trecere, nu
contin nimic ! ).

DPL (descriptor privilege level) – NU este clasificarea descriptorului, ci clasificarea


segmentului tinta !

72
Alex Mihăilă, 432B

Octetul de ACCES este 0 ( casuta verde): nibble-ul la dreapta este un cod pe 4b in care se
poate spune ca e vorba de descriptor pentru TSS; in acest cod se afla un bit B-BUSY; care ne
spune daca procesul se afla in rulare/activ sau este in asteptare.

busy or not? = bitul 2 (procesul e activ sau in asteptare, acceptiunea de „busy” e putin mai
complicata ).

TIP = 1 (0 0 0 1) : TSS pentru IA16


TIP = 3 (0 0 1 1) : TSS ocupat pentru IA16
TIP = 9 (1 0 0 1) : TSS pentru IA32
TIP = 11 (1 0 1 1) : TSS ocupat pentru IA32

TIP din octetul de ACCES arata daca procesul este sau nu in executie, iar bitul al doilea
din TIP semnifica “ocupat”, deci pentru B=1 procesul este activ, la B=0, procesul e pasiv, in
asteptare.

Schimbarea proceselor

1. Se folosesc instrucţiunile de tip JMP şi CALL din a căror adresă virtuală selectorul
identifică descriptorul unui TSS; offsetul se ignoră.
2. Sau, se folosesc instrucţiunile de tip JMP şi CALL din a căror adresă virtuală selectorul
identifică o „poartă de proces” cu care se face o adresare indirectă la un alt TSS; şi aici
offset-ul se ignoră.
3. Sau, se foloseşte o instrucţiune de tip INT care este vectorizată către o poartă de proces
aflată în „tabela cu descriptori de întreruperi” – IDT, ceea ce constituie tot o referire indirectă la
un alt TSS; şi aici offsetul se ignoră.
4. Sau, se foloseşte o instrucţiune de tip IRET care permite revenirea la un proces anterior
dacă NT=1 (NT este un fanion din registrul de fanioane).

De regula un sistem de operare (SO) poate decide trecerea de la un proces la altul, sunt
folosite intreruperile de tip software / hardware cu acest prilej.

Avem 2 clase de procesoare decid exact cum se face aceasta trecere, si anume:

1. Familia x86 – fac trecerea de la un proces la altul folosind instructiuni normale; adica
cele de transfer de control a programului: JMP, CALL, INT;

2. ARM – foloseste instructiuni speciale din setul de instructiuni speciale, care rezolva si
anumite probleme legate de trecerea de la un program la altul.

Esenta trecerii de la un proces la altul – nu poate sa fie chiar asa simpla pentru ca trec la
un alt proces; trecerea trebuie sa se faca printr-un TSS; nu ajung folosind translatarea AV la
seg,entul tinta in care am programul tinta => instructiuea de JMP, CALL contine un selector(NU
CONTEAZA OFFSET-UL) care ma trimite la un descriptor de TSS.

73
Alex Mihăilă, 432B

NU am de unde sa stiu daca clasificarea programului in care ajung este „=” cu cea a
programului in care sunt=> pot avea nevoie de porti; de data aceasta, poarta se numeste TASK
GATE – nu mai este o simpla poarta de apelare, ci una de proces.

*Etapele trecerii de la un proces la altul:

1.Validarea:

: max (CPL, RPL) apelant <= DPL descriptor de TSS sau poartă de proces.

Aceasta verificare se face numai pentru instructiunile de tip JMP, CALL si INT.

2. Verifică:

- pentru procesul apelant: - prezent;


- LIMITA are val minimă cerută.
- pentru procesul apelat: - prezent;
- nu e ocupat;
- LIMITA are val minimă cerută;
- SELECTOR din LDTR valid;
- Tabela adreselor locale prezentă;
- SELECTOR din CS valid;
- Segment de cod prezent.

3. Declară:
- noul proces - devine „ocupat” (B=1);
- vechiul proces: - devine „liber” dacă s-au folosit JMP sau IRET;
- rămâne „ocupat” pentru CALL sau INT.

Era de asteptat ca procesul curent sa fie activ / busy, si sa il lasam in not-busy iar cel in
care ajung sa devina busy; daca trecerea se face cu CALL/INT, ambele procese, si cel din care
plec si cel in care ajung vor fi BUSY, pentru ca eu stiu ca trebuie sa ma intorc in procesul
apelant; e vorba de un task ocupat !

4. Salvează partea dinamică în TSS al vechiului proces.


Ca sa parasesc procesul curent si sa il pot relua la un moment dat, trebuie sa salvez partea
DINAMICA din TSS(registrele de lucru normale, registrele segment, link selector.

5. Încarcă TR (+ porţiunea cache) cu SELECTOR, respectiv BAZA şi LIMITA noului TSS.


Pe scurt: accesarea TSS-ului tinta.
6. Actualizează registrele cu cele din noul TSS (în afară de cele segment şi LDTR).
Pe scurt: accesarea registrelor.

7. Dacă s-a folosit CALL, în noul TSS se realizează NT<-1.

8. Actualizează LDTR (+ porţiunea cache) cu elementele descriptorului LDT pentru noul proces.
74
Alex Mihăilă, 432B

Pe scurt: noua tabela de descriptori locali.

9. Actualizează registrele segment (+ porţiunile cache) cu elementele descriptoarelor pentru


segmentele de program, date şi stivă.
Pe scurt: aflu unde sunt segmentele de lucru curente.

10. Încarcă IP şi începe execuţia noului proces de la adresa virtuală dată de (CS) şi (IP).

Pe scurt: fac saltul efectiv -> ajung la noul proces.

Punctele pana la 4 se refera la task-ul care va fi parasit, din care plec; 5-10 la noul
proces, in care vreau sa ajung !

Poarta de proces = entitate prin care se realizeaza trecerea de la un proces la altul si-n
conditiile in care nivele de clasificare sunt diferite ; este un descriptor special, de tip b3; situat in
GDT, LDT sau IDT.

Orice poarta e o bresa de securitate – orice folosire a portii inseamna ca SO trebuie sa-si ia
masuri pentru gestionarea bresei de securitate.

Programul apelant trebuie sa aiba autorizatie / clasificare mai buna decat a portii de proces
ca sa treaca la programul apelat.

Poarta de proces tipica x86 : are 8 oteti ca orice descriptor; octetul de acces pe pozitia a
6-a.

Aceasta poarta este aproape goala! (decat 3 octeti sunt folositi: octetul alb si cel
verde(SELECTORUL) ).

Poarta trebuie sa-mi dea un acces sigur la tinta => PORTILE CONTIN ADRESELE
TINTA(asta e ideea de poarta) + PROPRIETATI aferente. Poarta de acces trebuie sa-mi spuna
75
Alex Mihăilă, 432B

doar unde este un segment prin care trebuie sa trec in prealabil ; in selector gasim index si
indicator de tabela.

Din adresa virtuala ma intereseaza doar un selector (vreau sa ajung la segment, nu si la


informatia din interiorul segmentului).

*Diferente intre poarta de proces si poarta de apelare:

Poarta de apelare contine adresa virtuala completa, reala (selector +offset) a tintei.

Poarta de proces – trebuie sa-mi spuna doar unde e un segment prin care sa trec -> ma
intereseaza doar selectorul nu si offset-ul pentru ca nu ma intereseaza o anumita informatie din
segment.

Exemplu de schimbare a proceselor prin poartă de proces :

Premise:
- fie două procese activate succesiv;
- fiecare proces are tabelă de descriptori locali proprie;
- LDT pentru procesul A conţine o poartă de proces pentru trecerea la procesul B.
În cazul în care se foloseşte o instrucţiune tip INT, poarta de proces pentru trecerea la
procesul B de află în IDT.

76
Alex Mihăilă, 432B

Daca am doar 2 procese, pot avea o singura LDT; nu trebuie neaparat sa fie 2, ca in cazul
de aici.

 Ce entitati apar pe desen?Tabele/segmente si ce contin fiecare dintre ele?

Exemplu: in cazul nostru, LDT A si LDT B, impuse de problema in sine; trebuie neaparat de
asemenea GDT (de ce?); apar 2 TSS-uri(practic cate unul pentru fiecare proces in parte – de
ce?)

 Ce contin fiecare dintre elementele enumerate?

De ce este goala LDT-eaua task-ului B: nu e goala! – ce e figurat pe desen sunt strict


elementele care intervin in cadrul schimbarii procesului (asta nu inseamna ca nu exista multe
alte informatii care intervin in toate tabelele / segmentele).

LDT B este plina de descriptori, de fapt; NU ARE cum sa fie goala; are programe, date,
stive etc. Nu are enititati implicate in task switching!

77
Alex Mihăilă, 432B

Conceptul Arduino = un hard, o placa, un black


box cu niste terminale standard, un soft (are deja incarcat un
sistem de operare) is intotdeauna acest hard vine insotiti e un
sistem de dezvoltare a programelor, un IDE (limbajul fiind C/
C++ cu anumite particularitati ). Poate fi legat cu o gama
foarte larga de placi auxiliare: SHIELD-uri (actionare motoare
pana la comanda voce ) => o particularitate de interfatare cu
foarte multe aplicatii.

Aceste terminale, pe scurt, sunt cateva intrari, digitale si analogice. Sistemul de operare e
un firmware care se poate actualiza. Avem memorii, care difera la divese variante de placi, avem
un flash memory in care e incarcat sistemul de operare.

Arduino autentic are in interior un SoC, de la ATMEL, numit Atmega328 ( cel putin la
UNO).

E o masina RISC!

Alte info:

- Putem sa concatenam 2 registre pentru dubla precizie (de precizat ca 8051 nu are aceasta
functie). Registrele sunt mapate in memorie ( ca la 8051).
- Intotdeauna registrele generale care sunt doar registre, sunt de fapt realizate ca niste
memorii.
- Inmultirile si impartirile sunt cablate, hard (tipic RISC).
- Setul de instructiuni contine instructiunile de control ale programului (instructiuni de salt)
=> nu urmaresc o secventa de instructiuni, ci doar fac saltul (nu exista procesor la care
apelul de program sa nu fie considerat altfel decat un simplu salt). Niciun procesor nu
implica transferul de parametrii, daca faci CALL e de fapt un salt.

Memoria este organizata liniar. Desi RISC, acest procesor nu are un format al
instructiunilor identic cu un RISC obisnuit !

Alte informatii in folder-ul „Arduino Info – Cap 5 2015”.

78
Alex Mihăilă, 432B

Familia de procesoare ARM


Primul procesor ARM a fost dezvoltat de Acorn Computers Limited, Cambridge,
England, 1983 – 1985: Acorn RISC Machine. A devenit ulterior acronimul de la Advanced
RISC Machine. O familie de procesoare pe 32 de biti ( primul lor procesor a fost de 32 de biti!)
.

Comparaţie cu predecesoarele RISC Berkeley RISC I şi II şi Stanford MIPS:

Asemănări:
 Acces în memorie cu instrucţiuni LOAD – STORE
 Instrucţiuni cu format fix pe 32 de biţi
 Prelucrarea datelor fără acumulator dedicat
 Puţine moduri de adresare

Deosebiri:
 Setul de lucru de registre nu este de 32 de registre şi nu există ferestre de
registre
 Instrucţiunile nu durează toate o singură stare
 Nu se foloseşte tehnica întârzierii salturilor pentru a preveni blocarea Unităţii
de control

De fapt, ARM este o combinaţie CISC – RISC. Setul de instrucţiuni are


caracteristici CISC mai mult decât RISC! Este o arhitectura Non-Von Neumann !

Moduri de lucru
1) Utilizator (usr) – modul normal de executie al programelor.
2) Privilegiat, impartit in :

a) Sistem (sys) – ruleaza procese ale sistemului de operare.


b) Moduri care trateaza exceptii, care sunt:

- Raspuns rapid la intreruperi (fiq) – transfer rapid de date.


- Răspuns normal la întreruperi (irq) răspuns normal la cereri de întreruperi .
- Supervizor (svc) mod protejat pentru sistemul de operare.
- Abort (abt) implementează mecanismul de protecţie în memoria virtuală.
- Nedefinit (und) emulare soft a coprocesoarelor hardware.

79
Alex Mihăilă, 432B

Setul de registre

Cate? Cat de mari? Fizice sau logice? Sunt sau nu atribute de arhitectura? Functiile lor
implicite?

- sunt registre de 32 de biti;


- cele mai multe sunt nededucate (multifunctionale);
- 37 de registre fizice distincte (31 generale + PC, numaratorul de program adica si 6
registre de stare);

In urmatoarea imagine avem 7 coloane, 7 moduri de lucru, dintre care 5 trateaza exceptiile.
Tot ce este alb inseamna un singur registru fizic unic, iar tot ce-i gri inseamna registre fizice
diferite !

80
Alex Mihăilă, 432B

 R0 – R7 sunt registre fizice.


 R8 – R14 sunt registre logice – în sensul ca pot fi translatate în registre fizice diferite,
astfel:
o R8 – R12 pot fi translatate în câte 2 registre fizice;
o R13 şi R14 pot fi translatate în câte 6 registre fizice.
 R15 este registru fizic.
Totalul registrelor de sus : 31 !

CPSR (current program status register) – registru fizic; un registru de fanioane.


SPSR (saved program status register) – registru logic ce poate fi translatat in 5 registre
fizice !
Totalul registrelor de sus : 6 !
6+31 = 37 de registre !

Alte informatii:

R13: indicator de stivă (stiva SOFT), un pointer pe 32 de biti, nededicat: SP ; implicit, dar
nu obligatoriu

R14: „registru de legătură”: LR (link register) ; un registru de revenire, unde poate fi


stocata adresa de revenire a unui program apelat
conţine adresa de reîntoarcere din subprograme

MOV PC, LR
sau
BX LR

R15 este numărătorul de program PC:


• poate fi registru general de date
• când e citit dă adresa instrucţiunii curente plus 8B
• ultimii 2 biţi sunt zero
• când se scrie în acest registru rezultatul e un salt la adresa înscrisă în R15; ultimii
2 biţi trebuie să fie zero
• este atribut de arhitectura (putem scrie si citi din el)
• unicul numarator !

CPSR este „registrul de stare al programului curent”. În modurile care tratează excepţii,
acest registru este trecut în SPSR “registrul de stare al programului salvat”.

81
Alex Mihăilă, 432B

Un registru de fanioane arata astfel:

N, Z, C, V – sunt fanioane aritmetico- logice;


restul – fanioane speciale;
Q- reprezinta un standard in momentul de fata.

Legenda:
N – negativ
Z – zero
C – transport
V – depăşire
Q – depăşire pentru instrucţiuni DSP
I – validarea întreruperilor normale
F – validarea întreruperilor rapide
T – indică trecerea la setul de instrucţiuni „Thumb”
M4 – M0 – indică modurile de lucru

Memoria si porturile

- memorie cu adrese fizice (AF) pe 32 de biti;


- memoria de 4GB, informatiile sunt aliniate;
- porturile sunt organizate ca locatii de memorie (memory mapped I/O); porturile sunt fizic
diferite, logic nu !
Obs:
-ARM poate sa faca si gestionarea memoriei virtuale;
-conceput sa lucreze cu pana la 16 coprocesoare (memory mangament unit);

Se folosesc atât „micul indian” cât şi „marele indian”. Nu există instrucţiuni


specifice pentru trecerea de la o convenţie la alta. Există un terminal de intrare
pentru a configura convenţia care se potriveşte cu memoria folosită.

Adresele instrucţiunilor:
• Salturi: AFsalt <-AF curentă + 8 + offset
• Secvenţial: AF instr. următoare<-AF instr. curentă + 4

82
Alex Mihăilă, 432B

Moduri de adresare

Toate sunt in mare pentru date. Sunt complexe. Adresa pentru accesul în memorie (LOAD
/ STORE) are 2 părţi:

• registru bază: oricare registru general R0 – R15; în cazul R15 (PC) avem, de fapt, o adresare
relativă;
• offset (AE):
- imediat: o constantă (întreg fără semn) care se adună sau se scade la registrul bază;
- registru: un registru general R0 – R14 care se adună sau scade la registrul bază;
- registru deplasat: un registru general R0 – R14 care este deplasat cu un număr de celule
indicat printr-o valoare imediată, iar rezultatul se adună sau scade la registrul bază.

Indiferent de tipul de offset, există trei moduri de a combina cele 2 entităţi:


• offset: cele 2 entităţi se adună sau se scad:
AF ←(r) ±AE
• pre-indexare: cele 2 entităţi se adună sau se scad; apoi registru bază este actualizat cu noua
adresă, ceea ce permite indexarea automată într-un şir:
AF ← (r) ± AE
(r) ← (r) ± AE
• post-indexare: se foloseşte doar registrul bază pentru adresare; apoi registru bază este
actualizat cu cele 2 entităţi se adună sau se scad, ceea ce permite indexarea automată într-un şir:
AF ← (r)
(r) ← (r) ±AE

Setul de instructiuni

Aproape toate instrucţiunile ARM sunt, de fapt, decizii simple: sunt testate fanioanele N,
Z, C,V din CPSR şi dacă este îndeplinită condiţia, instrucţiunile se desfăşoară normal.
Instrucţiunile conţin în format un câmp de 4 biţi [31:28] care codifică condiţia testată.

83
Alex Mihăilă, 432B

SALTURI :

Salturi propriu-zise în ecartul a 32 MB.


*Pot fi realizate şi prin înscrierea unei valori în R15 ≡PC

Apelul de subprograme cu instrucţiuni similare („Branch with Link”) tot în ecartul a 32 MB.
Adresa de revenire va fi în R14≡ LR.

„Branch and Exchange”:


(PC) ← (r)
if (PC)0 ≡ 1 se trece în setul de instrucţiuni Thumb

Încărcarea a 4 octeţi direct în R15 ≡ PC echivalează cu un salt lung în toată memoria de 4 GB.
Dacă în prealabil (LR) ← (PC) se generează un apel de subprogram în toată memoria de 4 GB.

Salturi condiţionate:

B Necondiţionat
BAL Întotdeauna
BEQ Salt dacă egal
BNE Salt dacă non-egal
BCS / BHS Salt dacă transport e 1 / Salt dacă mai mare sau la fel (fără semn)
BCC / BLO Salt dacă transport e 0 / Salt dacă mai mic (fără semn)
BPL Salt dacă plus / pozitiv sau zero
BMI Salt dacă minus / negativ
BVC Salt dacă nu e depăşire
BVS Salt dacă e depăşire
BHI Salt dacă mai mare (fără semn)
BLS Salt dacă mai mic sau la fel (fără semn)
BGT Salt dacă mai mare decât (cu semn)
BGE Salt dacă mai mare decât sau egal (cu semn)
BLT Salt dacă mai mic decât (cu semn)
BLE Salt dacă mai mic decât sau egal (cu semn)

alte exemple:
MOV PC, #0 adica R15 ←0;
MOV LR,PC ; (R14) ← (R15) ;gata pentru return
BL proc ;apel de procedură
MOV PC,LR ; (R15) ← (R14) ;return

B eticheta ; salt la eticheta


BCC eticheta ; salt condiţionat de (C) ←0
BEQ eticheta ; salt condiţionat de (Z) ←1

84
Alex Mihăilă, 432B

Prelucrari de date

Toti operanzii sunt pe 32 biti. Rezultatul este pe 32 biti si va fi un registru. Nu exista


acumulator; registrele pentru operanzi si rezultat sunt separate.

Nu există acumulator; registrele pentru operanzi şi rezultat sunt separate:

AND (d) ← (s) & operand


EOR (d) ← (s) +(incercuit) operand
SUB (d) ← (s) - operand
RSB (d) ←operand - (s)
ADD (d) ← (s) + operand
ADC (d) ← (s) + operand + (C)
SBC (d) ← (s) – operand – NOT(C)
RSC (d) ←operand - (s) – NOT(C)
TST (s) & operand
TEQ (s) ← operand
CMP (s) - operand
CMN (s) + operand
ORR (d) ← (s) ∀ operand
MOV (d) ← (s)
BIC (d) ← (s) & NOToperand
MVN (d) ←NOT(s)
• (d) şi (s) sunt registre generale.
• operand este o valoare imediată sau un registru general care poate fi şi deplasat.

Deplasări:

LSL deplasare logică stânga


LSR deplasare logică dreapta
ASL deplasare aritmetică stânga
ASR deplasare aritmetică dreapta
ROR rotaţie dreapta
RRX rotaţie dreapta o poziţie folosind C

Setarea fanioanelor se face opţional (cu excepţia comparaţiilor) se face indicând în


asamblor un „S” la mnemonică; de exemplu ADDS.

85
Alex Mihăilă, 432B

Inmultiri

Care se pot efectua pe 32 si pe 64 de biti, cu si fara acumulator:

MUL ; 32 ←32 * 32
MLA ; 32 ←32 * 32 + 32
SMULL ; 64 ←32 * 32
UMULL ; 64 ←32 * 32
SMLAL ; 64 ←32 * 32 + 64
UMLAL ; 64 ←32 * 32 + 64

Înmulţire „normală”:

• MUL operanzii sunt în 2 registre generale, rezultatul este trunchiat la 32 biţi şi stocat în alt
registru.
• MLA operanzii sunt în 2 registre generale, se adună conţinutul unui al treilea registru,
rezultatul este trunchiat la 32 biţi şi stocat în al patrulea registru „înmulţire cu acumulare”).

Înmulţire „lungă”:

• SMULL operanzii sunt în 2 registre generale şi rezultatul, pe 64 biţi este stocat în alte 2
registre concatenate; numerele sunt întregi cu semn;
• UMULL operanzii sunt în 2 registre generale şi rezultatul, pe 64 biţi este stocat în alte 2
registre concatenate; numerele sunt întregi fără semn;
• SMLAL operanzii sunt în 2 registre generale, la rezultat se adună conţinutul a 2 registre
concatenate şi rezultatul este stocat în aceste al treilea şi al patrulea registru; numerele sunt
întregi cu semn;
• UMLAL operanzii sunt în 2 registre generale, la rezultat se adună conţinutul a 2 registre
concatenate şi rezultatul este stocat în aceste al treilea şi al patrulea registru; numerele sunt
întregi fără semn.

Exemple:

MUL R4, R2, R1 ; (R4) ← (R2)*(R1)


MLA R7, R8, R9, R3 ; (R7) ← (R8)*(R9) + (R3)
SMULL R4, R8, R2, R3 ; (R4) ↑ (R8) ← (R2)*(R3)
UMULL R6, R8, R0, R1 ; (R6) ↑ (R8) ← (R0)*(R1)
UMLAL R5, R8, R0, R1 ; (R5) ↑ (R8) ← (R0)*(R1) + (R5) ↑ (R8)

86
Alex Mihăilă, 432B

Instrucţiuni aritmetice speciale

CLZ înscrie într-un registru numărul de cifre binare 0 ale unui operand din alt
registru, începând cu msb şi până la primul 1.
Determină câte deplasări stânga sunt necesare pentru normalizarea unui
operand. Determină bitul cu prioritatea maximă într-o mască binară.
ex: CLZ R4, R2

Accesul in memorie

Tipuri de instrucţiuni LOAD / STORE:


• 32 biţi, întregi fără semn;
• 8 sau 16 biţi întregi fără semn;
• 8 sau 16 biţi, întregi cu semn.

Se folosesc modurile de adresare amintite.

LDR Încarcă 32 biţi într-un registru general


LDRB Încarcă 8 biţi într-un registru general
LDRH Încarcă 16 biţi (întreg fără semn) într-un registru general
LDRSB Încarcă 8 biţi (întreg cu semn) într-un registru general
LDRSH Încarcă 16 biţi (întreg cu semn) într-un registru general
STR Memorează 32 biţi dintr-un registru de uz general
STRB Memorează 8 biţi dintr-un registru de uz general
SRH Memorează 16 biţi dintr-un registru de uz general
LDM Încarcă un subset sau toate registrele generale
STRM Memorează un subset sau toate registrele generale
SWP Inter-schimbă 32 biţi între registre şi memorie
SWPB Inter-schimbă 8 biţi între registre şi memorie

87
Alex Mihăilă, 432B

88
Alex Mihăilă, 432B

Instrucţiuni coprocesoarelor

Arhitectura ARM permite un mecanism general pentru extinderea setului de instrucţiuni prin
adăugarea unor coprocesoare care se ocupă cu:

• controlul memoriilor cache şi gestionarea memoriei (paginare);


• operaţii în virgulă mobilă;
• funcţii specifice unor aplicaţii.

Suportă până la 16 coprocesoare logice. Fiecare coprocesor poate avea până la 16 registre
proprii de mărimi diverse. Coprocesoarele au arhitecturi RISC, cu instrucţiuni care:

• execută operaţii interne cu registrele;


• accesează memoria cu LOAD şi STORE;
• schimbă date cu registrele nucleului ARM.

Coprocesoarele pot fi adăugate pe cip sau pe placă.

89
Alex Mihăilă, 432B

Alte exemple de instructiuni specifice ARM ! (nu apar in slide-uri) :


Exemplu 1:
00F8 START MOV R10, #0 ; (R10) ←0
00FC MOV R0, #4 ; (R0) ←4
0100 LOOP ADD R10, R10, R11; (R10) ←(R10)+(R11)
0104 SUB R0, R0, #1 ; (R0) ←(R0)-1
0108 CMP R0, #0; (R0)-0
010C BNE LOOP; if (R0) #0 then (PC) ←0100
0110 FINISH
observam cum e din 4 in 4 in memorie !

Exemplu 2:
ADD R0, R1, R2 ; (R0) = (R1) + (R2)
ADD R0, R1, #256 ; (R0) = (R1) + 256
ADD R0, R2, R3,LSL#3 ; (R0) = (R2) + (R3 << 1)
// sau (R0) = (R2) + (R3)*2^3

Exemplu 3:
RSB R0, R1, R2 ; (R0) = (R2) – (R1)
RSB R0, R1, #256 ; (R0) = 256 – (R1)
RSB R0, R2, R3,LSL#1 ; (R0) = (R3 << 1) – (R2)
// sau (R0) = (R3)*2^1 – (R2)

Exemplu 4:
SUB R0, R1, R2 ; (R0) = (R1) – (R2)
SUB R0, R1, #256 ; (R0) = (R1) - 256
SUB R0, R2, R3,LSL#1 ; (R0) = (R2) - (R3 << 1)
// sau (R0)=(R2)-(R3)*2^1

90
Alex Mihăilă, 432B

91

S-ar putea să vă placă și