在线程创建时如何确定线程的初始上下文(寄存器状态)?
例如:当前线程上下文 eax=0x4、ebx=0x9000、ecx=0xfff 等... 创建一个线程被调用以从 0xbfbfbf 开始执行。线程的 eip 似乎很明显将被设置为 0xbfbfbf,但其他寄存器呢。它们是从当前线程复制的吗?它们是否设置为 0x00000000?堆栈指针是否相同?我想知道在创建线程时初始线程上下文会发生什么。我查过谷歌和操作系统内部书籍,但没有找到我要找的东西。
另外,在其他操作系统上,特别是 Linux 和 Windows 上,过程是否相同?
答案1
当新线程开始执行时,其寄存器会从其存储的上下文中加载,就像已经运行的线程一样。创建线程的线程可以在将其添加到操作系统的运行线程表中之前随意填写新线程的上下文结构。
基本上它的工作原理如下:
分配了新的任务结构。
新任务结构中的字段可根据需要进行填充。其中包括寄存器、堆栈指针等。
任务结构被标记为“准备运行”,并添加到调度程序的任务列表中。
调度程序决定调度新线程,从任务结构中加载其上下文,并切换到它。
该线程现在具有创建线程为其填充的任何寄存器、堆栈和指令指针。