Problem s obsadenim pamate v jazyku C

Milos Prchlik prchlm2 na feld.cvut.cz
Úterý Leden 8 11:37:41 CET 2002


On 8 Jan 2002, at 10:14, Ing. Miloslav Ponkrác wrote:

> >> Nedivte se, když Vám program sletí, vytváříte-li na zásobníku obrovská
> pole.
> >> Systém taky musí adresový prostor zásobníku mapovat do souvislého bloku
> >> paměti
>
> >To sice musi, ale jen virtualne, jednotlive stranky nemusi lezet za
> >sebou ve fyzickem adresovem prostoru.
>
>
> To je pravda, ale chápejte, že prostě program má pouze 4 GB paměťového

 Makro PAGE_OFFSET udava 3GB pro userspace a 1GB pro
kernel. Ale to uz se da menit - ovsem pak musite prepsat i dalsi
veci (GDT, ...)

> prostoru, byť virtuálního. Víc ani ťuk. Do tohoto prostoru musí namapovat
> všechno. Strojový kód programu, data, hromadu, zásobníky pro všechny thready
> programu, paměťově mapované soubory, namapování všech sdílených knihoven,
> mapování služeb jádra, atd.. A ona je v těch 4 GB docela tlačenice, není to
> zas tolik místa.

 Opravdu to neni tolik mista, jak by se zdalo. Zarovnani na velikost
stranky, spousta knihoven, ... a kde jsou me 3GB mista?

> Protože žádný program se jaksi nesrovná s tím, že mu budete měnit adresu
> zásobníkového prostoru během vykonávání kódu, musí se systém rozhodnout
> rezervovat souvislý virtuální prostor pro zásobník již před spuštěním
> procesu. Jednotlivé stránky pro zásobník nemusí za sebou ležet ve fyzickém
> paměťovém prostoru, to je pravda. Ale stránky pro zásobník MUSÍ ZA SEBOU
> LEŽET ve virtuálním paměťovém prostoru a nedají se později ani přemístit.

Jestli se neco nezmenilo, tak zasobnik lezi vzdy na konci
virtualniho adresoveho prostoru procesu - od hranice dane
PAGE_OFFSET (3GB) roste dolu, takze to neni problem.
Kazdemu threadu staci pak namapovat do jeho vlastniho virtualniho
prostoru jeho vlastni zasobnik, ktery se nachazi na stejnem miste -
tedy od hranice user-space roste dolu. Samozrejme, ze je limit na
zasobnik, ale pri startu staci mit jen par stranek, a pokud proces
bude chtit jit v adresach nize - tedy mit vetsi zasobnik, tak pokud
nevycerlap svuj limit, neni problem primapovat mu pri page fault
novou stranku zasobniku - samozrejme, pokud uz se nestretnul
jeho vrchol napr. s knihovnou. To je pak smula...

> A samozřejmě totéž pro každý další zásobník před spuštění každého threadu.
> Proto se musí systém (nebo Vy) rozhodnout pro určitý kompromis a omezit
> velikost zásobníku na malou hodnotu, třeba řádově MB, kterou již prakticky
> nemá později šanci zvětšit, protože ve vertuálním paměťovém prostoru může
> narušit jiné části, rezervované pro jiné účely.
>

Milos Prchlik


"... For the world is hollow and I have touched the sky."


Další informace o konferenci Linux