Piszę jądro i potrzebuję (i chcę) umieścić wiele stosów i stert w pamięci wirtualnej, ale nie mogę wymyślić, jak je efektywnie umieścić. Jak robią to zwykłe programy?Gdzie umieszcza się wiele stosów i stert w pamięci wirtualnej?
W jaki sposób (lub gdzie) są stosy i sterty umieszczane w ograniczonej pamięci wirtualnej dostarczanej przez system 32-bitowy, tak aby miały jak najwięcej przestrzeni rosnącej?
Na przykład, gdy trywialny program jest ładowany do pamięci, układ swojej przestrzeni adresowej może wyglądać następująco:
[ Code Data BSS Heap-> ... <-Stack ]
w tym przypadku kupa może rosnąć tak duża, jak pozwala pamięci wirtualnej (np górę do stosu), i uważam, że tak działa stertę dla większości programów. Nie ma zdefiniowanej górnej granicy.
Wiele programów ma wspólne biblioteki umieszczone w wirtualnej przestrzeni adresowej. Następnie są wielowątkowe programy, które mają wiele stosów, po jednym dla każdego wątku. A programy .NET mają multiple heaps, z których wszystkie muszą rosnąć w taki czy inny sposób.
Po prostu nie rozumiem, w jaki sposób jest to wykonywane w rozsądny sposób, bez wprowadzania wstępnie zdefiniowanego limitu rozmiaru wszystkich stosów i stosów.
Ale przełączanie między wątkami nie powinno przełączać całej przestrzeni adresowej (i powodować, aby TLB była opróżniana), więc dla każdego wątku używanego przez proces, jego stos _must_ jest obecny w przestrzeni adresowej procesu. I link w moim poście pokazuje obraz, jak proces CLR ma bardzo wiele stosów. Tak więc istnieje zapotrzebowanie na więcej niż jeden stos i stertę w jednej przestrzeni adresowej. – Virtlink
Przestrzeń adresowa to zupełnie inny poziom abstrakcji. Właściwie w tym przypadku masz te wiele stosów i stert w tej samej przestrzeni adresowej. Sama przestrzeń adresowa jest zarządzana przez system operacyjny, podczas gdy sterta nie jest; jest zarządzany przez kod biblioteki na poziomie użytkownika. – Powerslave