[OSy] Testy as2

Martin Decky decky at dsrg.mff.cuni.cz
Tue Dec 9 17:41:35 CET 2008


Hezky den,

> Jedna se o alokaci ve virtualnim prostoru, adresa stranky je proto
> prelozena na jinou stranku ve fyzickem prostoru. Problem je, ze
> offset bloku v ramci stranky se samozrejme nepreklada - a tak test
> vyzaduje alokaci bloku na zacatku stranky. Nase implementace na
> zacatku stranky drzi hlavicky jednotlivych bloku s velikosti bloku
> (ktere jsou nutne) - a tak odmitne alokovat od zacatku bloku.

Myslim, ze jste nepochopili zcela dobre, k cemu slouzi mapovani 
virtualnich adres na fyzicke. Funkce vma_alloc() vytvori ve virtualnim 
adresovem prostoru mapovani na fyzicke adresy, jinymi slovy priradi 
jistym virtualnim strankam fyzicke ramce.

Jakekoliv bookeeping informace, ktere k vytvoreni a udrzovani takoveho 
mapovani OS potrebuje, musi byt pochopitelne mimo tuto mapovanou pamet, 
protoze proces pouzivajici dany virtualni adresovy prostor jej povazuje 
cely za "svuj" a neceka v nem nejaka data, kterym by se musel vyhybat.

> Prijde mi zvlastni chtit alokovat od adresy 0 (ktera v Ccku vetsinou
> znamena NULL).

Adresa 0 neni v zadnem ohledu specialni nebo jina nez jakakoliv nenulova 
virtualni adresa. Nic nebrani tomu na tuto adresu ukladat data nebo z ni 
dokonce vykonavat instrukce.

To, ze se adresa 0 (neboli NULL) v mnoha pripadech povazuje za neplatny 
ukazatel nebo signalizuje chybovou hodnotu, je pouze konvence. Tato 
konvence je bezpecna vzhledem k tomu, ze na zacatku virtualniho 
adresoveho prostoru je vetsinou umisten entry point a inicializacni kod 
uzivatelskeho procesu a tudiz nehrozi, ze by nekdo pracoval s NULL jako 
s adresou nejake uzivatelske funkce nebo navratovou hodnotou funkce 
malloc().

Nic by Vam ovsem nemelo branit namapovat nultou virtualni stranku na 
nejaky fyzicky ramec pameti.

> Rad bych se proto zeptal - funkce vma_alloc() vyzaduje podle zadani
> zarovnany parametr size. Mysli se tim zarovnany na 4B, nebo na
> velikost stranky?

Pokud si uvedomite, po jakych nejmensich blocich muze funkce vma_alloc() 
pamet mapovat, tak Vam bude odpoved na Vasi otazku jasna.

> Dale - proc vlastne funkce frame_alloc a vma_alloc
> umoznuji donutit alokator k alokaci na dane adrese?

Predevsim: Funkce frame_alloc() je skutecne metoda alokatoru fyzickych 
ramcu, ale funkce vma_alloc() je metoda spravce virtualnich adresovych 
prostoru, ktery pouziva alokator fyzickych ramcu jen jako svuj backend 
(prideluje mu volnou fyzickou pamet, kterou potom muze mapovat). Je 
velmi dulezite uvedomit si rozdil mezi temito dvema API.

V pripade frame_alloc() se hodi specifikovat konkretni adresu ve fyzicke 
pameti treba v tom pripade, kdy chceme oznacit jako pouzitou nejakou 
cast fyzicke pameti, kde jsou pristupna hardwarova zarizeni. Je pravda, 
ze se jedna spise o okrajovy pripad, typicky po frame alokatoru proste 
chceme pridelit nejakou (celkem libovolnou) fyzickou pamet.

Naopak v pripade vma_alloc() je specifikovani konkretni virtualni adresy 
typicka varianta. Kdyz vytvarite napriklad standardni layout virtualniho 
adresoveho prostoru procesu, tak chcete presne zajistit, ze jeho kod a 
staticka data budou zacinat rekneme na adrese 0, jeho heap na nejake 
adrese tesne za koncem statickych dat a zasobnik bude naopak koncit na 
adrese nekolik stranek pred koncem uzivatelskeho adresoveho prostoru.

> Prijde mi, ze
> pokud nasim cilem je zajistit kazdemu procesu separovanou pamet, nad
> kterou muze provozovat malloc(), neni tato funkce vubec potreba.

Lze si predstavit fungovani systemu, kdy kazdy adresovy prostor bude 
sestaven zcela nahodne (resp. tak, jak urci nejaky algoritmus 
pridelovani volnych virtualnich stranek) bez moznosti toho, abychom 
layout presne nastavili. Je vsak trivialni domyslet, jak by byl system v 
takovem pripade neflexibilni. Par prikladu:

* Kod by bylo potreba vzdy relokovat (nebo by musel byt napsat zasadne
   position independent), protoze bychom nikdy nevedeli, od jake adresy
   bude namapovan.

* Velikost oblasti virtualni pameti pro heap by nemohla rust podle
   potreby.

* Zasobnik by nemohl pri preteceni rust podle potreby.

> Jedine rozumne reseni, ktere vidim, je zrusit hlavicky bloku. Jenze
> pak by musela nekde existovat struktura s velikostmi bloku

Ano, to je skutecne prakticky jedine mozne reseni.

> a v te by bylo nutno vyhledavat - coz by bylo pomale.

Nerozumim Vasemu argumentu -- vyhledavani v te samostatne strukture je 
prece v principu stejne rychle/pomale jako vyhledavani v te datove 
strukture, kterou si ted ukladate na zacatky oblasti.

Kdyz se navic nad veci zamyslite poradne, tak zjistite, ze potrebne 
informace si muzete napriklad ukladat ve stejnych strukturach, ktere 
pouzivate k realizaci mapovani (at uz to jsou hierarchicke strankovaci 
tabulky, hashovaci tabulky nebo cokoliv jineho) a tim se dostat i
v nejobecnejsim pripade na konstantni casovou slozitost kritickych operaci.


M.D.




More information about the NSWI004 mailing list