在WindowsOSforx86-32/x86-64体系结构中,线程堆栈虚拟内存由“预留部分”、“提交部分”、“保护页”和“保留页”组成。
问题:
假设我有1页提交内存,以及1MB的线程堆栈保留内存。我在堆栈上分配一些等于K页的内存,而不进行初始化。例如,k等于10。在堆栈开始时,堆栈上的帧内存将由用户空间代码分配,如下所示:
sub esp, K*4096保护页机制在存在读写请求以保护页面时工作。
但是,我将对超出这个保护页的一些内存执行读/写操作呢?
发布于 2014-09-18 11:50:00
您通常是在启用运行时检查的情况下开始测试编译的代码的。默认情况下,在调试配置中启用了/RTC on MSVC++,它在函数序言中注入对_chkstk()的调用。GCC/g++有非常相似的东西。
它探测函数序言中分配的页面,每隔4096字节读取一次。这可以确保你总是在错误的时候点击守卫页面,触发这个站点的名字并帮助你修复这个错误。
如果没有检查,从技术上讲,您可以寻址一个根本不属于堆栈的页面。虽然它很可能触发处理器的#GP陷阱,但它并不保证,因为页面可能已经被另一个无关的分配映射了。你一定不走运,已经办到了。基本UB,绝对可怕的诊断,因为你从来没有怀疑堆栈,/RTC是相当有价值的。
发布于 2015-06-27 08:53:54
当访问地址超出保护页时,程序将崩溃,但默认情况下,编译器将在每次本地分配超过4K时调用__chkstk()函数。
下面是一篇解释堆栈保护页面如何在windows中工作的文章:kb100775
https://stackoverflow.com/questions/25908736
复制相似问题