以下内容引述《windows核心编程》
线程栈
当系统创建线程时,会为线程栈预定一块地址空间区域(每个线程都有自己的栈),并给区域调拨一些物理存储器。默认情况下,系统会预定1MB的地址空间并调拨2个页面的存储器。
也可以通过编译器选项控制 MicroSoft C++编译器的/F选项,或者MSVC链接器的/STACK 选项
/Freserve
/STACK:reserve[, commit]
链接器会将想要的栈大小写入PE文件头中。
也可以通过调用CreateThread或者_beginthreadex函数时参数指定大小。
在预定地址空间区域后,系统会给区域顶部(即地址最高)的两个页面调拨物理存储器。在让线程开始执行之前,系统会把线程栈的指针指向区域顶部的那个页面的末尾(该地址非常接近0x08100000)
这个页面就是线程开始使用栈的地方。区域顶部往下的第二个页面被称为防护页面(guard page),随着线程调用越来越多的函数,调用树也越来越深,线程也需要越来越多的空间。
线程地址空间
完整的线程堆栈区域
用尽的堆栈