
すべてのWoW64アプリは、WoW64エミュレーションレイヤーを通過します。
このレイヤーで何が起こっているのか知りたいです(特に、アドレス空間をどのように変換できるか)
重要なポイントを教えてください。
すでに図を投稿しているので、WOW64が存在する理由を理解していることは明らかです。今あなたの質問に答えるために:
このレイヤーで何が起こっているのか知りたいのですが。
それがどのように実装されているか知りたいと思います。
プロセスの起動:ローダーは、通常どおり64ビットのユーザーモード部分「Ntdll.dll」をロードしますが、プロセスが32ビット実行の場合は32ビットのNtdll.dllもロードします。Wow64.dllを使用して初期化するのはローダーの責任です。これは、32ビットNtdllでプロセスとスレッドのコンテキストをセットアップし、実行のために「CPUを32ビットモードに切り替えます」。
システムコール:システムコールまで、すべてが32ビットモードで実行されています。システムコールはNtdll.dll、User32.dll、Gdi32.dllなどを経由することがわかっています。この場合、32ビットバージョンです。これらのライブラリの別の32ビットバージョンが\Windows\Syswow64ビットフォルダにあります。これらは、「ネイティブシステムコール」を発行する代わりに、実際にWow64.dllを呼び出すスタブです。これで、Wow64.dllを64ビットモードに移行し、パラメーターを対応する64ビットに変換し、64ビットバージョンを使用してシステムコールを発行し、結果を取得して、出力を32ビットに再変換するのは簡単です。次に、CPUを32ビットモードに戻し、出力を返します。
例外ディスパッチ、ユーザーコールバック、ファイルシステムとレジストリの操作、およびI / Oは、どこかでフックを使用して同じ方法で処理されます。下記の本を読んでください。
(特に、アドレス空間を変換する方法)。
64ビットアドレス空間は、32ビットアドレス空間のスーパーセットです。さらに、32ビット/ 64ビットの同じポインタ(実際にはPTE)は、アドレス空間全体を参照するために使用されませんが、ユーザー空間とシステム空間に別々のページテーブルがあります。
重要なポイントを教えてください。
Windowsを知るために、私があなたに与えることができる最も重要なポイントは、「WindowsInternals」を読むことです-Russinovich
MSDNによると:
WOW64は、32ビットのWindowsベースのアプリケーションを64ビットのWindowsでシームレスに実行できるようにするx86エミュレーターです。WOW64はオペレーティングシステムに付属しており、明示的に有効にする必要はありません。
システムは、32ビットアプリケーションを64ビットアプリケーションから分離します。これには、ファイルとレジストリの衝突の防止が含まれます。コンソール、GUI、およびサービスアプリケーションがサポートされています。このシステムは、カットアンドペーストやCOMなどのシナリオで、32/64の境界を越えた相互運用性を提供します。ただし、32ビットプロセスは実行のために64ビットDLLをロードできず、64ビットプロセスは実行のために32ビットDLLをロードできません。
具体的に何がわかりませんか?WoW64サブシステムに関するウィキペディアの記事をすでに読んだことがありますか?かなり包括的な概要が提供されていることがわかると思います。
そして、Microsoftはここにいくつかの追加の詳細を提供します:WOW64実装の詳細
「特に、アドレス空間を変換する方法」
その秘訣は、amdおよびintelx64プロセッサが32ビットと64ビットのコードを並べて実行することをサポートしていることを知っていることです。これにより、OS(ネイティブx64を実行している場合)は、64ビットスレッドと共存する32ビットアドレス指定を持つ32ビットスレッドのコンテキストを作成できます。
同様に、ホストOSが32ビットを実行している場合、win16およびdosアプリケーションを実行するための16ビットスレッドを作成できます。
注:OS 64ビットで実行している場合、32ビットと16ビットのスレッドを作成できるとは思いません-amdは、下位互換性が高すぎると判断したと思います:-)