Download as pdf or txt
Download as pdf or txt
You are on page 1of 125

Sistemski softver (operativni sistemi)

Prof. Boris Damjanović

Boris Damjanović P 1.1


Dualni režim rada (Dual Mode Operation)

• Osnovni problem koji se pri prevođenju adresa


može javiti jeste da
– neki program možda može da
– prepiše i poremeti svoju ili tuđu translacionu mapu.

• Da se ovo ne bi desilo, potreban nam je drugi


mehanizam
– koji se naziva dual mode operation.

Boris Damjanović P 1.2


Dualni režim rada (Dual Mode Operation)

• Većina hardvera koja danas postoji na tržištu omogućava rad


u
– najmanje dva načina rada (modes of operation). Postoje
» mod jezgra (mod kernela) i
» korisnički mod.

• Mod jezgra je zaštićeni mod u kom se izvršava


• samo kernel operativnog sistema i
– za koji važe posebna pravila i
• korisnički mod u kom se
– izvršavaju normalni programi.
• Kod ovakvih sistema, hardveru je dodat najmanje jedan bit
(mode bit),
– koji pokazuje trenutni režim rada:
– mod jezgra (0) ili
– mod korisničkog procesa (1).

Boris Damjanović P 1.3


Dualni režim rada (Dual Mode Operation)

• Hardver i memorija koju koristi MMU


– pripadaju modu jezgra.

• Na ovaj način korisnički programi ne mogu da


unište translacionu mapu,
– jer nju može da mijenja samo kernel.

• Ovo je implementirano na takav način da se


– neke instrukcije mogu izvršiti samo iz moda jezgra.

• Ako ih pozovemo iz korisničkog moda,


– one će proizvesti poruku da je došlo do greške.

Boris Damjanović P 1.4


Dualni režim rada (Dual Mode Operation)

• Problem koji se javlja kada se koristi korisnički


mod je taj da
– ponekad korisnička aplikacija mora da koristi usluge
operativnog sistema
» (sistemski pozivi, interapti, obrada grešaka)
– koje se nalaze u modu jezgra.
» Dakle, mora postojati način za prelazak iz korisničkog
moda u mod jezgra.

• Ova situacija se takođe rješava


– pomoću arhitekture računara.

Boris Damjanović P 1.5


Dualni režim rada (Dual Mode Operation)

• Na slici je prikazan korisnički proces koji


– traži uslugu operativnog sistema
– pomoću sistemskog poziva.

• Pri ovom pozivu dolazi do


– poziva posebne CPU instrukcije pod imenom TRAP.

Boris Damjanović P 1.6


Dualni režim rada (Dual Mode Operation)

• U različitim arhitekturama
– ova funkcija može imati različita imena
» (npr. syscall na MIPS ISA arhitekturi).
• Ova instrukcija prebacuje izvršenje u kernel mod
– i nastavlja izvršenje od tačno određene lokacije u
memoriji,
– na kojoj se nalazi kod pozvane sistemske rutine.

Boris Damjanović P 1.7


Dualni režim rada (Dual Mode Operation)

• Sam povratak u korisnički mod je jednostavan,


– jer ova operacija se izvršava na jednostavan način
od strane kernela.

• Povratak u korisnički mod nije opasan,


– ono što je ovdje od interesa je siguran prelazak u
kernel mod.

Boris Damjanović P 1.8


Dualni režim rada (Dual Mode Operation)

• Svaki moderniji procesor koji podržava izvršenje u


više načina rada (više modova)
– ima nekoliko bita ili status registre
– u kojima navodi u kom modu (npr. korisnički ili kernel)
– se program izvršava.
» Na IA32 arhitekturi, to su biti 12 i 13 u FLAGS registru

• Procesori x86 generacije imaju 4 ovakva moda:


– jedan za jezgro (kernel),
– dva za upravljačke programe i
– jedan za korisničke programe.
• Tipično se koriste Ring 0 i 3.

Boris Damjanović P 1.9


Dualni režim rada (Dual Mode Operation)

• Dakle, dva navedena mehanizma


– prevođenje adresa (address translation) i
– dualni režim rada (dual mode operation)
• koriste se za primjenu politike da
– programima nije dozvoljeno da očitavaju niti upisuju
podatke
– u memoriju koja pripada drugim programima i koja
pripada operativnom sistemu.

Boris Damjanović P 1.10


Dualni režim rada (Dual Mode Operation)

• Standardna struktura operativnog sistema


– Linux/Unix prikazana je na slici.

Boris Damjanović P 1.11


Dualni režim rada (Dual Mode Operation)

• U kernel modu se nalaze


– ulazno – izlazni sistem,
– fajl sistem, swapping sistem,
– upravljač virtuelnom memorijom,
– raspoređivač procesa itd.

Boris Damjanović P 1.12


Dualni režim rada (Dual Mode Operation)

• U prikazanom primjeru, programi koji se izvršavaju


u modu jezgra
– mogu da pristupe operativnoj memoriji drugog
programa koji se takođe izvršava u modu jezgra
– i da obore njegovo izvršenje.

Boris Damjanović P 1.13


Dualni režim rada (Dual Mode Operation)

• Prikazani primjer predstavlja operativni sistem sa


monolitnim jezgrom u kojem
– jedan proces koji pripada jezgru (kernelu)
– može da prepiše ili uništi neki drugi proces koji
pripada jezgru.

Boris Damjanović P 1.14


Dualni režim rada (Dual Mode Operation)

• Za ostvarivanje zaštite,
– operativni sistem mora da se osloni na usluge hardvera.
• Hardver minimalno mora da podrži tri stvari:
– privilegovane instrukcije,
– zaštita memorije i
– tajmer prekidi (interapti).

Boris Damjanović P 1.15


(1) Privilegovane instrukcije

• Izolacija procesa moguća je jedino


– ako se mogu ograničiti programi (procesi) koji su
pokrenuti u korisničkom modu
– da samostalno mijenjaju nivo privilegija (privilege
level) koji imaju.

• Procesi mogu indirektno da mijenjaju svoj nivo


– pomoću posebne vrste poziva koja se naziva
– sistemski pozivi da bi kontrolu
– prepustili kernelu na fiksnim lokacijama
– koje su definisane od strane operativnog sistema.

Boris Damjanović P 1.16


(1) Privilegovane instrukcije

• Osim ovog načina, koji je utvrđen od strane


operativnog sistema,
– aplikacije ne mogu da mijenjaju svoj nivo privilegija.

• Aplikacija takođe ne može da mijenja skup


memorijskih adresa kojima može da pristupa,
– jer joj ne smije biti dozvoljeno da ošteti ili mijenja
kod ili podatke
– koji pripadaju drugim aplikacijama.

Boris Damjanović P 1.17


(1) Privilegovane instrukcije

• Instrukcije koje su dostupne kernelu, ali ne i


korisničkim aplikacijama
– nazivaju se privilegovane instrukcije (privileged
instructions).

• Da bi mogao ispravno da funkcioniše,


– kernel operativnog sistema mora da ima mogućnost
da izvršava ove instrukcije –
» mora da promijeni nivo privilegija,
» prilagodi memorijske adrese i
» zabrani odnosno omogući izvršenje prekida (interrupt).

Boris Damjanović P 1.18


(1) Privilegovane instrukcije

• Na ovaj način korisnički programi


– mogu da izvršavaju samo ograničen skup
instrukcija,
– dok samo operativni sistem u kernel modu
– ima mogućnost da iskoristi pune mogućnosti
hardvera.

Boris Damjanović P 1.19


(2) Zaštita memorije

• Da bi mogao da pokrene neku korisničku aplikaciju,


– operativni sistem i aplikacija moraju biti
– istovremeno učitani (rezidentni)
– u primarnoj (operativnoj , RAM) memoriji.

• Aplikacija mora biti učitana u primarnu memoriju


da bi mogla biti izvršavana,
– dok operativni sistem tu mora da bude da bi
pokrenuo navedeni program i
» da bi obrađivao prekide (interrupt),
» obezbjedio obradu grešaka i
» izvršenje sistemskih poziva.

Boris Damjanović P 1.20


(2) Zaštita memorije

• Takođe, mora se voditi računa o tome da i


– drugi korisnički programi mogu da budu
– istovremeno upisani u primarnu memoriju.

• Npr. istovremeno sa kucanjem teksta u programu za


obradu teksta,
– može biti pokrenut internet pretraživač i e-mail
klijent.

Boris Damjanović P 1.21


(2) Zaštita memorije

• Da bi dodjela memorije mogla da bude sigurna,


– operativni sistem mora da bude u stanju da
konfiguriše hardver
– tako da bi svaki aplikacioni proces mogao da čita i
piše samo vlastitu memoriju,
– ali ne i memoriju operativnog sistema i drugih
korisničkih aplikacija.

• U suprotnom, korisnički program bi mogao da


– izmijeni kod jezgra (kernela) ili
– da omogući potencijalnom napadaču da preuzme punu
kontrolu nad računarom.

Boris Damjanović P 1.22


(2) Zaštita memorije

• Rani računarski sistemi su pružali neke


– osnovne mehanizme pomoću kojih se mogla obezbijediti
zaštita memorije.
• Posmatramo registre Base i Bound

Boris Damjanović P 1.23


(2) Zaštita memorije

• Kod ovakvog pristupa, CPU posjeduje


– dva dodatna registra koji se nazivaju base i bound.
• Base registar drži adresu na kojoj
– počinje memorijski region koji je dodijeljen korisničkom procesu,
• dok bound registar drži adresu na kojoj
– završava ovaj region koji pripada korisničkom procesu.

Boris Damjanović P 1.24


(2) Zaštita memorije

• Sadržaj ovih registara može da bude izmijenjen


– samo od strane privilegovanih instrukcija u modu
kernela,
– dok instrukcije na korisničkom nivou
» ne mogu da mijenjaju ove registre

Boris Damjanović P 1.25


(2) Zaštita memorije

• Svaki put kada procesor treba da očita neku


instrukciju iz operativne (RAM) memorije,
– on najprije provjeri da li je adresa
– na koju pokazuje pokazivač instrukcije (instruction
pointer)
– između vrijednosti koje se nalaze u base i bound
registrima.

Boris Damjanović P 1.26


(2) Zaštita memorije

• Ako jeste, CPU će dozvoliti


– očitavanje ove instrukcije i ona će biti izvršena.
• Ako nije, hardver će izazvati grešku i nakon toga preusmjeriti
izvršenje ka (dati kontrolu) operativnom sistemu.
• Naravno, noviji računarski sistemi koriste
– nešto naprednija rješenja poput virtuelnog adresiranja.

Boris Damjanović P 1.27


(2) Zaštita memorije

• Kada je u pitanju očitavanje podataka iz memorije


odnosno upisivanje podataka u memoriju,
– procesor primjenjuje isti princip i
– izaziva poruku da je došlo do greške (exception -
izuzetak)
– ako su narušene granice koje su postavljene pomoću
navedenih registara.

Boris Damjanović P 1.28


(2) Zaštita memorije

• Kernel (jezgro) operativng sistema


– se izvršava bez ograničenja koje postavljaju base i bound
registri.
• Zbog toga, kernel ima pravo pristupa
– vlastitoj (sistemskoj) memoriji i
– memoriji svih korisničkih programa.

Boris Damjanović P 1.29


(2) Zaštita memorije

• Na primjer, kernel mora da kopira


– izlazne i ulazne podatke u aplikaciju osnosno iz
aplikacije.
• Konkretnije, za program koji u konzoli
– treba da ispiše „Hello World“,
– kernel mora da kopira string
» iz memorijskog prostora aplikacije u bafer za ispis na
ekran.

Boris Damjanović P 1.30


(2) Zaštita memorije
Proširivost heap i stack memorije
• Ipak, ovakav pristup koji se
– oslanja na korišćenje base i bound registara
– ne može da riješi sve probleme.

• Problem br. 1: Proširivost heap i stack memorije.


• Sa jednim parom base i bound registara po procesu,
– količina memorije koja je alocirana
– po nekom programu ostaje fiksna kada se program
pokrene.

• Svaki program ima bar dva regiona (stack i heap) memorije


– koji moraju da se proširuju u toku izvršavanja programa.

Boris Damjanović P 1.31


(2) Zaštita memorije
Proširivost heap i stack memorije
• Kako smo već vidjeli u prethodnim poglavljima,
– region poznat pod imenom stack memorija se
povećava pri svakom pozivu potprograma,
– pri čemu se formira struktura koja opisuje
redoslijed pozivanja potprograma (call graph).

• U ranijim poglavljima smo spominjali i da se


– region pod nazivom heap memorija
» povećava sa alociranjem dinamičkih struktura, poput
dinamičkih nizova.

Boris Damjanović P 1.32


(2) Zaštita memorije
Proširivost heap i stack memorije
• Na većini operativnih sistema, ova dva regiona
memorije (stack i heap)
– povećavaju se u suprotnim smjerovima u toku
izvršenja programa,
– zbog čega je današnje procese teško ograničiti
pomoću para registara base i bound.
max
stack

Adresni prostor programa

heap

data

kod
0

Boris Damjanović P 1.33


(2) Zaštita memorije
Dijeljenje memorije (memory sharing)
• Problem br. 2: Dijeljenje memorije (memory
sharing).

• Postojanje base i bound registara


– ne dozvoljava da neki region memorije bude
zajednički,
» odnosno dostupan za više procesa radi razmjene
podataka.

Boris Damjanović P 1.34


(2) Zaštita memorije
Fragmentacija memorije
• Problem br. 3: Fragmentacija memorije.

• Kada se koriste base i bound registri,


– postaje gotovo nemoguće da se neki program premjesti
(realocira) u drugi dio memorije.

• Za izvršenje svakog procesa,


– potreban je kontinuiran dio memorije.

• Vremenom, sa pokretanjem sve većeg broja procesa,


– postaje gotovo nemoguće da se pronađe
– kontinuiran dio memorije u koji je moguće učitati program.

Boris Damjanović P 1.35


(2) Zaštita memorije
Virtuelno adresiranje
• Zbog svega nabrojanog, današnji operativni sistemi
– koriste jedan nivo indirekcije koji se naziva virtuelno
adresiranje.

• Sa virtuelnim adresama,
– memorijski prostor svakog procesa
– počinje na istom mjestu, na adresi nula.

• Svaki proces pri tome „misli“


– da ima na raspolaganju kompletnu mašinu za sebe.
• U toku izvršenja, hardver (ranije pominjani MMU)
prevodi
– ove virtuelne adrese u fizičke adrese.

Boris Damjanović P 1.36


(2) Zaštita memorije
Virtuelno adresiranje
• Ovaj nivo indirekcije omogućava operativnim sistemima
– ogromnu fleksibilnost kada je u pitanju iskorišćenje
fizičke memorije.

• Mnogi sistemi koji koriste virtuelni adresni prostor


– po potrebi povećavaju količinu alocirane memorije
– u fiksnim fragmentima, umjesto u varijabilnim, da bi
smanjili fragmentaciju.
Prostor prije uvećanja

Progam prije uvećanja

Prostor nakon uvećanja

Progam nakon uvećanja

Boris Damjanović P 1.37


(2) Zaštita memorije
Virtuelno adresiranje
• Virtuelno adresiranje omogućava
– optimalno zauzeće heap i stack memorije na
suprotnim stranama
– prostora koji je dodijeljen procesu i njihovo
uvećavanje po potrebi.

Boris Damjanović P 1.38


(2) Zaštita memorije
Virtuelno adresiranje
• Virtuelno adresiranje omogućava da
– jedan proces „misli“ da na raspolaganju ima
– mnogo više prostora za uvećanje heap i stack
memorija,
– dok je stvarno, fizičko zauzeće memorije mnogo
efikasnije.

Boris Damjanović P 1.39


(2) Zaštita memorije
Virtuelno adresiranje
• Pomoću sljedećeg fragmenta koda moguće je
– utvrditi da li računar podržava virtuelnu memoriju.
• U programu je kreirana jedna statička varijabla (staticVar),
– a potom je pozvana funkcija Sleep() koja će na određeno vrijeme (na OS
Windows u milisekundama) zadržati izvršenje programa.
• Nakon toga se ispisuje
– adresa (&staticVar) na kojoj se nalazi navedena varijabla i
– njena vrijednost.

#include <windows.h>;

#include <stdio.h>;

int staticVar = 0;

void main(){

staticVar += 1;

Sleep(10000);

printf("Adresa: %x Vrijednost: %d \n", &staticVar, staticVar);

Boris Damjanović P 1.40


(2) Zaštita memorije
Virtuelno adresiranje
• Ako navedeni izvorni kod prevedemo, pa istovremeno
– pokrenemo dvije instance istog programa,
– obje će printati isti rezultat na izlazu.
• Oba programa će misliti da na raspolaganju imaju kompletan
računar,
– pa će adresa statičke varijable u oba programa biti iste (iako to nije
fizički moguće).
• Virtuelno adresiranje će stvoriti iluziju
– da se ova varijabla nalazi na istoj lokaciji,
– iako će programi i njihove statičke varijable
– (data dijelovi memorije) biti fizički na različitim lokacijama.

Boris Damjanović P 1.41


(2) Zaštita memorije
Virtuelno adresiranje
• Računarski virusi često koriste
– loše napisane korisničke programe za različite
napade.

• Jedna od vrsta napada koristi loše napisan


– kod koji ne provjerava dužinu niza kod ulaznog polja.

• Ako je bafer za čuvanje podataka smješten na


steku,
– napadač može da prepiše povratnu adresu (nekom
lokacijom koja je smještena u nizu) i
– da prenese izvršenje na vlastiti potprogram.

Boris Damjanović P 1.42


(2) Zaštita memorije
Virtuelno adresiranje
• Na ovaj način, napadač može da
– prelijevanjem ulaznog polja
– kriera programski skok u vlastiti potprogram
– odakle može da nastavi sa izvršenjem vlastitog koda.

• Ovakvi napadi se mnogo lakše izvode


– kada heap i stack memorija
– počinju uvijek na istoj adresi.

Boris Damjanović P 1.43


(2) Zaštita memorije
Virtuelno adresiranje
• Zbog toga, kada je u pitanju stack i heap memorija,
– operativni sistemi koriste
– randomizaciju adresnog prostora (address space layout
randomization).

• Randomizacija se zasniva na
– dodavanju malog slučajnog (random) broja
– adresi lokacije na kojoj počinju heap i stack memorije.

• Ako bi ranije prikazani program koristili da


– ispišemo varijablu koja je smještena na heap-u ili na stack-u,
– adresa te varijable bila bi za svaku instancu programa različita.

Boris Damjanović P 1.44


Randomizacija adresnog prostora (Win10)
#include <windows.h>;
#include <stdio.h>;
int staticVar = 0;
void main() {
int *ptr;
ptr = (int *)malloc(sizeof(int));
staticVar += 1;
Sleep(4000);
printf("Adresa: %x Vrijednost: %d \n", &staticVar, staticVar);
printf("Adresa: %x Vrijednost: %d \n", &ptr, ptr);
free(ptr);
}

Boris Damjanović P 1.45


(3) Tajmer prekidi (Timer Interapts)

• Izolacija procesa zahtjeva da postoji


– hardverska mogućnost da
– operativni sistem povremeno vrati kontrolu nad
procesorom.

• Od momenta kada operativni sistem pokrene


korisnički program,
– čini se kao da korisnički program ima kompletan
računar na raspolaganju.

• Ipak, ovo se ne može dozvoliti.

Boris Damjanović P 1.46


(3) Tajmer prekidi (Timer Interapts)

• Ako npr. aplikacija upadne u beskonačnu petlju ili


– ako npr. korisnik postane nestrpljiv i odluči da
zaustavi izvršenje nekog programa,
– operativni sistem mora imati mogućnost da vrati
kontrolu nad procesorom i računarom.

• Takođe, ako korisnik npr. sluša muziku,


– operativni sistem mora da bude u stanju da
periodično preuzme kontrolu nad procesorom
– da bi odgovorio na ulazne zahtjeve korisnika i
– da bi mogao da neometano izvršava i druge programe
koje korisnik koristi.

Boris Damjanović P 1.47


(3) Tajmer prekidi (Timer Interapts)

• Zbog ovoga, gotovo svi računari danas


– imaju uređaj koji se naziva hardverski tajmer
(hardvare timer).

• Ovaj tajmer može da bude podešen


– da prekine procesor nakon isteka određenog
intervala
» npr. određenog vremena,
» određenog broja instrukcija ili
» određenog broja ciklusa mikroprocesora.

Boris Damjanović P 1.48


(3) Tajmer prekidi (Timer Interapts)

• Svaki mikroprocesor mora da ima vlastiti tajmer,


– tako da na višeprocesorskom sistemu
– postoji po jedan tajmer za svaki procesor.

• Operativni sistem obično postavlja tajmer na
nekoliko milisekundi.

• Resetovanje tajmera je privilegovana operacija


– koju može da izvršava samo kernel,
– tako da korisnički program ne može slučajno ni
zlonamjerno da zaustavi ovaj tajmer.

Boris Damjanović P 1.49


(3) Tajmer prekidi (Timer Interapts)

• Kad god istekne interval definisan tajmerom,


– dešava se hardverski prekid (interapt) koji
– prekida izvršenje korisničkog programa
– i na kratko prenosi kontrolu na jezgro operativnog
sistema u kernel modu.

• Nakon kratkotrajnog izvršenja jezgra operativnog


sistema,
– operativni sistem vraća kontrolu korisničkom
programu kojeg je prekinuo
– tako što mu vraća programski brojač, registre i
prebacuje ga u korisnički mod.

Boris Damjanović P 1.50


Realizacija promjene načina rada (mod)
korisnik - kernel

• Realizacija promjene načina rada (mod) korisnik -


kernel

Boris Damjanović P 1.51


Realizacija promjene načina rada (mod)
korisnik - kernel
• Kada kernel smjesti korisnički program u
izolovano virtuelno okruženje (sandbox),
– postavlja se pitanje koji je siguran način da se
izvede prebacivanje
– iz kernel moda u korisnički (user) mod i obrnuto.

Boris Damjanović P 1.52


Realizacija promjene načina rada (mod)
korisnik - kernel
• Ovakvi prelazi
– iz kernel moda u korisnički mod
– uopšte nisu rijetki.

• Neki Web server može preći


– iz jednog načina rada u drugi način rada
– hiljadama puta u sekundi.

• Zbog toga, ovi prelasci moraju biti veoma brzi i


sigurni,
– pri čemu ne smiju ostavljati ni malo mogućnosti da
– loše napisan ili maliciozan program obori jezgro
sistema.

Boris Damjanović P 1.53


Prebacivanje iz korisničkog u mod jezgra

• Postoje tri mogućnosti da kernel prekine korisnički


proces u izvršenju. To su
– (1) prekidi (interrupts),
– (2) izuzeci (greške, exceptions) koje generiše
procesor i
– (3) sistemski pozivi.

• (1) Prekidi (interapti) se izvršavaju asinhrono.

• To znači da su oni pokrenuti


– od strane vanjskog signala na osnovu nekog događaja
– i da se izvršenje može prenijeti sa korisničkog
programa na jezgro operativnog sistema
– u bilo kom momentu (dakle asinhrono!).
Boris Damjanović P 1.54
Prebacivanje iz korisničkog u mod jezgra

• (2 i 3) Izuzeci i sistemski pozivi su


– sinhroni događaji koji se pokreću
– od strane programa koji se izvršava na procesoru.

• Koristi se termin trap da se opiše


– sinhroni prenos kontrole
– sa korisničkog moda u kernel.

• Neki sistemi koriste ovaj termin (trap)


– da uopšteno opišu sinhrono prebacivanje
– sa nivoa koji ima manje prava na nivo koji ima više
prava.

Boris Damjanović P 1.55


(1) Prekidi (interrupts) - detaljnije

• (1) Prekid ili interapt (interrupt) je asinhroni


signal (događaj, event)
– pomoću kojeg računarski sistem signalizira
mikroprocesoru
– da neki vanjski sklop ili program možda zahtjeva
njegovu intervenciju.

• U toku izvršavanja instrukcija nekog programa,


– procesor sam provjerava da li je došlo do prekida
– ili mu to neki eksterni sklop javlja.

Boris Damjanović P 1.56


(1) Prekidi (interrupts)

• Kada se desi prekid,


– CPU prekida izvršenje procesa kojeg je do tog
trenutka izvršavao.

• Po dobijanju ovog signala, procesor dovršava


trenutno započetu instrukciju i
– umjesto očitavanja slijedeće instrukcije
– on hardverski snima stanje svojih registara
» pokazivač instrukcije, pokazivač steka itd.,
– a potom u pokazivač instrukcije
– učitava adresu posebnog upravljačkog (handler)
programa
– koji je zadužen za obradu navedenog prekida.

Boris Damjanović P 1.57


(1) Prekidi (interrupts)

• Na višeprocesorskim sistemima,
– prekid se izvršava samo na jednom procesoru,
– dok ostali nastavljaju svoje izvršenje kao da se
ništa nije desilo.

Boris Damjanović P 1.58


(1) Prekidi (interrupts)

• Svaki prekid mora da ima vlastiti upravljački


program
– koji je napisan za obradu tog specifičnog događaja.

• Npr. jedan takav prekid može biti kreiran


– za prihvatanje podataka sa mrežne karte,
– drugi za modem,
– treći za obradu podataka sa tastature itd.

Boris Damjanović P 1.59


(1) Prekidi (interrupts)

• Prekidi se takođe koriste i da bi se


– informisao procesor o tome
– da je neki I/O uređaj završio sa obradom nekog
zahtjeva.

• Npr. hardver koji kontroliše funkcionisanje miša


– okida (triggers) prekid svaki put
– kada korisnik pomakne ili klikne na miša.

Boris Damjanović P 1.60


(1) Prekidi (interrupts)

• Na osnovu ovog prekida,


– kernel ima mogućnost da obavjesti korisnički program
– da je došlo do npr. pomjeranja miša,
– pa aplikacija može da kreira različite efekte poput button hover
efekta.

Boris Damjanović P 1.61


(1) Prekidi (interrupts)

• U ranijim poglavljima smo vidjeli da je alternativa


mehanizmu prekida
– tehnika koja se naziva pooling.

• Pri izvršenju ove tehnike, procesor u jednoj petlji


– obilazi sve uređaje i
– provjerava da li bilo koji U/I uređaj zahtjeva
njegovu pažnju.

• Međutim, ovo je starija i lošija tehnika


– koja oduzima mnogo više vremena mikroprocesora.

Boris Damjanović P 1.62


(1) Prekidi (interrupts)

• Osim tradicionalnih prekida,


– postoje i inter-procesorski prekidi.

• Ovi prekidi se koriste u višeprocesorskim sistemima


– da bi jedan procesor
– poslao prekid drugim procesorima.

• Kernel koristi te prekide da bi


– koordinirao akcije među različitim procesorima.

• Na primjer, kada se paralelni program završi na jednom


procesoru,
– kernel šalje pomoću prekida signal ostalim procesorima
– da je navedeni proces završen.

Boris Damjanović P 1.63


(2) Izuzeci procesora (processor exception)

• Izuzetak procesora (processor exeption) je


– hardverski događaj koji je izazvan od strane
korisničkog programa i
– koji prenosi kontrolu izvršenja na kernel.

• Kao i u slučaju prekida,


– hardver završava izvršenje svih prethodnih
instrukcija,
– snima trenutno stanje procesora i
– počinje sa izvršenjem specijalnog programa za
obradu izuzetaka (exception handler).

Boris Damjanović P 1.64


(2) Izuzeci procesora (processor exception)

• Na primjer, izuzetak se dešava

– pri dijeljenju sa nulom ili

– kada korisnički proces pokuša da pristupi


dijelu memorije kojem je pristup
zabranjen, ili

– ako pokuša da izvrši neku privilegovanu


instrukciju.

Boris Damjanović P 1.65


(2) Izuzeci procesora (processor exception)

• Izuzeci se mogu javiti i


– kada je u nekom programu postavljena prekidna
tačka (breakpoint).

• Tada će procesor zamijeniti mašinsku instrukciju


koju je očitao iz memorije
– sa specijalnom instrukcijom pod nazivom trap.

• Kada program dođe do navedene tačke,


– hardver prebacuje izvršenje u kernel mod.

Boris Damjanović P 1.66


(2) Izuzeci procesora (processor exception)

• Kernel restaurira originalnu instrukciju i


– prenosi kontrolu na dibager (debugger).

• U okviru ovog programa (procesa) moguće je


– pregledati varijable,
– postaviti novu prekidnu tačku u originalnom
programu,
– izvršavati program korak po korak te
– nastaviti sa izvršenjem do kraja ili do slijedeće
prekidne tačke.

Boris Damjanović P 1.67


(3) Sistemski pozivi (System Calls)

• Korisnički programi mogu da prenesu izvršenje


– na jezgro operativnog sistema u kernel mod
– pomoću izvršenja posebnih sistemskih programa
– koji se nalaze u sastavu operativnog sistema.

• Sistemski poziv (System Call) je


– bilo koja procedura koja se nalazi u sastavu kernela
– i koja može biti pozvana od strane programa
– koji se izvršava na korisničkom nivou.

Boris Damjanović P 1.68


(3) Sistemski pozivi (System Calls)

• Jedan dio mikroprocesora


– pokreće sistemske pozive pomoću posebne
– trap ili syscal instrukcije.

• Kao i u slučaju prekida i izuzetaka,


– u slučaju sistemskog poziva
– izvršenje programa prebacuje se sa korisničkog
moda u mod jezgra,
– kada počinje da se izvršava neki predefinisani
upravljački potprogram (handler).

Boris Damjanović P 1.69


(3) Sistemski pozivi (System Calls)

• Operativni sistem može da obezbjedi veliki broj


sistemskih poziva,
• poput sistemskih poziva za
– povezivanje na web server,
– za slanje ili primanje paketa putem mreže,
– za kreiranje i brisanje datoteka,
– za upisivanje i očitavanje podataka iz datoteka,
– za kreiranje novog korisničkog procesa itd.

Boris Damjanović P 1.70


(3) Sistemski pozivi (System Calls)

• Neki od naziva sistemskih poziva na operativnom


sistemu Linux su npr.
– fcntl() za zaključavanje datoteka,
– fsync() i fdatasync() za pražnjenje bafera koji se
nalaze u operativnoj memorij i koji još nisu upisani u
datoteku,
– getrlimit() i setrlimit() za postavljanje limita u
resursima (memorija, CPU) koje neki proces može da
alocira,
– gettimeofday() za očitavanje sistemskog sata i mnogi
drugi.

Boris Damjanović P 1.71


Prebacivanje iz moda jezgra u korisnički mod

• Kao što postoje različiti načini za


– prebacivanje iz korisničkog moda u mod jezgra,
• tako postoje različiti načini za
– prebacivanje iz moda jezgra u korisnički mod:

1. Pokretanje novog procesa.


2. Nastavak izvršenja procesa nakon prekida
(interrupt), izuzetka ili sistemskog poziva.
3. Prenos izvršenja na drugi proces.
4. Poziv iz sistema nižeg nivoa (User Level Upcall).

Boris Damjanović P 1.72


Prebacivanje iz moda jezgra u korisnički mod
(1) Pokretanje novog procesa
• (1) Pokretanje novog procesa.

• Kada pokreće novi proces,


– kernel kopira program u primarnu memoriju,
– postavlja programski brojač (pokazivač instrukcija)
na prvu instrukciju programa,
– postavlja pokazivač steka na početak steka
korisničkog procesa i
– prebacuje se u korisnički mod.

Boris Damjanović P 1.73


Prebacivanje iz moda jezgra u korisnički mod
(2) Nastavak izvršenja procesa
• (2) Nastavak izvršenja procesa nakon prekida
(interrupt), izuzetka ili sistemskog poziva.

• Kada kernel završi sa obradom upravljačkog


programa
– koji je prekinuo izvršenje nekog programa,
– on restaurira njegov programski brojač (pokazivač
instrukcija)
– tako da ponovo pokazuje mjesto na kom je program
prekinut,
– restaurira ostale njegove registre i
– nastavlja sa izvršenjem prekinutog programa.

Boris Damjanović P 1.74


Prebacivanje iz moda jezgra u korisnički mod
(3) Prenos izvršenja na drugi proces
• (3) Prenos izvršenja na drugi proces.
• U nekim slučajevima, poput aktiviranja tajmer prekida,
– kernel prenosi izvršenje na drugi proces.
• Pošto će se kasnije ponovo vratiti na izvršenje prekinutog
procesa,
– on mora da sačuva stanje prekinutog procesa –
– njegov programski brojač, registre itd.

• Kada se vrati na prekinuti proces,


– on učitava njegovo stanje - programski brojač, registre itd.
– iz strukture pod nazivom PCB i TCB (process control block i
thread control block),
– i prelazi u korisnički mod i nastavlja sa njegovim izvršenjem.

Boris Damjanović P 1.75


Prebacivanje iz moda jezgra u korisnički mod
(4) Poziv iz sistema nižeg nivoa
• Poziv iz sistema nižeg nivoa (User Level Upcall).

• Mnogi operativni sistemi imaju mogućnost


– da omoguće korisničkim programima
– da primaju asinhrona obavještenja o različitim
događajima (events).

• Ovaj mehanizam je sličan upravljanju prekidima,


– ali na korisničkom nivou.

Boris Damjanović P 1.76


Impelemntacija sigurne promjene načina rada
(moda)
• Prelazak iz korisničkog moda u kernel mod i nazad
– mora biti izveden uz maksimalnu pažnju
– da se ne bi desilo da pogrešno napisana ili maliciozna
aplikacija korumpira kernel.

• Kod koji izvodi prebacivanje sa jednog na drugi


mod
– i odgovarajuća hardverska podrška
– moraju da budu precizno izvedeni.

Boris Damjanović P 1.77


Impelemntacija sigurne promjene načina rada
(moda)
• U nastavku će na jednom mjestu biti
prikazani ili ponovljeni
– hardverski i softverski koncepti i mehanizmi
– koji se koriste za realizaciju
» interapta, izuzetaka procesora i sistemskih
poziva.

Boris Damjanović P 1.78


Tabela vektora prekida IVT
(Interrupt Vector Table)
• Kada dođe do prekida, operativni sistem mora da
preduzme
– različite akcije u zavsnosti od tipa prekida.
• Za obavljanje ovog zadatka koristi se
– Tabela vektora prekida,
» u kojoj je svaki red pobrojan i
» drži adresu neke rutine za obradu prekida.

Boris Damjanović P 1.79


Tabela vektora prekida IVT
(Interrupt Vector Table)
• Jednostavnim učitavanjem adrese
– koja je zapisana u nekom redu tabele
– u registar programski brojač (pokazivač instrukcije)
– prenosi se kontrola na rutinu za obradu datog
prekida (interrupt handler)
– čiji početak se nalazi na datoj adresi u operativnoj
memoriji.

Boris Damjanović P 1.80


Tabela vektora prekida IVT
(Interrupt Vector Table)
• Tabela vektora prekida mora da bude
– smještena u prostoru kernela.

• Ako bi ova tabela bila smještena u korisničkom


dijelu memorije,
– tada bi korisnički programi mogli da je modifikuju.

• To bi dovelo do velikog broja sigurnosnih propusta,


jer bi korisnički programi mogli
– da se ubacuju umjesto pravih rutina za obradu
prekida ili nakon njih.

Boris Damjanović P 1.81


Tabela vektora prekida IVT
(Interrupt Vector Table)
• Primjer bi bio zlonamjerni program
• koji bi mogao da otme (hijack) npr. mrežnu kartu

• Ovaj napad se može izvesti tako da se


– rutina za obradu prekida može preusmjeriti
– tako da se najprije izvršava korisnički program koji
može da analizira pakete,
– pa tek potom na pravu rutinu koja radi koristan
posao.

Boris Damjanović P 1.82


Tabela vektora prekida IVT
(Interrupt Vector Table)
• Postavlja se pitanje
– koji procesor treba da obrađuje zahtjeve za
obradom prekida
– u slučaju multiprocesorskih sistema?

• U ranim verzijama ovakvih sistema,


– sve ovakve zahtjeve obrađivao je
– jedan isti, nulti procesor (processor 0).

• Ovakav pristup je u računarskim sistemima


– u kojima se obavljalo mnogo ulaznih i izlaznih
operacija
– predstavljao usko grlo.

Boris Damjanović P 1.83


Tabela vektora prekida IVT
(Interrupt Vector Table)
• U modernim multiprocesorskim sistemima,
– ovakve zahtjeve obavljaju svi procesori podjednako.

• Svaki procesor ima svoj vlastiti hardverski tajmer.

• Ulazno/izlazne operacije koje su pokrenute od


strane pojedinih procesora
– koriste odgovarajuće prekidne rutine.

• Te rutine se izvršavaju na procesorima


– sa kojih su navedene U/I operacije pokrenute.

Boris Damjanović P 1.84


Stek prekida odnosno kernela
(interrupt stack, kernel stack)
• Na većini procesora postoji
– specijalni, privilegovani hardverski registar
– koji pokazuje na region memorije koji pripada
kernelu i
– koji se naziva stek prekida (interrupt stack) ili stek
kernela.
» Za ove svrhe se na pojedinim arhitekturama koriste
registri opšte namjene.
• Kada neki prekid, izuzetak ili sistemski poziv
– izazove prebacivanje konteksta (context switch) u
kernel,
– hardverski registar pokazivač steka biva podešen
– da pokazuje na početak kernelovog steka koji je
namjenjen za prekide.

Boris Damjanović P 1.85


Stek prekida odnosno kernela
(interrupt stack, kernel stack)
• Kada se rutina za obradu prekida, izuzetka ili
sistemskog poziva pokrene,
– ostatak registara biva gurnut na ovaj poseban stek
koji pripada prekidu
– prije nego što navedena rutina započne sa svojim
izvršenjem.

• Kada se vrši povratak iz rutine za obradu prekida,


izuzetka ili sistemskog poziva,
– dešava se obrnuta sekvenca događaja –
– sa steka koji pripada prekidu se
– skidaju vrijednosti i upisuju u odgovarajuće registre.

Boris Damjanović P 1.86


Stek prekida odnosno kernela
(interrupt stack, kernel stack)
• Za ove svrhe ne smije da se koristi
– stek korisničkog programa zbog slijedeća dva
razloga:

• Pouzdanost.
• Ako je program loše napisan,
– korisnikov pokazivač steka može pokazivati na
pogrešnu lokaciju,
– zbog čega povratak u korisnikov program
» neće moći da bude izvršen na korektan način.

Boris Damjanović P 1.87


Stek prekida odnosno kernela
(interrupt stack, kernel stack)
• Sigurnost.
• U višeprocesorskim sistemima,
– zajedno sa korisnikovom apliakcijom se
– izvršavaju brojne druge niti i procesi.
• Neki od njih bi mogli
– da budu maliciozni.

• Ako je korisnički program loše napisan,


– neki maliciozni proces bi mogao da izmjeni stek
korisničkog programa
– toliko da izmjeni povratnu adresu
– tako da po povratku počne da se izvršava proizvoljan
maliciozni program.

Boris Damjanović P 1.88


Dva steka po procesu

• Mnogi operativni sistemi idu korak dalje i


– dodjeljuju kernelov ili stek prekida (interrupt
stack)
– za svaki proces koji se izvršava na korisničkom
nivou.

• Kada se izvršava korisnički proces,


– privilegovani registar pokazuje na kernelov ili
stek prekida datog procesa.

Boris Damjanović P 1.89


Dva steka po procesu

• Rezervisanje jednog kernelovog steka


– po svakom procesu
• olakšava prebacivanje konteksta
– u momentu dok se izvršava neki sistemski poziv.

• Npr. već pokrenut sistemski poziv mora da čeka


– dok se ne završi neka U/I operacija.

• Da se ne bi gubilo vrijeme,
– upravljački program koji pokreće
– tajmer prekid može odlučiti da se ne gubi vrijeme,
– već da neki drugi proces može da se izvršava.

Boris Damjanović P 1.90


Dva steka po procesu

• Kada se koristi kernelov stek prekida (kernel interrupt


stack)
– za svaki proces,
– dovoljno je sačuvati pokazivač na kernelov stek
– u PCB (process control block) strukturi.
• U većini operativnih sistema, svaki proces ima dva steka:
– jedan za izvršenje korisničkog koda i
– jedan za izvršenje koda jezgra.
• Na slici su data tri različita stanja procesa.

Boris Damjanović P 1.91


Dva steka po procesu

• Kada se proces izvršava u korisničkom režimu,


– stek jezgra je prazan.

Boris Damjanović P 1.92


Dva steka po procesu

• Kada je proces spreman da nastavi svoje izvršenje


» (npr. nakon nekog prekida),
» ali još nije nastavio,
– stek jezgra će sadržavati stanje korisničkog procesa
» u momentu kada je njegovo izvršenje prekinuto.
• Takođe, ako uslijed dejstva nekog algoritma za dodjelu
procesora,
– proces čeka da dođe njegov red na izvršenje,
– stek jezgra će sadržavati stanje njegovih registara
– da bi nastavio njegovo izvršenje.

Boris Damjanović P 1.93


Dva steka po procesu

• U momentu kada proces izvršava


– neki sistemski poziv koji čeka da se završi neka U/I (I/O)
operacija,
» stek jezgra sadrži kontekst sistemskog poziva
• (registar pokazivač instrukcije)
• koji omogućava nastavak sistemskog poziva,
» a korisnički stek kontekst korisničkog procesa
• (pokazivač instrukcije koji pokazuje odakle treba nastaviti
izvršenje glavnog programa),
• koji omogućava nastavak izvršenja korisničkog procesa nakon
poziva sistemske rutine (sistemskog potprograma).

Boris Damjanović P 1.94


Dva steka po procesu

• Za potpuno razumjevanje slike potrebno je znati


– kako operativni sistem Linux upravlja prekidima
– koji mogu trajati malo duže, poput U/I poziva.
• U operativnom sistemu Linux
– poziv prekida koji bi mogli duže trajati
– je podijeljen na dva dijela koji se nazivaju top half i bottom
half.

Boris Damjanović P 1.95


Dva steka po procesu

• Top half dio veoma brzo reaguje i


– npr. u slučaju upisivanja podataka u neki U/I sklop
– popuni bafere podacima,
– pokrene bottom half dio i
– vrati izvršenje procesu koji ga je pozvao.

• Bottom half nastavlja da radi sporije operacije


– koje obuhvataju inicijalizaciju i pripremu U/I uređaja za rad i
– fizičko zapisivanje podataka.

• Za to vrijeme, top half je u stanju da


– primi novi zahtjev za prekidom
– iako bottom half još radi.

Boris Damjanović P 1.96


Dva steka po procesu

• Da ponovimo:
• Kada se proces izvršava u korisničkom modu,
– stek kernela je prazan.
• Stek procesa sadrži
– povratne adrese pozvanih potprograma
» proc1, proc2.
• Prvi (lijeva kolona) dio slike: Running

Boris Damjanović P 1.97


Dva steka po procesu

• Ako se proces izvršava u modu jezgra,


– zbog prekidne rutine, izuzetka ili sistemskog poziva,
– imaćemo situaciju koja je na slici nazvana ready to run.
• Dio slike: Ready to run.

Boris Damjanović P 1.98


Dva steka po procesu

• Pri povratku, kada je korisnički proces


– pripremljen za izvršenje (preempted) ali još nije pokrenut,
• njegov stek kernela će sadržavati vrijednosti registara
korisničkog procesa
– u momentu kada je prekinut i
» kada je izvršenje preneseno na npr. prekidnu rutinu.
• Dio slike: Ready to run.

Boris Damjanović P 1.99


Dva steka po procesu

• Kada se proces nalazi unutar sistemskog poziva


– koji je zatražio intervenciju upravljačkog programa
(driver) i koji
» čeka da se izvrši neka ulazno/izlazna operacija,
– stek kernela sadrži kontekst potreban
– da se nastavi prekinuto izvršenje operacija kernela.
• Dio slike: Waiting for IO

Boris Damjanović P 1.100


Dva steka po procesu

• Na slici je prikazana situacija u kojoj su


– na steku kernela zapisani podaci
– potrebni za nastavak izvršenja sistemskog poziva
(syscall handler).

• Dio slike: Waiting for IO

Boris Damjanović P 1.101


Dva steka po procesu

• Kako ovakve I/O rutine


– obično pozivaju neku prekidnu rutinu,
• na steku kernela će se naći i adresa
– od koje treba nastaviti
– po povratku iz top half (IO driver top-half) dijela nekog
prekida (interrupt).

• Waiting for IO

Boris Damjanović P 1.102


Dva steka po procesu

• Stek korisničkog progama sadrži


– prvu adresu nakon sistemskog poziva (syscall)
– nakon koje treba nastaviti sa izvršenjem.

• Waiting for IO

Boris Damjanović P 1.103


Namjerno prazna stranica

• Namjerno prazna stranica

Boris Damjanović P 1.104


Maskiranje prekida

• Prekidi se izvršavaju asinhrono[1].

• Kada dođe do zahtjeva za prekidom,


– procesor bi mogao izvršavati kod
» u korisničkom ili u modu kernela.

• Međutim, prihvatanje prekida


– u momentu kada se već izvršava neki drugi prekid
– moglo bi da dovede do neželjenih posljedica.

– [1] Asinhrono IZVRŠENJE ovdje znači da se prekid može javiti u bilo kom momentu.
» Treba uočiti razliku između sinhronih (blokirajućih) poziva potprograma i asinhronih (ne-
blokirajućih) poziva. Ako je poziv sinhron, tada će izvršenje glavnog programa biti
zaustavljeno sve do završetka potprograma.

Boris Damjanović P 1.105


Maskiranje prekida

• Da bi pojednostavili izradu kernela,


– proizvođači hardvera su ostavili mogućnost da se
– privremeno zabrani izvršenje pojedinih prekida.
• Na x86 arhitekturi postoji
– instrukcija kojom se postavlja i uklanja IF bit
» (Interrupt Enable Fleg) u procesoru.
– Pomoću njega se omogućava ili zabranjuje
» prihvatanje zahtjeva za prekid opšteg tipa koji dolaze
na ulaz INTR.
» Ako je IF=0 onemogućeno je prihvatanje

Registar bita stanja mp 8086


15 0

OF DF IF TF SF ZF AF PF CF

Boris Damjanović P 1.106


Maskiranje prekida

• Ukoliko istovremeno pristigne jedan ili


– više zahtjeva za prekid
– u momentu kada je prihvatanje prekida zabranjeno,
– hardver će ih ponovo isporučiti kada prekidi budu
ponovo dozvoljeni.

• Registar bita stanja na 32-bitnoj arhitekturi

Boris Damjanović P 1.107


Namjerno prazna stranica

• Namjerno prazna stranica

Boris Damjanović P 1.108


Hardverska podrška za čuvanje registara

• U slučaju kada dođe do prekida ili


sistemskog poziva,
– vrijednosti regstara moraju da budu sačuvane
– da bi program mogao da nastavi izvršenje
– po završetku rada pozvane sistemske rutine.

Boris Damjanović P 1.109


Hardverska podrška za čuvanje registara

• Pošto bi pozvana rutina (handler)


– mogla da izmjeni stanje registara,
– njihov sadržaj mora da bude snimljen prije početka
njegovog izvršenja.

• Zbog ovoga, većina proizvođača procesora tipično


– ima instrukcije koje omogućavaju da se
– sačuva stanje procesora i da se ono ponovo učita u
registre procesora.

Boris Damjanović P 1.110


Hardverska podrška za čuvanje registara

• Hardverski se obično čuvaju vrijednosti registara


– pokazivača steka,
– pokazivača instrukcije i
– registra Program Status Word
» (PSW je kombinacija registara Akumulator i Flegs).

Boris Damjanović P 1.111


Hardverska podrška za čuvanje registara

• U momentu kada je handler pokrenut,


– na 32-bitnoj x86 arhitekturi on može da
– pozove pushad (push all double) instrukciju,
» na 64 bitnim arhitekturama više ne postoji pushad
• zbog zauzeća memorije
– koja će snimiti sadržaj svih 32-bitnih registara na
stek.

• U slučaju 16-bitne x86 arhitekture koristi se


– instrukcija pusha za guranje na stek
» svih 16-bitnih registara.

Boris Damjanović P 1.112


Hardverska podrška za čuvanje registara

• Arhitektura x86 posjeduje instrukcije koje se


koriste za restauriranje stanja.
• Instrukcija popad služi za
– vraćanje vrijednosti sa steka u registre,

• dok iret instrukcija pri povratku iz prekidne rutine


– vraća vrijednost
» pokazivača steka,
» pokazivača instrukcije i
» registra PSW.

Boris Damjanović P 1.113


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• U nastavku će biti prikazano
– kako se vrši promjena
– iz korisničkog moda u mod kernela,
– u slučaju prekida (inetrrupt).

• Različiti operativni sistemi i


– različite arhitekture računara
• će koristiti neznatno različite detalje prelaska
– iz korisničkog moda u mod kernela,
– ali će suština ostati ista.

Boris Damjanović P 1.114


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• Potpuno shvatanje
– prebacivanje konteksta (context switch)
• zahtjeva da se još jednom podsjetimo arhitekture
računara.

• Adresiranje se kod starijih, 16 bitnih x86


arhitektura obavlja
– uz pomoć dva registra –
– segmetnog dijela, koji drži adresu segmenta i
– pokazivača, koji pokazuje tačnu adresu unutar
segmenta.

Boris Damjanović P 1.115


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• I u novijm arhitekturama situacija je slična.

• Konkretno, u slučaju 32-bitne arhitekture,


– adresa slijedeće instrukcije je smještena u paru
registara
» CS (Code Segment) i
» EIP (Instruction Pointer).

Boris Damjanović P 1.116


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• Slično, adresa steka je određena uz pomoć para registara
– SS (Stack Segment) i
– ESP (Stack Pointer).

• U momentu dok se izvršava neki korisnički program,


– prije poziva neke prekidne rutine,
– u sistemu imamo slijedeću situaciju.

Boris Damjanović P 1.117


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• Kada dođe do prekida, izuzetka ili sistemskog poziva,
– hardver će sačuvati dio podataka o stanju izvršenja
prekinute niti
• Hardver je sačuvao korisnički kontekst
– na steku interapta,
» gdje su vidljivi sačuvani registri SS, ESP, EFLAGS, CS, EIP.

Boris Damjanović P 1.118


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• Tehnika prelaska u mod kernela je slijedeća:
• 1. Maskirati prekide.
• Hardver počinje ovu sekvencu događaja tako što
– maskira sve prekide dok god je procesor
– u fazi prebacivanja iz korisničkog moda u mod
kernela.

Boris Damjanović P 1.119


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• 2. Snimiti tri ključne vrijednosti.
• Hardver će sačuvati vrijednosti
– para registara CS i ESP (stek),
– registra EFLAGS i
– para registara CS i EIP (slijedeća instrukcija koju
treba izvršiti).

• On ih čuva u internim registrima


– koji se nalaze unutar procesora.

Boris Damjanović P 1.120


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• 3. Prelazak na stek kernela.
• Hardver potom mijenja vrijednosti
– para registara SS i ESP tako da pokazuju
– na početak steka kernela (steka prekida).

• 4. Postavljanje tri ključne vrijednosti na stek


kernela.
• Na stek kernela (stek prekida)
– postavljaju se tri ključne vrijednosti
– koje su prethodno sačuvane u internim registrima.

Boris Damjanović P 1.121


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• 5. Opciono, sačuvati kod greške.
• U određenim slučajevima, kada dođe do greške
– potrebno je sačuvati i kod greške do koje je došlo na
steku.

• Ako nije došlo do greške,


– hardver na stek gura praznu vrijednost
» (dummy value, sve nule),
– tako da je dužina steka na kraju ista.

Boris Damjanović P 1.122


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• 6. Poziv prekidne rutine (interrupt handler).
• Na kraju, hardver mijenja
– par registara CS i EIP tako da
– pokazuju na prvu instrukciju
– interrupt handler procedure.

• Adresa ovog prekida nalazi se


– ili na početku memorijske mape,
– ili je dobijena od posebnog sklopa
» (programabilni kontroler interapta).

• Ova vrijednost se najčešće drži


– u posebnoj lokaciji ili posebnom registru
– koji može da mijenja samo kernel operativnog sistema.

Boris Damjanović P 1.123


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• Prije početka svog izvršenja, prekidna rutina, izuzetak ili rutina
sistemskog poziva
– mora da sačuva ostatak registara prije nego što počne sa svojim
izvršenjem.
• Zbog toga se unutar ovakve rutine
– prvo izvršava pushad instrukcija
– koja će na steku prekida (steku kernela)
– sačuvati sve ostale registre.

Boris Damjanović P 1.124


Svi prikazani koncepti zajedno:
promjena moda na x86 arhitekturi
• Sa slike je vidljivo da su na steku prekida (kernel)
– sačuvani svi registri koji opisuju stanje prekinutog
procesa,
– tako da se on nesmetano može nastaviti po završetku
pozvane rutine.

Boris Damjanović P 1.125

You might also like