vm_fault: fault on nofault entry
Dan Lukes
dan at obluda.cz
Sat Mar 18 10:58:40 CET 2006
Divacky Roman napsal/wrote, On 03/17/06 19:02:
>> Page fault je termin z oblasti spravy pameti tykajici se strankovani.
>>
>> Nastane v okamziku, kdy se nejaky proces odkaze na takovou linearni
>> adresu pameti, ktera neni pritomna ve fyzicke pameti. Obsluha teto
>
> jen tak ze zajimavosti co je "linearni adresa pameti"?
Jen velmi kratce, protoze tohle asi presahuje ramec teto konference.
Detaily je treba hledat v takovych dokumentech, ktere popisuji pristup k
pameti procesoru rady i386 mj. take segmentaci a strankovani. Urcite se
k tomu neoc najde i na Internetu, pripadne, ja na to kupoval kdysi
knizku od Grady (od te doby dokonce vydali upgrade).
Je-li aktivni jak segmentace tak strankovani (a to na FreeBSD je) tak
adresace pameti z hlediska procesu probiha systemem segment:offset
(procesor ma na adresu segmentu vyhrazene specialni registry, tzv.
segmentove - cs,ds,es,fs,gs,ss). Segment - to je jen pointer do tabulky
(procesor jich ma vic - globalni GDT a "per proces" LDT), ve ktere se v
prislusnem radku najde, kde segment skutecne zacina, jak je velky, jsou
tam ale take pristupova opravneni k teto pameti a dalsi udaje.
Z "base" adresy prislusneho segmentu a dodaneho offsetu se vypocte
"linearni adresa". Jelikoz ale, jak vyse receno, mame zapnute i
strankovani, tak to jeste neni konec. Cela pamet je rozdelena na stranky
velikosti 4kB (az se podivate na detailni popis zjistite, ze u novejsich
procesoru muze byt velikost stranky take 64kB) a tak se linearni adresa
rozdeli na poslednich 12 bitu (offset v ramci 4kB bloku) a zbytek. Ten
"zbytek" je adresa stranky - a na to je v systemu jedna tabulka, kde se
eviduji udaje o dane strance. Jsou tam znovu opravneni k pristupu a mj.
take to, zda je dana stranka pritomna ve fyzicke pameti - a kde.
Pokud stranka pritomna neni je to okamzik pro jiz zmineny PAGE FAULT.
Co zminena rutina dela jsem popisoval uz minule (mimochodem, pokud by
ani kod teto rutiny nebyl pritomen nastane tzv DOUBLE FAULT, ktery je
stale jeste obslouzitelny a kdyby ani tato obsluha nebyla pritomna tak
dojde k resetu procesoru). Pokud stranka pritomna je, tak se z udaju v
tabulce a z puvodni linearni adresy vypocte adresa fyzicka, ktera uz se
skutecne pouzije pro adresaci fyzicke pameti.
Pamatovat se na to musi zejmena u ovladacu driveru, ktere pouzivaji DMA
- pro automaticky prenps se zarizeni samozrejme musi rict adresa fyzicka
(protoze zarizeni nema k tabulkam procesotu pristup) - tj. driver musi
adresu prepocitat na fyzickou a musi se take zajistit, ze po dobu, kdy
zarizeni muze data prenaset mu stranku nikam nepresuneme.
Mimochodem, jak jsem v minulem dopisu napsal, ze neni-li stranka ve
fyzicke pameti tak je urcite ve swapu tak jsem opomel druhou moznost,
ktera je dokonce castejsi - pamet neni nikde. OS priradi kazdemu procesu
zdanlive cely rozsah linearni pameti - ale nealokuje ji ve skutecnosti
celou (nevytvari pro cely rozsah te pameti mapovani "kde stranka je").
To dela az v dobe, kdy je dan adresa skutecne potreba. Vetsina
adresniho prostoru procesu je tedy "nikde".
Strankovani ma i dalsi kouzla - napriklad - dva procesy pouzivajici
identicky obsah pameti (napriklad dve instance tehoz kodu) nemaji svuj
kod v pameti umisteny kazdy zvlast - fyzicky je v pameti jen jednou a
strankovani zajistuje namapovani teto stranky do obou p[rostoru obou
procesoru. Pouziva se dto dokonce i na tu pamet obsahujici promenne - po
forku je tato pamet spolecna, dokud prvni z obou procesoru do ni
nezapise (nezmeni nejakou promennou) - v tom okamziku OS pamet zkopiruje
a dale uz ma kazdy proces svoji, do te doby meli jednu spolecnou (tzv.
copy-on-write). To uz ale opravdu nastudujes jinde.
Dan
--
Dan Lukes SISAL MFF UK
AKA: dan at obluda.cz, dan at freebsd.cz,dan at kolej.mff.cuni.cz
More information about the Users-l
mailing list