操作系统:Windows 7 32 位
所以像 c++ 一样,有一个堆和一个堆栈。但是我最近开始学习一些汇编,并没有看到任何类似的东西,只有一个堆栈,但它看起来就像纯内存。那么堆和堆栈实现是否特定于 c++ 和其他语言?或者你仍然在汇编中分配了一个堆和堆栈?启动可执行文件时,Windows 在为进程分配内存方面做了什么?进程如何知道堆栈大小需要多大?
怎么回事
编辑:也许有人可以提供有关 CPU/OS 如何为进程处理堆和堆栈内存的链接
操作系统:Windows 7 32 位
所以像 c++ 一样,有一个堆和一个堆栈。但是我最近开始学习一些汇编,并没有看到任何类似的东西,只有一个堆栈,但它看起来就像纯内存。那么堆和堆栈实现是否特定于 c++ 和其他语言?或者你仍然在汇编中分配了一个堆和堆栈?启动可执行文件时,Windows 在为进程分配内存方面做了什么?进程如何知道堆栈大小需要多大?
怎么回事
编辑:也许有人可以提供有关 CPU/OS 如何为进程处理堆和堆栈内存的链接
我的大部分知识都不是特定于 Windows 的,所以请耐心等待:
堆和堆栈指的是内存中的不同区域(但我们仍然在每种情况下讨论主内存)。这不是任何语言所特有的。堆位于低内存地址并向上增长;堆栈位于高内存地址并向下增长。这是为了防止它们重叠(这将非常糟糕)。
在 32 位架构上,EBP 和 ESP 寄存器跟踪当前堆栈帧。EBP 是基指针——它指向当前栈帧的高地址。ESP 是堆栈指针,它指向当前堆栈帧的低地址。
请记住,空闲/分配的堆和堆栈内存的概念主要与应用程序级别相关。在机器级别,所有内存看起来都一样——由程序员(或编译器)来跟踪正在使用的内存段。
堆栈由以下组合管理:调用函数的指令,以及对 EBP 和 ESP 的显式修改。低于 ESP 的任何内容都被视为已释放;因此,要释放内存,您只需添加到 ESP 即可。
堆由内存分配方法管理;文档可以在这里找到。我不确定 Winows 的细节,但通常会有一些内存管理器负责确保没有将内存块分配给多个应用程序。
堆栈主要由 CPU 维护(PUSH/POP/CALL/RET 命令);堆纯粹是一个操作系统/运行时库功能。因此堆栈访问在组装中是很自然的。对于堆访问,您只需从汇编代码(HeapAlloc/HeapFree 或其他库)中调用相关 API。与堆栈不同,汇编语言中没有用于堆内存管理的低级原语。
您不必担心 Windows 上的堆栈大小。随着你越来越多地使用它,它会透明地增长。在低级术语中,Windows 在堆栈底部下方设置了一个保护内存页面(假设堆栈向下增长)。当您的堆栈到达保护页时,CPU 中会生成访问冲突异常。Windows 内核会捕捉到它,注意到情况并增加堆栈。