5

fs段寄存器如何指向TEB和KPCR。这些数据结构是否保存在线程用户和内核堆栈中?那么,当线程上下文从用户切换到内核时,包含 TEB 指针的 fs 段寄存器被保存到线程用户堆栈中,然后指向 KPCR 的内核 fs 段寄存器被加载回fs 段寄存器?这是 fs 段寄存器指向 TEB 和 KPCR 的方式吗?

4

2 回答 2

4

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

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

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

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

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

在 64 位模式下,您甚至有SWAPGS快速交换GS寄存器内容的指令,其作用类似于FS在 32 位模式下。

于 2013-03-11T06:38:13.287 回答
0

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

于 2013-03-12T07:30:35.117 回答