我正在編寫一個內核,需要(並且想要)將多個堆棧和堆放到虛擬內存中,但我無法弄清楚如何有效地放置它們。普通程序如何做到這一點?多個堆棧和堆放在虛擬內存中的位置?
如何(或哪裏)將堆棧和堆放入由32位系統提供的有限虛擬內存中,以便它們具有儘可能多的增長空間?
例如,當一個簡單的程序被加載到內存中,其地址空間的佈局可能是這樣的:
[ Code Data BSS Heap-> ... <-Stack ]
在這種情況下,堆可以成長爲大的虛擬內存允許(例如最多到堆棧),我相信這是這個堆在大多數程序中的工作原理。沒有預定義的上限。
許多程序都具有放置在虛擬地址空間某處的共享庫。 然後有多線程程序有多個堆棧,每個線程一個。而.NET程序有multiple heaps,所有這些都必須能夠以這種或那種方式發展。
我只是沒有看到如何在沒有對所有堆和堆棧的大小進行預定義限制的情況下合理高效地完成此操作。
但是在線程之間切換不應該切換整個地址空間(並且導致TLB被刷新),因此對於進程使用的每個線程的每個線程,其堆棧_必須出現在進程的地址空間中。我的文章中的鏈接顯示了一個CLR過程如何有很多堆的圖像。所以這裏需要一個以上的堆棧並堆放在一個地址空間中。 – Virtlink 2013-04-25 14:46:10
地址空間是一個非常不同的抽象層次。實際上,在這種情況下,您在同一個地址空間中有多個堆棧和堆棧。地址空間本身由OS管理,而堆不是;它由用戶級庫代碼管理。 – Powerslave 2013-04-25 15:37:04