首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在未初始化局部变量的情况下,Windows线程堆栈保护页机制是如何工作的?

在未初始化局部变量的情况下,Windows线程堆栈保护页机制是如何工作的?
EN

Stack Overflow用户
提问于 2014-09-18 09:17:19
回答 2查看 2.8K关注 0票数 4

在WindowsOSforx86-32/x86-64体系结构中,线程堆栈虚拟内存由“预留部分”、“提交部分”、“保护页”和“保留页”组成。

问题:

假设我有1页提交内存,以及1MB的线程堆栈保留内存。我在堆栈上分配一些等于K页的内存,而不进行初始化。例如,k等于10。在堆栈开始时,堆栈上的帧内存将由用户空间代码分配,如下所示:

代码语言:javascript
复制
sub esp, K*4096

保护页机制在存在读写请求以保护页面时工作。

但是,我将对超出这个保护页的一些内存执行读/写操作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-18 11:50:00

您通常是在启用运行时检查的情况下开始测试编译的代码的。默认情况下,在调试配置中启用了/RTC on MSVC++,它在函数序言中注入对_chkstk()的调用。GCC/g++有非常相似的东西

它探测函数序言中分配的页面,每隔4096字节读取一次。这可以确保你总是在错误的时候点击守卫页面,触发这个站点的名字并帮助你修复这个错误。

如果没有检查,从技术上讲,您可以寻址一个根本不属于堆栈的页面。虽然它很可能触发处理器的#GP陷阱,但它并不保证,因为页面可能已经被另一个无关的分配映射了。你一定不走运,已经办到了。基本UB,绝对可怕的诊断,因为你从来没有怀疑堆栈,/RTC是相当有价值的。

票数 4
EN

Stack Overflow用户

发布于 2015-06-27 08:53:54

当访问地址超出保护页时,程序将崩溃,但默认情况下,编译器将在每次本地分配超过4K时调用__chkstk()函数。

下面是一篇解释堆栈保护页面如何在windows中工作的文章:kb100775

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25908736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档