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