windows核心编程指南16.pdf

windows核心编程指南16.pdf

ID:52241279

大小:1.16 MB

页数:12页

时间:2020-03-25

windows核心编程指南16.pdf_第1页
windows核心编程指南16.pdf_第2页
windows核心编程指南16.pdf_第3页
windows核心编程指南16.pdf_第4页
windows核心编程指南16.pdf_第5页
资源描述:

《windows核心编程指南16.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、下载第16章线程的堆栈有时系统会在你自己进程的地址空间中保留一些区域。第3章讲过,对于进程和线程环境块来说,就会出现这种情况。另外,系统也可以在你自己进程的地址空间中为线程的堆栈保留一些区域。每当创建一个线程时,系统就会为线程的堆栈(每个线程有它自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个已保留的区域。按照默认设置,系统保留1MB的地址空间并提交两个页面的内存。但是,这些默认值是可以修改的,方法是在你链接应用程序时设定Microsoft的链接程序的/STACK选项:当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是,当调用C

2、reateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。图16-1显示了在页面大小为4KB的计算机上的一个堆栈区域的样子(保留的起始地址是0x08000000)。该堆栈区域和提交给它的所有物理存储器均拥有页面保护属性PAGE_READWRITE。内存地址页面状态0x080FF000堆栈顶部:已提示的页面0x080FD000带

3、有保护属性标志的已提交页面0x080FD000保留页面0x08003000保留页面0x08002000保留页面0x08001000保留页面0x08000000堆栈底部:保留页面图16-1线程的堆栈区域刚刚创建时的样子386计计第三部分内存管理下载当保留了这个区域后,系统将物理存储器提交给区域的顶部的两个页面。在允许线程启动运行之前,系统将线程的堆栈指针寄存器设置为指向堆栈区域的最高页面的结尾处(一个非常接近0x08100000的地址)。这个页面就是线程开始使用它的堆栈的位置。从顶部向下的第二个页面称为保护页面。当线程调用更多的函数来扩展它的调用树状结构时,线程将需要更多的堆栈空间。

4、每当线程试图访问保护页面中的存储器时,系统就会得到关于这个情况的通知。作为响应,系统将提交紧靠保护页面下面的另一个存储器页面。然后,系统从当前保护页面中删除保护页面的保护标志,并将它赋予新提交的存储器页面。这种方法使得堆栈存储器只有在线程需要时才会增加。最终,如果线程的调用树继续扩展,堆栈区域就会变成图16-2所示的样子。如图16-2所示,假定线程的调用树非常深,堆栈指针CPU寄存器指向堆栈内存地址0x08003004。这时,当线程调用另一个函数时,系统必须提交更多的物理存储器。但是,当系统将物理存储器提交给0x08001000地址上的页面时,系统执行的操作与它给堆栈的其他内存区域

5、提交物理存储器时的操作并不完全一样。图16-3显示了堆栈的保留内存区域的样子。如你预计的那样,从地址0x08002000开始的页面的保护属性已经被删除,物理存储器被提交给从0x08001000地址开始的页面。它们的差别是,系统并不将保护属性应用于新的物理存储器页面(0x08001000)。这意味着该堆栈已保留的地址空间区域包含了它能够包含的全部物理存储器。最底下的页面总是被保留的,从来不会被提交。下面将要说明它的原因。当系统将物理存储器提交给0x08001000地址上的页面时,它必须再执行一个操作,即它要引发一个EXCEPTION_STACK_OVERFLOW异常处理(在WinNT

6、.h文件中定义为0xC00000FD)。通过使用结构化异常处理(SEH),你的程序将能得到关于这个异常处理条件的通知,并且能够实现适度恢复。关于SEH的详细说明,请参见第23、24和25章的内容。本章结尾处的Summation示例应用程序将展示如何对堆栈溢出进行适度恢复。内存地址页面状态0x080FF000堆栈顶部:已提交的页面0x080FD000已提交的页面0x080FD000已提交的页面0x08003000已提交的页面0x08002000带有保护属性标志的已提交页面0x08001000保留页面0x08000000堆栈底部:保留页面图16-2几乎完整的线程堆栈区域第16章线程的堆

7、栈计计387下载内存地址页面状态0x080FF000堆栈顶部:已提交的页面0x080FE000已提交的页面0x080FD000已提交的页面0x08003000已提交的页面0x08002000已提交的页面0x08001000已提交的页面0x08000000堆栈底部:保留页面图16-3完整的线程堆栈区域如果在出现堆栈溢出异常条件之后,线程继续使用该堆栈,那么在0x08001000地址上的页面中的全部内存均将被使用,同时,该线程将试图访问从0x08000000开始的页面中的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。