dlaczego systemy operacyjne przydzielaja stos?
To jest moja sprawa czy bede z niego kozystal, i tylko ja moge pilnowac by nie przekroczyc jego dolnej granicy. Dlaczego dajmy na to windows wymaga stosu do przekazywania argumentow? A wersja 64bitowa to juz <ort>w ogóle </ort>porazka, ale o tym pozniej.
Jak system mi alokuje stos, to:
- rezerwuje czesc przestrzeni adresowej
- mapuje pamiec pod kilka najwyzszych stron
- kolejna nizsza strone oznacza jako guard page
- ustawia XSP na najwyzszy bajt
ja zaczynam swoj program, i chce wywolac api, dajmy na to HeapCreate().
wiem tylko tyle ze ss:xsp zawiera adres stosu.
moge uzyc instrukcji push zeby przekazac argument, i call by wywolac funkcje.
do tego momentu wszsytko jest znosnie. Jesli skonczy mi sie stos, odwolam sie do strony ktora jest oznaczona jako non-present, i page fault sprawdzi czy ma ja traktowac jako guard page czy nie, i zaalokuje mi wiecej stosu, lub przekaze wyjatek. No i oczywiscie po sobie nie posprzata (sprawdzone, odwolania do wyzszych adresow stosu nie dealokuja juz przydzielonej pamieci).
Wiec jedyne co trace to pamiec.
Funkcje natomiast lubia tworzyc sobie pamiec poprzez odelmowanie od SP, albo instrukcje enter.
pojecie strony pamieci nie jest istotne dla programu, tylko dla systemu. tak na dobra sprawe to strona moze miec tylko 1 bajt a program musi dzialac jak by miala 1 gigabajt.
mechanizm guard page dziala tylko jak odwoluje sie do stosu elementarnie, push/call/int.
co jesli uzyje sub esp,32?
program przejedzie guard page i lezy. jest jeszcze instrukcje enter ktora rzuca page faulta jesli zapis pod nowy SP by spowodowal go, ale nic nie stoi na przeszkodzie by nowy sp wskazywal na inne dane. guard page jak alokuje ostatnia strone to nastepna chyba zawsze jest oznaczona jako nonpresent, wiec pushami czy nigdy nie wjade w inne dane.
dlaczego to OS decyduje o tym ile stosu ma moj kod?
dlaczego funkcje api wymagaja stosu? co stoi na przeszkodzie by ufnkcje ktore wymagaja pamieci nie alokowany jej sobie same, tudziez nie wymagaly jej od usera ze wzgledu na wydajnosc (dokumentacja by mowila ile pamieci masz jej przekazac)?
User wtedy by tworzyl wlasny stos, i wiedzial ile jeszcze elementow moze na niego wrzucic.
Co o tym myslicie?