windows线程内幕
以下内容引述至《windows核心编程》
创建和初始化
CreateThread函数的一个调用导致系统创建一个线程内核对象。该对象的初始化引用计数为2,(除非线程终止,而且从CreateThread返回的句柄关闭,否则线程内核对象不会被销毁)
一旦创建了内核对象,系统就分配内存,提供给线程的堆栈使用。内存是从进程的地址空间内分配的,因为线程没有自己的地址空间。然后,系统将两个值写入新线程堆栈的最上端(线程堆栈始终是从高为位内存向低位内存地址构建的)
每个线程都有自己的一组CPU寄存器,称为线程的上下文(context)。上下文反映了当线程的上一次执行时,线程的CPU寄存器的状态。线程的CPU寄存器全部保存在一个context结构(在WinNT.h头文件中定义),结构本身保存在线程内核对象中。
指令指针寄存器和栈指针寄存器是线程上下文中最重要的两个寄存器。线程始终在进程的上下文中运行。所以,这两个寄存器地址标识的内存都位于线程所在进程的地址空间中。
线程启动
当线程的内核对象被初始化后,context结构的堆栈指针寄存器被设为pfnStartAddr在线程堆栈中的地址。而指令指针寄存器被设为RtlUserThreadStart函数(NTDLL.dll模块)的地址。
线程完全初始化后,系统将检查CREATE_SUSPEND