我正在编写一个内核并且需要(并且想要)将多个堆栈和堆放入虚拟内存中,但我无法弄清楚如何有效地放置它们。普通程序是如何做到的?
堆栈和堆是如何(或在哪里)放置到 32 位系统提供的有限虚拟内存中的,以便它们拥有尽可能多的增长空间?
例如,当一个普通程序加载到内存中时,其地址空间的布局可能如下所示:
[ Code Data BSS Heap-> ... <-Stack ]
在这种情况下,堆可以增长到虚拟内存允许的大小(例如,直到堆栈),我相信这就是堆对大多数程序的工作方式。没有预定义的上限。
许多程序都有共享库,它们放在虚拟地址空间的某个地方。然后是具有多个堆栈的多线程程序,每个线程一个堆栈。.NET 程序有多个堆,所有堆都必须能够以一种或另一种方式增长。
如果不对所有堆和堆栈的大小设置预定义限制,我只是看不出这是如何合理有效地完成的。