WOW64

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

概要[編集]

64ビット版のWindowsは基本的に、完全に64ビット化されたNTカーネルで動作する。x64IA-64対応のオペレーティングシステムでは、x86の32ビットABIに対応するかどうかの選択を迫られることとなった。64ビットのWindowsでは、64ビットABIと32ビットABIの両方に対応し、Win32APIをWin64APIに呼び変えるエミュレーション層が実装されている。これがWOW64である。これにより、32ビットアプリケーションはそのまま64ビットのWindowsでも動作する。

構造[編集]

WOW64は、WOW64ホストプロセスによって予約された4GBの仮想空間に32ビットABIのコードを読み込み、そこで発生したWin64 APIに変換可能なAPI呼び出しを変換して、Win64サブシステムに伝達する。構造体の変換は自動的に行われ、Win32側では現在動作しているOSが32ビットシステムか、64ビットシステムかを意識する必要は全くない。またユーザーモードで動作するコンポーネント群は32ビット版と64ビット版が用意され、例えばOLEなどは32ビットで閉じた範囲で動作できる。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ビットアプリケーションの間には、実行ファイル以外のコンポーネント群を互いに利用することができない深い溝がある。

プログラミング[編集]

16ビット時代から32ビットへの過渡期に用意されたサンク(thunk)メカニズムはWOW64では提供されず、32ビットプログラムと64ビットプログラムは1つのプロセスに共存できない。32ビットのプロセスと64ビットのプロセスとの通信は、アウトプロセスCOMをはじめとして、各種のプロセス間通信が使用可能である[1]

2010年現在、Windowsアプリケーションやミドルウエアの殆どはx64には移行していない。よってこれらのソフトウエア資源を継承しつつ、x64に対応したアプリケーションを開発するには、WOW64の機能を使って32ビットソフトウエア資源へのアクセスを確保し、64ビットアプリケーションに対してCOMインターフェースの形で提供することで、異なるABIが混在する過渡期を乗り越えることができる。またCOMインターフェースの形をとることにより、.NET Frameworkへのアクセスも用意できる。

システムフォルダとレジストリ[編集]

2010年現在の64Bit Windowsでは、Windows システムフォルダ(%systemroot%\System32)には64ビットのバイナリが置かれ、32ビットプログラムはその中にあるファイルには直接アクセスすることができない。32ビットプログラムによるSystem32フォルダへのアクセスは、自動的に%systemroot%\SysWOW64へとリダイレクトされる動作となり、プログラムからはSystem32フォルダにアクセスしているように見える。SysWOW64フォルダには32ビットのバイナリが用意されている。

Windows レジストリへ32ビットアプリケーションがアクセスする場合は、一部リダイレクトされる。HKLM\SOFTWAREとHKCR\下のレジストリキーへのアクセスは、それぞれWow6432Nodeと呼ばれるキーの配下にアクセスしている。

脚注[編集]

[ヘルプ]
  1. ^ Interprocess Communication” (英語). MSDNライブラリ. マイクロソフト (2009年1月15日). 2009年4月10日閲覧。

外部リンク[編集]