Windows程序集堆和堆栈?

操作系统:Windows 7 32位

所以像c ++一样,有一堆和一堆。 但是我最近开始进行一些程序集学习,并没有看到任何类似的东西,只是一个堆栈,但它看起来像纯内存。 那么堆和堆栈实现特定于c ++和其他语言? 还是你仍然在堆中分配堆和堆栈? 当启动一个可执行文件时,windows为进程分配内存方面做了什么? 一个流程如何知道堆栈大小需要多大?

最新消息

编辑:也许有人可以提供一个关于堆栈和堆栈内存如何处理由CPU / OS进程的链接


堆栈主要由CPU来维护(PUSH / POP / CALL / RET命令); 该堆纯粹是一个OS /运行时库功能。 因此,堆叠访问是很自然的。 对于堆访问,您只需从汇编代码(HeapAlloc / HeapFree或其他库)中调用相关的API即可。 与堆栈不同,汇编语言中没有用于堆内存管理的低级原语。

您不必担心Windows上的堆栈大小。 随着你越来越多地使用它,它会变得透明。 在低级方面,Windows在堆栈底部下方设置了一个守卫内存页面(假设堆栈增长缓慢)。 当堆栈到达警戒页面时,会在CPU中产生访问冲突异常。 Windows内核会抓住它,注意到这种情况并增加堆栈。


我的大部分知识都不是特定于Windows的,所以请耐心等待:

堆和堆栈指的是内存中的不同区域(但在每种情况下我们仍在讨论主内存)。 这不是特定于任何语言。 堆居于低内存地址并向上增长; 堆栈位于高内存地址并向下增长。 这是为了防止它们重叠(这将是非常糟糕的)。

在32位架构上,EBP和ESP寄存器跟踪当前堆栈帧。 EBP是基指针 - 它指向当前堆栈帧的高地址。 ESP是堆栈指针,它指向当前堆栈帧的低地址。

请记住,空闲/分配堆和堆栈内存的概念在应用程序级别上大都相关。 在机器级别,所有内存看起来都是一样的 - 取决于程序员(或编译器)跟踪哪些内存段正在使用。

该堆栈由以下各项组合管理:调用函数的指令以及对EBP和ESP的显式修改。 任何低于ESP的东西都被认为是释放的; 所以为了释放内存,你可以添加到ESP。

堆由内存分配方法管理; 文档可以在这里找到。 我不确定Winows的具体情况,但总的来说,会有一些内存管理器负责确保没有将内存块分配给多个应用程序。

链接地址: http://www.djcxy.com/p/253.html

上一篇: Windows assembly heap and stack?

下一篇: What is dependency injection?