windows线程内幕

本文深入探讨Windows线程的创建与初始化过程,包括CreateThread函数如何创建线程内核对象,系统如何分配线程堆栈,以及线程启动时的上下文设置。线程在启动后,会设置异常处理帧并调用指定的线程函数,线程函数执行完毕后通过ExitThread退出。主线程的启动与普通线程有所不同,由RtlUserThreadStart引导,调用C/C++运行库初始化并进入应用程序入口点。
摘要由CSDN通过智能技术生成

windows线程内幕

以下内容引述至《windows核心编程》

创建和初始化

线程内核创建及初始化
CreateThread函数的一个调用导致系统创建一个线程内核对象。该对象的初始化引用计数为2,(除非线程终止,而且从CreateThread返回的句柄关闭,否则线程内核对象不会被销毁)

一旦创建了内核对象,系统就分配内存,提供给线程的堆栈使用。内存是从进程的地址空间内分配的,因为线程没有自己的地址空间。然后,系统将两个值写入新线程堆栈的最上端(线程堆栈始终是从高为位内存向低位内存地址构建的)

每个线程都有自己的一组CPU寄存器,称为线程的上下文(context)。上下文反映了当线程的上一次执行时,线程的CPU寄存器的状态。线程的CPU寄存器全部保存在一个context结构(在WinNT.h头文件中定义),结构本身保存在线程内核对象中。

指令指针寄存器和栈指针寄存器是线程上下文中最重要的两个寄存器。线程始终在进程的上下文中运行。所以,这两个寄存器地址标识的内存都位于线程所在进程的地址空间中。

线程启动

当线程的内核对象被初始化后,context结构的堆栈指针寄存器被设为pfnStartAddr在线程堆栈中的地址。而指令指针寄存器被设为RtlUserThreadStart函数(NTDLL.dll模块)的地址。

线程完全初始化后,系统将检查CREATE_SUSPEND

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值