Documente Academic
Documente Profesional
Documente Cultură
Microcontrollere Curs 2016 Corneliu Burileanu PDF
Microcontrollere Curs 2016 Corneliu Burileanu PDF
Microcontrolere – 2016
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 :
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
c) timer 0: 000BH
e) timer 1: 001BH
2) Memoria 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 !!!
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.
CX AC FU RS1 RS0 OV - P
7 6 5 4 3 2 1 0
SBUF = buffer de date seriale folosit la transferul serie; fizic este alcatuit din 2 registre (
unul pentru receptie si unul pentru transmisie);
TH0, TL0 = 2 numaratoare pe cate 8 biti care alcatuiesc impreuna un numarator pe 16 biti
pentru Timer-ul 0;
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 .
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
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
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;
11
Alex Mihăilă, 432B
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
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
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) 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
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.
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:
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).
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).
1. Paginile sunt fixe ca dimensiuni, dar riguros concatenate in memorie, una dupa alta (analogic
cu o carte!).
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.
17
Alex Mihăilă, 432B
*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).
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:
18
Alex Mihăilă, 432B
SELECTOR = adr16; numarul maxim de segmente = 2^14 (16k segmente); doar 14 biti
utilizabili
si AF= adr32
*In ambele cazuri, 16 biti si 32 biti, observam cateva aspecte importante de retinut:
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
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. ).
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 ;
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;
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
- 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 !!!
22
Alex Mihăilă, 432B
Comentariu:
a) intai trebuie sa gasesc subdiviziunea logica in care se gaseste informatia dorita(in cazul
de fata segmentul);
Translatarea adresei virtuale in adresa fizica in cazul in care informatia vizata se afla in
spatiul adreselor globale
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
Comentariu:
24
Alex Mihăilă, 432B
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 :
Comentariu:
26
Alex Mihăilă, 432B
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
28
Alex Mihăilă, 432B
- 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:
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);
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:
Paginarea la x86 poate sa aiba mai multe granularitati; la Pentium au aparut si pagini de
4MB!
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
32
Alex Mihăilă, 432B
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
34
Alex Mihăilă, 432B
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;
- 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
!!!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;
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) .
37
Alex Mihăilă, 432B
LEGENDA:
38
Alex Mihăilă, 432B
cu :
Element director – descriptor; se gaseste adaugand la baza index-ul inmultit inainte cu 4(pentru
aliniere);
Element tabela – descriptor;
sesizam ca:
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
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; !!!!
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.
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;
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 !
43
Alex Mihăilă, 432B
Campurile: AE obligatiu 12 biti; urmatoarele ... (aici nu avem tabele director! nu e INTEL).
44
Alex Mihăilă, 432B
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:
Ce protejam de fapt?
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 !)
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
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;
2. Verificari privind tipurile de informatii (ex: daca vizez un program, nu am cum sa vreau
sa scriu acolo).
47
Alex Mihăilă, 432B
– 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
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”..
48
Alex Mihăilă, 432B
Este foarte general! Exista aplicatii ale acestuia in tot felul de situatii!
Nivele de protectie
Algoritm de lucru
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
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!
observatii:
50
Alex Mihăilă, 432B
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!
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:
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) !
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
Excepţii:
Stiva e mai pretioasa decat un segment de date implicit; e tratat la un nivel de importanta
mai mare
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
VERIFICAREA I:
*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:
54
Alex Mihăilă, 432B
• 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.
55
Alex Mihăilă, 432B
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.
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
58
Alex Mihăilă, 432B
Daca acest segment e la alt nivel de priviliegiu? Se intampla ce vedem in partea 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
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.
60
Alex Mihăilă, 432B
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 !).
2. Este interzisă apelarea unui modul de program mai puţin privilegiat (numeric – nivel mai
mare).
61
Alex Mihăilă, 432B
EXEMPLE :
62
Alex Mihăilă, 432B
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
- 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 ) !
- (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 !
OBSERVATII:
65
Alex Mihăilă, 432B
Variante de întreruperi:
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 !
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
OBSERVATII:
Accesul la o poartă e posibil numai dacă Regula 1 a privilegiilor multi-nivel este respectată.
67
Alex Mihăilă, 432B
- 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.
exemplu : sir de led-uri aprinse, una pe rand, la o anumita frecventa, par aprinse simultan.
TSS e descris, ca orice segment de către un descriptor special de control de tip b2 numit
descriptor TSS– desciptor de sistem.
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 !
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;
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.
*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
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.
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 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.
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ă:
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 !
8. Actualizează LDTR (+ porţiunea cache) cu elementele descriptorului LDT pentru noul proces.
74
Alex Mihăilă, 432B
10. Încarcă IP şi începe execuţia noului proces de la adresa virtuală dată de (CS) şi (IP).
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.
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.
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.
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?)
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
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 !
78
Alex Mihăilă, 432B
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
Moduri de lucru
1) Utilizator (usr) – modul normal de executie al programelor.
2) Privilegiat, impartit in :
79
Alex Mihăilă, 432B
Setul de registre
Cate? Cat de mari? Fizice sau logice? Sunt sau nu atribute de arhitectura? Functiile lor
implicite?
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
Alte informatii:
R13: indicator de stivă (stiva SOFT), un pointer pe 32 de biti, nededicat: SP ; implicit, dar
nu obligatoriu
MOV PC, LR
sau
BX LR
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
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
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ă.
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 :
Apelul de subprograme cu instrucţiuni similare („Branch with Link”) tot în ecartul a 32 MB.
Adresa de revenire va fi în R14≡ LR.
Î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
84
Alex Mihăilă, 432B
Prelucrari de date
Deplasări:
85
Alex Mihăilă, 432B
Inmultiri
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:
86
Alex Mihăilă, 432B
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
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:
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:
89
Alex Mihăilă, 432B
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