2016-08-25 26 views
3

私はFSの目的でMSDNのドキュメントが登録見つけた:、x86の環境ではWindows上で使用するGSレジスタは何ですか?

」の現在の値にFSレジスタポイント:ということを述べている

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

スレッド情報ブロック(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/wiki/LinuxとWindowsの違い)。 – Michael

+0

@マイケル:私は見ましたが、私はどちらの人にもこの質問に対する答えは見ません。 WindowsはTIBに 'FS'を使いますが、' GS'はどうですか?それはユーザー空間にとって有用な何かを保持していますか?速いgoogleでは、 '' GS'がx86-64 Windows上でTIBリファレンスを保持していることがわかりました(https://en.wikipedia.org/wiki/Win32_Thread_Information_Block)。これは 'swapgs'がカーネルにとってあまり便利ではないので奇妙に思えます。 'gs'のユーザ空間の値を変更してください。 (Linuxはこの理由でTLSに '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モードでは、FSおよびGSセグメントレジスタがスワップされています。

x86モードでFS:[0]TIBの先頭を指し、X64はGS:[0]です。
Win32がGSを使用するのは、32ビット互換レイヤー(混乱させるWow64)でFSレジスタが使用されているためです。
32ビットアプリケーションはFSを使用するため、Win64のための簿記は簡素化されます。
32ビットアプリケーションでは、GSが変更されず、64ビットアプリケーションではFSが変更されることはありません。

Win64およびWow64でGSがゼロでないという事実は、32ビットアプリケーションが64ビットWindowsで動作しているかどうかを検出するために使用できます。
「真の」32ビットのWindows GSは常にゼロです。

関連する問題