【发布时间】:2011-05-06 15:13:34
【问题描述】:
在 Windows 中,堆栈的实现如下:指定的页面遵循已提交的堆栈页面。它的保护标志是被保护的。所以当tad引用受保护页面上的地址时,会出现内存错误,这使得内存管理器将受保护页面提交到堆栈并清除页面的受保护标志,然后它将新页面保留为受保护。
但是,当我分配大小超过一页 (4KB) 的缓冲区时,并没有发生预期的错误。为什么?
【问题讨论】:
标签: windows stack memory-management size
在 Windows 中,堆栈的实现如下:指定的页面遵循已提交的堆栈页面。它的保护标志是被保护的。所以当tad引用受保护页面上的地址时,会出现内存错误,这使得内存管理器将受保护页面提交到堆栈并清除页面的受保护标志,然后它将新页面保留为受保护。
但是,当我分配大小超过一页 (4KB) 的缓冲区时,并没有发生预期的错误。为什么?
【问题讨论】:
标签: windows stack memory-management size
很好的问题(+1)。
有一个技巧,很少有人知道(除了驱动程序作者)。
当您在堆栈上分配大缓冲区时 - 编译器会自动添加所谓的堆栈探测器。这是一个额外的代码(通常在 CRT 中实现),它以所需的顺序逐页探测分配的区域。
编辑:
函数是_chkstk。
【讨论】:
故障没有到达您的程序 - 它由操作系统处理。当您的程序尝试读取碰巧写入交换文件的内存时,也会发生类似的情况 - 发生陷阱并且操作系统取消交换页面并且您的程序继续。
【讨论】: