线程fs段寄存器在用户和内核之间切换

use*_*720 5 windows multithreading kernel

fs段寄存器如何指向TEB和KPCR.这些数据结构是保存在线程用户和内核堆栈上的吗?因此,当线程上下文切换从用户到内核发生时,fs段reg包含一个指针,TEB被保存到线程用户堆栈上,然后指向KPCR的内核fs段寄存器被加载回fs段注册?这是fs段寄存器指向TEB和KPCR的方式吗?

Ale*_*nze 4

该寄存器在(本地/全局段描述符表)或(本地/全局段描述符表)中FS具有与其关联的段基地址。几乎是描述符表的索引,它选择表中定义的段之一。LDTGDTFS

FS当您通过(使用指令中的段覆盖前缀)访问内存时FS,您访问的虚拟地址等于指令中的地址加上段基地址。

该段基地址必须与线程特定控制数据结构的位置一致。因此,当使用其特定的控制数据结构创建线程时,基址被设置为指向该数据。

对于同一进程中的不同线程来说,这些位置是不同的,因为它们都共享内存并且不应该跨入彼此的结构。上下文切换要么只是更新FS以指向不同的段,要么更新描述符表中该段的基地址,然后重新加载,FS以便 CPU 观察到更改。

当线程从用户模式转换到内核模式时,FS它所指向的内容不受内核 POV 的信任,我希望内核重新加载FS一个指向内核端线程特定数据结构的值。在回来的路上,FS应该恢复用户模式。实际上,事情可能会更复杂一些,但这应该可以给您一个想法。

在64位模式下甚至可以有SWAPGS快速交换寄存器内容的指令GS,起到类似于FS32位模式下的作用。