2016-08-25 24 views
3

对FS的目的,我发现MSDN文档注册:什么是在Windows上使用的GS寄存器?

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

其中指出:

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

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

有人能告诉我在哪里看,或给出解释?

+2

差不多相同的东西。见例如[this](http://stackoverflow.com/questions/6611346/how-are-the-fs-gs-registers-used-in-linux-amd64)和[this](https://github.com/wishstudio/flinux /维基/差异-间的Linux和Windows)中。 – Michael

+0

@Michael:我看了,但是在他们两人中都没有看到这个问题的答案。所以Windows对TIB使用'FS',但是'GS'呢?它是否对用户空间有用?一个快速的谷歌发现['GS'拥有x86-64 Windows上的TIB引用](https://en.wikipedia.org/wiki/Win32_Thread_Information_Block),这似乎很奇怪,因为'swapgs'使内核不太方便修改'gs'的用户空间值。 (Linux为此使用'fs',IIRC)。但无论如何,那么问题是,在64位Windows上使用的其他段寄存器是什么? –

+0

在Windows上使用FS和GS是一个实现细节,故意没有记录。如果我没有记错的话,逆向工程建议在32位Windows上,FS保存一个指向TIB/TEB的指针,而GS要么保存一个指向线程本地存储(TLS)的指针,要么根本不使用。在64位Windows上,GS指向TIB/TEB。为什么你需要知道这些信息?你想解决什么问题? –

回答

6

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

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

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

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

相关问题