我正在编写一个内核,需要(并且想要)将多个堆栈和堆放到虚拟内存中,但我无法弄清楚如何有效地放置它们。普通程序如何做到这一点?多个堆栈和堆放在虚拟内存中的位置?
如何(或哪里)将堆栈和堆放入由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