WOW64

出典: フリー百科事典『ウィキペディア(Wikipedia)』

WOW64(ワウ64、Windows-On-Windows 64)とは、64ビット版のMicrosoft WindowsWindows XPWindows Server 2003及びWindows Vistaの一部)においてWin32アプリケーションを実行する、エミュレーションレイヤー・サブシステムである。

目次

[編集] 概要

64ビット版のWindowsは基本的に、完全に64ビット化された64ビットNTカーネルの上にある、Win64サブシステムで動作する。他のx64対応オペレーティングシステムが、32ビットABIを完全に見捨てるか、あるいは完全に互換性を取るかのいずれかの選択をした。64ビットのWindowsでは、64ビットABIと32ビットABIの両方をサポートし、Win32APIをWin64APIに呼び変えるエミュレーション層を実装した。これにより、32ビットアプリケーションはそのまま64ビットのWindowsでも動作する。

[編集] 構造

WOW64は、WOW64ホストプロセスによって予約された4GBの仮想空間に32ビット ABIのコードを読み込み、そこで発生したWin64 APIに変換可能なAPI呼び出しを変換して、Win64サブシステムに伝達する。構造体のトランケート・エキスパンドは自動的に行われ、Win32側では現在動作しているOSが32ビットシステムか、64ビットシステムかを意識する必要は全くない。またユーザーランドで動作するコンポーネント群は32ビット版と64ビット版が用意され、例えばOLEなどは32bitで閉じた範囲で動作する事ができる。64ビット版で提供されるコードは単一のソースから、32ビット版と64ビット版両方をそれぞれコンパイルして作られている為、機能的には32ビットシステムと64ビットシステムの間に差異は無い。

[編集] 問題点

Windowsの64ビットABIは、そのままWin32の32ビットABIを64ビットに拡張した物である。従って、64ビットABIのアプリケーションは8TBのアドレス空間を独占的に使える様になっている。ここに一つの問題点がある。32ビット ABIのコードを格納可能な仮想空間下位4GBが64ビットABIに独占されてしまった事である。この為、32ビットABIを格納する場所が無く、32ビットアプリケーションはもとより、DLLOCXをロードして呼び出す事も出来なくなってしまった。事実マイクロソフトは、32ビットABIのコードと64ビットABIのコードを相互に呼び出す事を禁止している(COMインターフェースを経由して相互乗り入れは可能であるが、x64アーキテクチャで本来可能であったシームレスな32ビットコードと64ビットコードの相互呼び出し機能は全く生かされていない)。この顕著な例として、Internet Explorerの振舞があげられる。32ビットのActiveXコンポーネントを検出すると、64ビット版Internet Explorerは処理を中断して32ビット版Internet Explorerに処理を引き継ぐ。32ビットアプリケーションと64ビットアプリケーションの間には、実行ファイル以外のコンポーネント群を互いに利用する事が出来ない深い溝がある。

[編集] プログラミング

16bit時代から32bitへの過渡期に用意されたthunkメカニズムはWOW64では提供されていない。 その代わり異なるABI間の呼び出しは、外部プロセスCOMインターフェースによって可能である。 なお前述の通り基本的にInprocサーバーは使用できない。 外部プロセスCOMインターフェースにより、ABI間のマーシャリングがMIDL情報を元にWOW64によって行われ、例えば64ビットプロセスから32ビットプロセスのメソッドを呼び出す事ができる(逆も可能である)。 この機能は非常に重要な機能を提供する。 2007年現在、Windowsアプリケーションやミドルウエアの殆どはx64に移植されていない。 よってこれらのソフトウエア資源を継承しつつ、x64に対応したアプリケーションを開発するには、WOW64の機能を使って32bitソフトウエア資源へのアクセスを確保し、64ビットアプリケーションに対してCOMインターフェースの形で提供する事で、異なるABIが混在する過渡期を乗り越える事ができる。 またCOMインターフェースの形をとる事により、.NET Frameworkへのアクセスも用意できる。

[編集] リンク

他の言語