《windows核心编程》- 线程栈
当系统创建线程的时候,会为线程栈预订一块地址空间区域,并给该区域调拨一些物理存储器。默认会预订1MB的地址空间并调拨两个页面的存储器。但是在构建 应用程序的时候可以改变这个默认值 在构建应用程序的时候链接器会把栈的大小写入到exe和dll文件的pe文件头中,当创建线程的时候会根据PE文件头中的大小来预订空间区域。在调用CreateThread或_beginthreadex的时候开发人员可以指定需要在一开始就调拨的地址空间大小和存储器大小。 下面显示了一台页面大小为4KB的机器上线程栈的地址空间区域(基址为0x08100000 )。该线程栈的地址空间区域和所调拨给该区域的都具有PAGE_READWRITE保护属性。 在预订地址空间后,系统会给区域顶部的两个页面调拨物理存储器。在线程开始之前系统会把线程栈的指针指向最上面那两个页面的末尾。这个页面就是线程开始使用栈的地方。区域顶部往下的第二个页面被称为防护页面。随着调用的越来越多,调用树也越来越深,线程也需要越来越多的栈空间 当线程试图访问防护页中的内存时,系统会得到通知这时系统会先给防护页面下面的那个页面调拨存储器,接着去除当前防护页面的PAGE_GUARD保护属性标志,然后给刚调拨的存储页指定PAGE_GUARD保护属性标志。该项技术使得系统能够在线程需要的时候才增加栈存储器大小。如果线程的调用树 断加深