栈是和线程关联的,每个线程会有一个栈。默认情况下,应用程序的栈是1MB,kernel程序的的栈是256KB。
在设置栈的时候有两个参数(/STACK: reserve[, commit])
其中 reserve是栈的最大容量,但线程刚启动的时候,栈并没有那么大,随着需要增长。 commit是增长的一个步进。
在ring3中,线程相关的信息存储在_TEB块里,位于fs段中。_TEB的最前面是_NT_TIB块。
ntdll!_NT_TIB
+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x004 StackBase : Ptr32 Void 栈顶部地址
+0x008 StackLimit : Ptr32 Void 栈大小
+0x00c SubSystemTib : Ptr32 Void
+0x010 FiberData : Ptr32 Void
+0x010 Version : Uint4B
+0x014 ArbitraryUserPointer : Ptr32 Void
+0x018 Self : Ptr32 _NT_TIB
![pe%E6%96%87%E4%BB%B6%E5%AD%A6%E4%B9%A0.JPG](https://i-blog.csdnimg.cn/blog_migrate/35a182c6531cafab783533a97db316cf.jpeg)
![pixy.gif?x-id=0b8fe99e-00c2-4e33-9c12-4fb259e9adf8](http://img.zemanta.com/pixy.gif?x-id=0b8fe99e-00c2-4e33-9c12-4fb259e9adf8)