Despre User Mode vs Kernel Mode si System Calls
Rolul unui sistem de operare modern este “sa se se poarte” ca un server pentru zecile de aplicatii care ruleaza “peste el”.Ce vreau sa zic cu asta?…Functiile cele mai importante ale unui sistem de operare sunt inglobate in asa numitul KERNEL..care pe langa altele are rolul de a oferi un environment pentru diverse aplicatii.Atunci cand o aplicatie ruleaza,ea are nevoie de diverse servicii,puse la dispozitie de sistemul de operare.Cum poate o aplicatie sa “ceara” un anumit serviciu de la sistemul de operare(kernel)?…prin asa numitele apeluri sistem.Voi incepe o discutie despre apelurile sistem,despre suportul hardware oferit,si despre cum foloseste windows-ul acest suport venit din hardware pentru “a-si face treaba”.
In primul rand sa vedem ce inseamna USER MODE,respectiv KERNEL MODE.
In cel mai simplu fel explicat …kernel mode inseamna modul in care se afla procesorul atunci cand executa codul din kernelul unui sistem de operare,iar user mode este modul in care se afla procesorul atunci cand executa codul unei aplicatii oarecare.Insa ce inseamna acest “mod”….cum trateaza procesorul acest mod si alte chestii de genul asta….
In Familia de procesoare Intel incepand cu procesorul 386,procesoarele pot executa cod in modul protejat,sau in modul real.Vom vorbi despre modul porotejat.Modul protejat reprezinta de fapt o suita de trick-uri ca sa zic asa introduse in arhitectura intel,in scopul de a oferi protectie intre mai multe aplicatii ce se executa simultan pe acelasi calculator.Practic “protected mode” a fost introdus in arhitectura x86 de dragul multitasking-ului.Aceasta inseamna o serie de mecanisme de protectie a memoriei intre aplicatii,precum si protectie in segmentele de memorie ale aceleiasi aplicatii,respectiv suport pentru memorie virtuala prin segmentare si paginare:-)
In modul protejat exista 3 feluri de protectie itre segmentele din memorie:type checking,limit checking si privilege checking.
Pana sa ajungem la astea sa vedem care este faza cu segmentele de memorie.Segmentarea ca mod de gestiune a memoriei a fost introdus de catre Intel la procesorul (nu mai stiu exact care)…cred ca 8086:P.Un segment de meorie reprezinta un spatiu de adresare independent,prectic reprezinta o “bucata” de memorie in care putem stoca anumite informati.Aceste informatii poti fi accesate printr-un selector de segment incarcat intr-un registru segement al procesorului.Acest selector de segment reprezinta adresa de baza,sau adresa primului octet din cadrul segmentului.O aplicatie poate avea mai multe segmente,fiecare segment putand contine diverse informatii.De exmplu pot exista segmente de cod,care contin instructiunile programului,segmente de date,care contin structurile de date,variabile si constantele programului,respectiv stiva programului folosita pentru apelutri de proceduri.In general o aplciatie poate avea unul sau mai multe segmente de cod,unul sau mai multe segmente de date,si cel putin o stiva.Compilatorul este cel care se ocupa de crearea segmentelor.De exmplu fiecare modul dintr-o aplicatie poate fi reprezentat in memorie pentr-un segment de cod,iar fiecare modul care contine definitii de stucturi de date globale poate fi reprezentat printr-un segment de date.
O aplicatie,in modul protejat pe langa toate acestea mai are un segment special nimit LDT(Local Descriptor Table),care contine cate un descriptor de segment pentru fiecare segment al aplicatiei.
In modul real,pentru a accesa o anumita locatie de memorie,ne trebuie doua “componente”:un selector de segment si un offset in cadrul acelui segment.Selectorul de segment ne indica segmentul din memorie,unde se afla locatia pe care noi dorim sa o accesam,iar offset-ul(deplasamentul) in cadrul segmentului,reprezinta adresa in cadrul segmentului unde se afla locatia de memorie pe care dorim sa o accesam.De exemplu 10:23,inseamna locatia de memorie de la adresa 23(al-23-lea octet) din segmentul 10.In modul real aceste doua componente sunt adunate pentru a forma adresa fizica a locatiei dorite.In modul protejat,selectorul de segment,care este incarcat intr-un registru segment nu indica adresa fizica a primului octet din cadrul segmentului,ci reprezinta un offset in cadrul tabelei LDT,catre descriptorul de segment asociat segmentului dorit.Si aici (in modul protejat) exista un offset in cadrul acelui segment,care va fi adunat la adresa de baza a segmentului,ce va fi gasita in descriptorul de segment.Acest mecanism este folosit pentru a oferi protectie intre aplicatii,adica mai multe aplicatii ce exista simultan in memorie poti fi mapate in acelasi spatiu de adrese.In modul real din cadrul unui program putem accesa orice segment,indiferent daca acel segment apartine sa nu programului nostru,pe cand in modul protejat fiecare program nu poate accesa decat segmentele proprii,prin intermediul LDT.Fiercare program are un LDT,cu un anumit numar de descriptori(in functie de aplicatie—cat de “mare” este)iar orice segment de memorie va fi accesat prin LDT-ul curent(cel al aplicatiei)
Dupa cum vedeti in aceasta imagine,un descriptor are mai multe campuri.De exemplu campul Base Address care reprezinta un camp pe 32 de biti ce contine adresa de baza a segmentului.Mai avem campul Limit(pe 24 de biti) care reprezinta adresa ultimului octet din cadrul segmentului,precum si campuri referitoare la protectia segmentului.Bitul P daca este setat inseamna ca segmentul este in memorie la momentul accesului;daca este resetat,atunci segmentul nu este prezent in memorie,iar orice acces la el va rezulta o exceptie #NP(Not Present).Acest camp este folositor in sisteme care implementeaza memoria virtuala folosind segmente in loc de pagini de 4KB
Campul DPL(Descriptor Privilege Level) reprezinta nivelul privilegiul la care trebuie sa fim pentru a putea accesa acest segment.
Campul Type este pe 4 biti si reprezinta tipul segmentului…de cod de date,precum si ce actiuni avem voie sa facem in cadrul acestui segment.De exemplu ..exista segmente de date care sunt Read-Only,sau segmente de date care pot fi Read-Write.
Bitul S(System) daca este setat inseamna ca este vorba despre un segment al unei aplicatii(de date sau de cod sau stiva….stivele sunt tratate tot ca segmente de date de tip Read-Write…logic:P),iar daca estev reset inseamna ca este vorba de un segment sistem sau de o “poarta” (segment LDT,segment TSS,CALL GATE,TRAP GATE,TASK GATE sau INTERRUPT GATE)
Explore posts in the same categories: Interuperi & Exceptii
June 26, 2007 at 7:27 am
Am o intrbeare ! Ok am inteles LDT-ul ce face …Dar cine creeaza LDT-ul (compilatorul ? si cum ?)si ce rost are GDT-ul ?
June 26, 2007 at 8:18 am
LDT-ul nu este creat de compilator……in aplicatiile vechi care utilizau segmente…sistemul de operare este cel care creaza LDT-ul pentru un proces…si initializeaza toate intrarile din el…..insa in sistemele noi Windows/Linux procesele nu mai au nevoie de un LDT…deoarece aceste sisteme nu mai folosesc memorie segmentata,decat foarte putin(pentru a implementa translatia User mode/kernel Mode),ci folosesc memorie paginata
In ceea ce privesete GDT….aceasta este o tabela globala unde se afla diversi descriprtori
Ca sa intelegi mai bine …..o sa-ti exemplific cu ce se intampla in Windows cu GDT-ul.
In GDT,windows-ul isi pastreaza 4 descriptori….doi pentru segmente de date si doi pentr segmente de cod…dintre care un segment de date si unul de cod au DPL = 0 (KERNEL MODE),iar celelalte segmente ramase(de cod si de date) au DPL = 3(USER MODE).
Deci exista doua segmente cu DPL = 3 si alte doua segmente cu DPL = 0.
Base Address-ul la fiecare descriptor din cele 4 este 0×00000000 iar campul Limit este 0xFFFFFF cu bitul G = 1 deci aceste segmente au toate 4GB si se suparapun “unul peste altul”:P….Acesta este modelul de memorie FLAT folosind segmente….iar peste asta Windows-ul implementeaza paginarea.De ce exista asa ceva?…..in primul rand segmentarea este un “serviciu” nativ in x86..care nu poate fi dezactivat…deci fie ca vrei fie ca nu vrei…nu poti sa scapi de ea:P….iar Windows-ul ca si Linux-ul incearca sa “scape” de segmentare si sa foloseasca in loc paginarea pentru ca este mult mai eficienta pentru implementarea memoriei virtuale…in fine…o sa scriu la un articol despre paginare vs segmentare da nu inainte de a mai scrie un articol despre segmentare unde sa dau mai multe detalii despre acest subiect….Deci concluzia este ca LDT-ul nu este creat de compilator…iar GDT-ul joaca rol de LDT in sistemele de operare moderne …in sistemele vechi…..el avea doar niste descriptori ..precum descriptorii TSS….si diferiti descriptori de ti poarta(Trap Gates/Interrupt Gates)…
June 26, 2007 at 9:04 am
Ok thx a lot …astept cu interes urmatorul tau articol…cu totusi ca mai aveam doua intrebari.
1. Deci dupa ce se obtine o adresa prin mecanismul GDT de fapt se obtine o adresa la o pagina de memorie (cu dimensiune, drepturi etc ) am i right ?
2. Cum funcitoneaza un hexeditor (adica daca vreau sa vad toata memoria sa zigem 2GB de windows ? Cum e posibil ? caci GDT-ul ar trebuie sa ma impiedice .)
Thx a lot !