【问题标题】:What is the GS register used for on Windows? [duplicate]GS 寄存器在 Windows 上是做什么用的? [复制]
【发布时间】:2017-01-01 09:35:27
【问题描述】:

我找到了有关 FS 寄存器用途的 MSDN 文档:

https://msdn.microsoft.com/en-us/library/ms253960(v=vs.90).aspx

其中指出:

"在x86环境下,FS寄存器指向当前值 线程信息块 (TIB) 结构。"

但我似乎无法在基于 Windows 的环境中找到任何关于 GS 寄存器用途的严格文档。

谁能告诉我去哪里看,或者给个解释?

【问题讨论】:

  • 几乎是一样的。参见例如thisthis.
  • @Michael:我看过了,但我在他们俩都没有看到这个问题的答案。所以 Windows 使用 FS 作为 TIB,但是 GS 呢?它对用户空间有用吗?一个快速的谷歌发现GS holds the TIB reference on x86-64 Windows,这似乎很奇怪,因为swapgs 使内核更不方便修改gs 的用户空间值。 (出于这个原因,Linux 使用 fs 进行 TLS,IIRC)。但不管怎样,那么问题来了,64 位 Windows 上的另一个段寄存器是干什么用的?
  • 在 Windows 上使用 FS 和 GS 是一个实现细节,故意没有记录。如果我没记错的话,逆向工程表明在 32 位 Windows 上,FS 持有指向 TIB/TEB 的指针,而 GS 持有指向线程本地存储 (TLS) 的指针,或者根本不使用。在 64 位 Windows 上,GS 指向 TIB/TEB。为什么你需要知道这些信息?你想解决什么问题?

标签: windows assembly x86


【解决方案1】:

在 32 位 Windows 上,GS 保留供将来使用。
FS 段指向Thread information block

在 x64 模式下,FSGS 段寄存器已互换。

在 x86 模式下 FS:[0] 指向 TIB 的开头,在 X64 中它是 GS:[0]
Win64 使用GS 的原因是FS 寄存器用于32 位兼容层(混淆地称为Wow64)。
由于 32 位应用程序使用 FS,因此简化了 Win64 的簿记。
32 位应用程序永远不会导致GS 被更改,64 位应用程序永远不会导致FS 被更改。

请注意,GS 在 Win64 和 Wow64 中非零这一事实可用于检测 32 位应用程序是否在 64 位 Windows 中运行。
在“真正的”32 位 Windows 中,GS 始终为零。

【讨论】:

    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2018-01-16
    • 2021-10-23
    • 2013-02-17
    相关资源
    最近更新 更多