[OSy] dotaz - skripta

Petr Tuma tuma at nenya.ms.mff.cuni.cz
Thu Jan 12 10:14:50 CET 2006


Zdravim,

> Mal by som taky maly dotazik na temu 2.chapter Example:Intel 
> processor context switch hlavne neviem si nejak predstavit preco by 
> sa mali nicit data pod zasobnikom v pripade jeho prepnutia.

Kdyz budete uvazovat nejaky hloupejsi procesor, klasicky postup obsluhy
preruseni muze vypadat napriklad takto:

1. Bezi proces, ktery ma nekde zasobnik. Rekneme, ze momentalne je jeho
vrchol na adrese 1000, tedy kdybyste napriklad ulozil na zasobnik cislo
v delce 4 bajtu, ulozi se od adresy 996 a novy vrchol bude na adrese
996, podobne kdybyste precetl ze zasobniku cislo v delce 4 bajtu, precte
se od adresy 1000 a novy vrchol bude na adrese 1004.

2. Prijde preruseni od casovace, kterym zacina prepnuti kontextu.
Procesor ho zacne obsluhovat tim, ze ulozi aktualni hodnotu programoveho
citace na zasobnik a zacne vykonavat obsluznou rutinu od nejake
konkretni adresy. Tedy vrchol zasobniku bude po ulozeni navratove adresy
delky 4 bajtu na adrese 996.

3. Obsluzna rutina musi ulozit dalsi registry, ktere pouziva. To se
snadno dela prave ulozenim na zasobnik, podobne jako se ukladala
navratova adresa v predchozim kroku.

4. Atd.

Tento postup je jednoduchy, ale ma jednu nevyhodu. Obsluha preruseni
pouziva zasobnik aplikace. Pokud na tomto zasobniku neni misto, muze se
v krajnim pripade stat, ze behem obsluhy preruseni podtece a bud se
zavola vyjimka kvuli pristupu do nenamapovane pameti, nebo se prepisi
jina data ulozena v pameti pod oblasti zasobniku.

To se da trochu resit tim, ze obsluzna rutina jako prvni krok prepne
zasobnik. Staci nastavit registr ukazujici na vrchol zasobniku na
nejakou adresu, kde ma kernel oblast pro svuj zasobnik. Jenze to
znamena, ze zase musite schovat puvodni hodnotu registru ukazujiciho na
vrchol zasobniku, abyste ho pri navratu z obsluhy preruseni mohl
obnovit. A navic se tim stejne nezbavite te jedne polozky zapsane na
zasobnik ve kroku 2, protoze ten se stane jeste drive, nez se vase
obsluzna rutina spusti.

U nekterych procesoru byva k dispozici ladici rezim, kdy muzete spustit
proces a procesor automaticky vyvola preruseni po vykonani kazde
jednotlive instrukce. Pokud chtel clovek napsat kod, ktery takovy ladici
rezim detekoval, mohl udelat napriklad toto:

PUSH 1234	;nejake cislo se ulozi na vrchol zasobniku
ADD SP,2	;vrchol zasobniku se posune na puvodni hodnotu
SUB SP,2	 ;pred ulozenim cisla a hned zase zpatky
POP AX		;precte se vrchol zasobniku
CMP AX,1234	;pokud se neprecetlo 1234, bezime v ladicim rezimu

Funkce je jednoducha - tesne po instrukci ADD SP,2 je vrchol zasobniku
nastaven tak, ze pokud se bude obsluhovat preruseni, ulozeni navratove
adresy prepise cislo 1234 - tedy pokud navratova adresa zrovna shodou
okolnosti nebude 1234, lze poznat, ze se obsluhovalo preruseni.

No a ten text, na ktery se odkazujete, rika, ze na nekterych procesorech
je k dispozici moznost nastavit nejen adresu, na kterou se skace v
pripade preruseni, ale i adresu, na kterou se v pripade preruseni
nastavi zasobnik. Zminovany krok 2 pak uklada navratovou adresu nikoliv
na zasobnik prerusovaneho procesu, ale na nove nastaveny zasobnik, takze
ty problemy, ktere jsem popisoval, nevznikaji.

Ale je to jen detail ktery se normalnich aplikaci vubec netyka :-).

> Ak by mi to niekto vedel vysvetlit, bol by som mu zavazan.

Tak jestli jsem vam to vysvetlil, tak jste mi zavazan :-).

Petr Tuma




More information about the NSWI004 mailing list