getrlimit (2) ma następującą definicję na stronach podręcznika:
RLIMIT_AS Maksymalny rozmiar pamięci wirtualnej procesu (przestrzeni adresowej) w bajtach. Limit ten wpływa na wywołania do brk (2), mmap (2) i mremap (2), które kończą się błędem ENOMEM po przekroczeniu tego limitu. Również automatyczne rozszerzanie stosu zakończy się niepowodzeniem (i wygeneruje SIGSEGV, który zabije proces, jeśli nie zostanie udostępniony alternatywny stos przez sigaltstack (2)). Ponieważ wartość jest długa, na komputerach o długości 32 bitów albo ten limit wynosi maksymalnie 2 GiB, albo ten zasób jest nieograniczony.
Co oznacza tutaj „automatyczne rozwijanie stosu”? Czy stos w środowisku Linux / UNIX rośnie w miarę potrzeb? Jeśli tak, jaki jest dokładny mechanizm?
ulimit -s
).Dokładny mechanizm podany jest tutaj, w systemie Linux: w obchodzenia się błąd strony na anonimowych odwzorowań Państwo sprawdzić, czy jest to „dorosły ma przydział” , że należy poszerzyć jak stos. Jeśli rekord obszaru maszyny wirtualnej mówi, że powinieneś, to dostosuj adres początkowy, aby rozwinąć stos.
Gdy wystąpi błąd strony, w zależności od adresu, można go naprawić (i usunąć błąd) za pomocą rozszerzenia stosu. To zachowanie „malejące w wyniku błędu” pamięci wirtualnej może być wymagane przez dowolne programy użytkownika z
MAP_GROWSDOWN
flagą przekazywaną dommap
wywołania systemowego.Z tym mechanizmem możesz również zadzierać w programie użytkownika:
Po wyświetleniu monitu znajdziesz identyfikator programu (via
ps
) i przyjrzyj/proc/$THAT_PID/maps
się, jak rozrósł się oryginalny obszar.źródło