栈总结篇
今天想总结一下栈的知识。
栈是和线程关联的,每个线程会有一个栈。默认情况下,应用程序的栈是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
![](https://www.cnblogs.com/images/cnblogs_com/fanzi2009/pe%E6%96%87%E4%BB%B6%E5%AD%A6%E4%B9%A0.JPG)
栈是和线程关联的,每个线程会有一个栈。默认情况下,应用程序的栈是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
![](http://img.zemanta.com/pixy.gif?x-id=0b8fe99e-00c2-4e33-9c12-4fb259e9adf8)