在用于x86-32/x86-64体系结构的Windows操作系统上,线程堆栈虚拟内存由“保留部分”,“提交部分”,“保护页面”和“保留页面”组成。
问题:
想象一下,我有1页的提交内存,还有1MB的线程堆栈保留内存。
我没有初始化就在堆栈上分配了一些内存,该内存等于K页。例如,K等于10。似乎在堆栈开始时,堆栈上的内存将由用户空间代码分配,如下所示:
sub esp, K*4096
当存在对保护页面的读写请求时,保护页面机制起作用。
但是,我将对超出此保护页面的某些内存执行读/写操作吗?
最佳答案
通常,您会开始测试在启用运行时检查的情况下编译的测试代码。 /RTC on MSVC++(在Debug配置中默认启用),它将在函数序言中插入对_chkstk()的调用。 GCC/g++具有something very similar。
它在函数序言中探查分配的页面,每隔4096个字节读取一次。这样可以确保您总是在遇到错误时访问保护页面,从而触发该网站的名称并帮助您修复错误。
如果没有适当的检查,从技术上讲,您可以解决根本不属于堆栈的页面。尽管很有可能触发处理器的#GP陷阱,但由于页面可能已被另一个不相关的分配映射而无法保证。您一定很不幸,它已经完成了。/RTC非常重要,因为您从不怀疑堆栈,因此根本的UB诊断起来非常可怕。