我对exe堆栈的位置有点困惑。我知道CRT在程序运行之前通过分配一定数量的堆来初始化堆(堆是由分配页的操作系统分配的),但是堆栈在哪里呢?它也在页面上吗?或者它是由用户模式( ring3 )中的所有程序通过在GDT上使用ring3描述符来共享的(我认为不是,但我不确定)?
发布于 2012-09-15 12:16:12
Windows将为每个线程保留一个连续的虚拟内存区域(默认情况下为1MB)。然后,它提交该内存区域的几个最上面的页面,并将该区域下面的几个页面标记为保护页面。当线程的堆栈向下增长时,如果保护页被访问,则会发生异常,Windows将提交保护页并将其下方的页标记为保护页。
您可以使用优秀的SysInternals实用程序VMMap探索此行为。下面是该工具的一个片段:
发布于 2012-09-15 11:20:26
每个线程都有自己的堆栈。它只是为此目的而分配的一块内存。
所有内存都是以页为单位分配的,包括堆栈(在Windows上,我相信堆栈的默认大小为1MB,因此它将跨越许多页,因为大多数内存页都是4KB)。
但它实际上只是堆栈指针寄存器指向的一块内存。
发布于 2012-09-15 11:30:00
Windows中的每个程序都是一个进程。进程通常不会在彼此之间共享内存。
共享和不共享是每个进程的虚拟地址空间如何映射到物理内存的问题。
如果两个进程将其地址空间的一部分映射到物理内存的相同页面上,则该内存实际上由它们共享,并且每个进程都可以对其进行读写,并观察另一个进程的写操作。
共享堆栈内存的意义很小,因此每个进程都有自己的堆栈。实际上,进程更像是容器。执行代码和使用堆栈的实体是线程。每个进程中至少有一个线程。线程有自己的堆栈,但由于进程的线程在相同的虚拟地址空间中,它们可以相互访问堆栈。有时,在线程之间共享堆栈上的数据很有用,但应该小心操作,以免破坏线程状态并导致挂起或崩溃。
https://stackoverflow.com/questions/12436891
复制相似问题