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

时间:2013-03-11 06:04:42

标签: windows multithreading kernel

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

当线程从用户模式转换到内核模式时,FS及其指向的内容是不受内核POV的限制,我希望内核重新加载FS并指向内核的值特定于线程的数据结构。在回来的路上,应该恢复用户模式FS。事实上,事情可能会有点复杂,但这应该会给你一个想法。

在64位模式下,您甚至可以使用SWAPGS指令快速交换GS寄存器的内容,在32位模式下扮演类似于FS的角色。

答案 1 :(得分:0)

所以fs段寄存器肯定指向kpcr。查看windbg并在发出“dt nt!_kpcr”之后,kpcr中的第一个结构是NtTib或TEB中的第一个结构,因此当人们说fs指向KPCR和TEB时,fs实际上指向KPCR,TIB / TEB是KPCR中的第一个数据结构。