32ビットOSから64ビットOSへの移行は、アーキテクチャーの変更を伴うため、アプリケーションの互換性や移行、OS自身の移行については気になるところだろう。64ビットの夢のようなスケーラビリティは、誰にでも理解してもらえるはずだ。しかし、いくら64ビットOS上で32ビットアプリケーションが実行できると言っても、すべてのアプリケーションの実行が保証されているわけではないし、実際、動かないケースもある。

Windows 32 on Windows 64(WOW64)

 64ビットOSであるWindows Server 2008 R2では、32ビットOS向けの32ビットネイティブアプリケーションもそのまま動く。ただし、すべての32ビットアプリケーションが完全に動作するというわけではない。カーネルモードの32ビットデバイスドライバーや、カーネルモードで動作する32ビット版のウイルス対策ソフトウェアなどは、カーネルモード上の32ビットのネイティブコードであり、64ビットOS上では動作しない。また、32ビットOSではサポートされた16ビットアプリケーションは、64ビットOSではサポートされなくなる。このような、64ビットOSではサポートされないドライバーやアプリケーションについては、64ビットOSに移行する際に、64ビット版へのアップグレードや、カスタムアプリケーションの場合はコードの修正、再コンパイルなどの対応が必要になる。

 64ビットOS上でユーザーモードの32ビットアプリケーションの実行を可能にしているのは、「Windows 32 on Windows 64(WOW64)」サブシステムである(図7)。WOW64は、x64アーキテクチャーのもともとのハードウェアの互換性もあって、32ビットアプリケーションを無修正、再コンパイルなしで、マイクロアーキテクチャをそのまま使用して高速に実行することができる(ただし、IA-64上のWOW64では、x86のエミュレーターにより動作するため、同等のパフォーマンスとはならないので注意してほしい)。32ビット環境とは比べ物にならない潤沢なメモリとx64プロセッサの処理能力により、32ビットOSのネイティブな環境で実行するよりも、WOW64のエミュレーション環境で実行するほうが、高いパフォーマンスを期待できる場合もある。ただし、32ビットアプリケーションは引き続き、仮想アドレス空間が2GBという32ビットアーキテクチャーの制約を受ける。この制約は、リンカオプション/LARGEADDRESSAWAREで再ビルドすることで、4GBすべてをユーザーモードで利用することが可能だ。4GBの空間は、/3GBブートスイッチで32ビットOSを起動した場合の最大値3GBよりも1GB大きい。

図7●Windows 32 on Windows 64(WOW64)のアーキテクチャー
図7●Windows 32 on Windows 64(WOW64)のアーキテクチャー

 WOW64は、32ビットと64ビットのシステムを分離し、32ビットアプリケーションと64ビットアプリケーションの共存と連携を実現している。32ビットアプリケーションから発生するシステムコールや、アプリケーションへのコールバックをWOW64がインターセプトして、32ビットアプリケーションのバイナリコードをサンク(Thunking)レイヤーで実行する。アプリケーションを実行する際に、32ビットか64ビットかの違いを意識する必要はまったくない。

 Windows Server 2008 R2のシステムファイルは、32ビットOSと同様にC:\Windows\System32フォルダーにインストールされる。ただし、「32」と付いていても、ここには64ビットのネイティブコンポーネントが格納されている。user32.dll、shell32.dll、gdi32.dllなどもすべて64ビットコンポーネントだ。32ビットアプリケーションは、これらのシステムコンポーネントは使用せず、WOW64が提供する32ビットコンポーネントを使用する。この32ビットコンポーネントはC:\Windows\SysWOW64フォルダーに同じファイル名で格納されている。32ビットアプリケーションからのシステムファイルへのアクセス(入出力処理)は、WOW64により、自動的にC:\Windows\System32フォルダーからC:\Windows\SysWOW64フォルダーにリダイレクトされるのだ。

 WOW64は、システムファイルだけでなく、レジストリも分離する。32ビットアプリケーションのレジストリはHKEY_LOCAL_MACHINE\Software\Wow6432Nodeの下に書き込まれる。32ビットアプリケーションに対しては、HKEY_LOCAL_MACHINE\Software\Wow6432NodeのレジストリのツリーをHKEY_LOCAL_MACHINE\Softwareにマージしたビューが提供される。その状態は、WOW64が提供する32ビット版のレジストリエディター(C:\Windows\SysWOW64\Regedit.exe)を使用して参照することができる。プログラムファイルについては、64ビットアプリケーションはC:\Program Filesフォルダーに、32ビットアプリケーションはC:\Program Files(x86)フォルダーにインストールされる。これは、前述のSystem32フォルダーのようにシステムがリダイレクトするのではなく、インストーラーが自動選択するか、インストールするユーザーが明示的に指定する必要があるため注意してほしい。

 64ビットOS環境においては、32ビットアプリケーションから64ビットコンポーネントを同一プロセス内で呼び出せないのと(例:dllのリンクやフックなど)、その逆に64ビットアプリケーションから32ビットコンポーネントを同一プロセス内で呼び出せないという制限に注意が必要だ。次に説明する.NETアプリケーションでは、この制限の影響を受ける場合がある。Internet Explorer(IE)もこの制限の影響を受けるアプリケーションの1つだ。そのため、64ビット版のWindowsには、32ビット版と64ビット版の両方のIEがインストールされる(図8)。これは、ほとんどのWebサイトや Webサービスが32ビット版のActiveXコントロールを使用しているからであり、64ビット版のIEでは表示できないサイトが出てくるためである。

図8●64ビットOSには、必ず32ビット版と64ビット版のIEがインストールされる。見た目は変わらないが、タスクマネージャーで識別できる
図8●64ビットOSには、必ず32ビット版と64ビット版のIEがインストールされる。見た目は変わらないが、タスクマネージャーで識別できる
[画像のクリックで拡大表示]