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

标签 windows multithreading kernel

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

最佳答案

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

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

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

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

当线程从用户模式转换到内核模式时,FS 及其指向的内容不受内核 POV 的信任,我希望内核重新加载 FS指向内核端线程特定数据结构的值。在返回的路上,用户模式 ​​FS 应该被恢复。实际上,事情可能会稍微复杂一些,但这应该能让您有所了解。

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

关于windows - 线程 fs 段寄存器在用户和内核空间之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15332171/

相关文章:

asp.net - 从 Outlook 中的网页发送文件

c++ - boost::asio 多线程问题

c# - 通过在线程库中处理来消除对 Invoke() 的需求

c++ - 如何编写一个 hello world 内核?

linux - 为什么 cat 调用 read() 两次就足够了?

windows - 在现有的 emacs 框架中打开文件 (Windows)

windows - Windows 中的 Haskell runCommand

python - 如何用一个线程监听redis的所有订阅 channel ?

linux - 为什么不在 ARM Linux Kernel 上为 vmalloc 填写页面错误中的 PTE 条目?

windows - VBS 或 Bat - 确定操作系统和 Office 版本