fs段寄存器如何指向TEB和KPCR。这些数据结构是否保存在线程用户和内核堆栈中?那么,当线程上下文从用户切换到内核时,包含 TEB 指针的 fs 段 reg 被保存到线程用户堆栈,然后指向 KPCR 的内核 fs 段寄存器被加载回fs段寄存器?这就是 fs 段寄存器指向 TEB 和 KPCR 的方式吗?
最佳答案
FS
寄存器在 LDT
或 GDT
(本地/全局段描述符表)中有一个与之关联的段基地址). FS
几乎是描述符表的索引,它选择表中定义的段之一。
当您通过FS
(在指令中使用FS
段覆盖前缀)访问内存时,您访问的虚拟地址等于指令中的地址< em>加上段基址。
该段基地址必须与线程特定控制数据结构的位置一致。因此,当使用其特定控制数据结构创建线程时,基数将设置为指向该数据。
这些位置对于同一进程中的不同线程是不同的,因为它们都共享内存并且不应该踏入彼此的结构。上下文切换要么只是更新 FS
以指向不同的段,要么更新描述符表中该段的基地址,然后重新加载 FS
,这样更改就可以被中央处理器。
当线程从用户模式转换到内核模式时,FS
及其指向的内容不受内核 POV 的信任,我希望内核重新加载 FS
指向内核端线程特定数据结构的值。在返回的路上,用户模式 FS
应该被恢复。实际上,事情可能会稍微复杂一些,但这应该能让您有所了解。
在 64 位模式下,您甚至可以使用 SWAPGS
指令来快速交换 GS
寄存器的内容,起到类似于 FS
在 32 位模式下。
关于windows - 线程 fs 段寄存器在用户和内核空间之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15332171/