互換性が重視されるWindow OSでは、64bit版Windows OSでも32bitアプリケーションのサポートが必須。それを可能にするWOW64とは何か? x64 CPUについても解説する。
前回は64bit版Windows OSについて、利用可能なメモリ容量の点からそのメリットをいくつか取り上げてみた。今回は、32bitアプリケーションを実行可能にするWOW64と、64bit CPUやWin64アプリケーションのプロセスモデルについてみてみよう。
WOW64(Windows 32bit emulation on Windows 64bit)は、64bit Windows OS上で32bit Windowsアプリケーションの実行環境をエミュレーションするためのシステムである。64bit版Windows OSのカーネルは、もともとWin64というネイティブなAPIセットしかサポートしておらず、32bitや16bitのAPI(Win32やWin16)は持っていない。だがこれでは従来のアプリケーションを利用できないので、Win32アプリケーションを実行するための仕組みが用意されている。これがWOW64である。
WOW64の仕組みを図にすると、次のようになる。
64bit Windows向けに作られたアプリケーションを実行する場合は、それぞれのアプリケーションごとに独立した1つの64bitプロセス空間が作成され、その中で実行される。
これに対してWin32アプリケーションを実行しようとすると、32bit版のWindows OSをエミュレーションするための環境(32bitプロセス空間)が作成され、その中でWin32アプリケーションが実行される。Win32アプリケーションが発行するAPIはエミュレーション用に用意された特別なDLLを経由して64bitのOSカーネルへ渡される。
DLL | 用途 |
---|---|
WOW64.DLL | WOW64を構成するコア・コンポーネント。NTOSKRNL.EXEへの中継を行うサンク(呼び出し)が含まれている。ファイル・システム・リダイレクションやレジストリ・リフレクションなどの処理も行う |
WOW64WIN.DLL | GUI関連のAPI(WIN32K.SYS)への中継を行うサンクが含まれている |
WOW64CPU.DLL | ホストCPUの抽象化を行うためのライブラリ。32bitモードと64bitモードの切り替えや、WOW64内における、32bit CPUのスレッド・コンテキストの切り替えなどを行う |
NTDLL.DLL | Win32からNTDLL.DLLを呼び出すと、Win64用に変換され64bitのNTDLL.DLLが呼び出される。USER32.DLLやGDI32.DLLなども同様 |
WOW64を構成する基本DLL Win32アプリケーションが発行するAPIのうち、ポインタ・データを含むものや特別な処理が必要なものはこれらのDLLで対処したり、変換したりしてネイティブのOSカーネルへ渡される。ほかのDLLは、32bit版のWindows OSと同じものが用意されており、それが利用される。 |
Win32とWin64 APIではポインタのサイズは異なるが、それ以外のデータ型は互換性がある(次ページで述べるように、intなどのデータ型は64bit環境でもサイズは同じである)。WOW64では、Win32 API呼び出しのパラメータ中にあるポインタを64bitアドレスに変換してOSカーネルを呼び出す。戻り値にポインタ・データが含まれている場合はその逆の変換をして、呼び出し元の関数へ戻す。
Win32アプリケーションから利用するライブラリ(DLL)はこれ以外にも多数あるが、それらは32bit版Windows OSに含まれているものがそのまま利用される。%windir%\SysWOW64フォルダの内容を見ると分かるが(次の画面参照)、ここには32bit版Windows OSの%windir%\SYSTEM32フォルダの内容がほぼそのまま入っている。
WOW64ではこのように、32bit版のWindowsコンポーネントを使うことにより、Win32アプリケーションを実行している。つまりエミュレーションというよりは、32bit版のWindows OSがほぼそのまま入っていて、その上でWin32アプリケーションを実行しているということになる。
例えば、このSYSWOW64フォルダの中にあるメモ帳(notepad.exe)をダブルクリックして実行してみよう。[スタート]メニューからメモ帳を起動すると通常は64bit版のメモ帳が起動するが、SYSWOW64フォルダの中にあるnotepad.exeを実行すると、32bit版のメモ帳が実行される。この様子はタスク・マネージャの[プロセス]タブで確認できる。
このような仕組みのため、Win32アプリケーションの実行速度は32bit版のWindows OS上で実行している場合と比較しても、ほとんど変わらない。
いま述べたように、WOW64環境ではSYSWOW64フォルダにあるDLLなどを使ってWin32アプリケーションを実行している。とすると、もしアプリケーションがデータやファイルを、プログラムの実行ファイルがある場所(起動した場所)に保存しようとするとどうなるだろうか? 本来ならば(純粋な32bit版のWindows OSの場合は)、%windir%\SYSTEM32%フォルダに保存することになるだろうが(注:Windows 7やWindows Vistaなどでは、デフォルトのアクセス権設定のままではこのフォルダへは保存できない)、WOW64上の場合はSYSWOW64フォルダに保存することになる。例えば設定ファイルを実行ファイルと同じ場所に保存するようなアプリケーションがあったとすると、これは問題となる可能性がある。%windir%\SYSTEM32%フォルダに書き込んだつもりなのに、別の場所に保存されてしまっているからだ。次回起動時にアプリケーションが設定ファイルを%windir%\SYSTEM32%フォルダから読み出そうしても見つからず、エラーとなるだろう。
このような問題を避けるため、WOW64では、ファイル・システムやレジストリに対してリダイレクションやリフレクションをするための機能が用意されている。
これは、特定のフォルダやファイル名に対して、別の場所へ誘導したり、置き換えたりする機能である(WOW64.DLLで実装されている)。Win32から呼び出したファイル・システム関連のパラメータにこれらのパス名が含まれていると、それを上書きして別の場所やファイルへ誘導する。具体的には、次のようなパスが対象となる。
パス | リダイレクトの内容 |
---|---|
%windir%\System32 | Win32アプリケーションからこのパスへアクセスすると、実際には%windir%\SYSWOW64フォルダへリダイレクトされる |
%windir%\lastgood | %windir%\lastgood\SYSWOW64にリダイレクトされる |
%windir%\regedit.exe | %windir%\SysWOW64\regedit.exeにリダイレクトされる。regeditは常にSYSWOW64フォルダのものを使うようにするための措置 |
%windir%\system32\catroot %windir%\system32\catroot2 %windir%\system32\driversstore %windir%\system32\drivers\etc %windir%\system32\logfiles %windir%\system32\spool |
これらは%windir%\SYSWOW64ディレクトリにリダイレクトされない。同じファイルを2カ所に作らせないための措置。 注:ただしWindows Server 2008、Windows Vista、Windows Server 2003および Windows XPの64bit版では、%windir%\system32\driversstoreフォルダはリダイレクトされる |
%windir%\Sysnative | これは仮想的なフォルダ名。これを利用すると、リダイレクトされずに(リダイレクト機能をパスして)、直接%windir%\system32フォルダへアクセスできる。この仮想的なフォルダはWindows Vista以降で追加された。ただし仮想フォルダなので、64bitのネイティブ・アプリケーションからは利用できない |
WOW64でリダイレクトされる特殊フォルダ/パス名 |
以下にフォルダがリダイレクトされる例を示しておく。
C:\Windows\system32>prompt [%PROCESSOR_ARCHITECTURE%]$p$g …プロンプトを変更
[AMD64]C:\Windows\system32> …現在はWin64上
[AMD64]C:\Windows\system32>mkdir TMP C:\Windows\SysWOW64\TMP …TMPフォルダを作成
[AMD64]C:\Windows\system32>dir > TMP\THIS_IS_WIN64.TXT …Win64上でファイル作成
[AMD64]C:\Windows\system32>dir TMP …確認
ドライブ C のボリューム ラベルは WIN7X64 です
ボリューム シリアル番号は 9C7C-5B6B です
C:\Windows\system32\TMP のディレクトリ
2010/06/29 12:43 <DIR> .
2010/06/29 12:43 <DIR> ..
2010/06/29 12:43 143,058 THIS_IS_WIN64.TXT …作成したファイル
1 個のファイル 143,058 バイト
2 個のディレクトリ 825,908,105,216 バイトの空き領域
[AMD64]C:\Windows\system32>C:\Windows\SysWOW64\cmd …WOW64上でcmdを起動
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
[AMD64]C:\Windows\system32>prompt [%PROCESSOR_ARCHITECTURE%]$p$g …プロンプトの変更
[x86]C:\Windows\system32> …WOW64上で実行中(x86となっている)
[x86]C:\Windows\system32>dir > TMP\THIS_IS_x86.TXT …WOW64上でファイル作成
[x86]C:\Windows\system32>dir tmp …確認 ドライブ C のボリューム ラベルは WIN7X64 です
ボリューム シリアル番号は 9C7C-5B6B です
C:\Windows\system32\tmp のディレクトリ
2010/06/29 12:45 <DIR> .
2010/06/29 12:45 <DIR> ..
2010/06/29 12:45 120,126 THIS_IS_x86.TXT …作成したファイル。最初に作成したファイルはここにはない
1 個のファイル 120,126 バイト
2 個のディレクトリ 825,907,982,336 バイトの空き領域
[x86]C:\Windows\system32>exit …WOW64を終了
[AMD64]C:\Windows\system32>dir TMP C:\Windows\SysWOW64\TMP …再確認
ドライブ C のボリューム ラベルは WIN7X64 です
ボリューム シリアル番号は 9C7C-5B6B です
C:\Windows\system32\TMP のディレクトリ …Win64上のTMP
2010/06/29 12:43 <DIR> .
2010/06/29 12:43 <DIR> ..
2010/06/29 12:43 143,058 THIS_IS_WIN64.TXT …Win64上で作成したファイル
1 個のファイル 143,058 バイト
C:\Windows\SysWOW64\TMP のディレクトリ …WOW64上のTMP
2010/06/29 12:45 <DIR> .
2010/06/29 12:45 <DIR> ..
2010/06/29 12:45 120,126 THIS_IS_x86.TXT …WOW64上で作成したファイル
1 個のファイル 120,126 バイト
2 個のディレクトリ 825,907,458,048 バイトの空き領域
[AMD64]C:\Windows\system32>
ファイル・システムのリダイレクションと同様に、レジストリのエントリにもいくつかリダイレクトされるものがある(HKLM\SoftwareやHKCUなど)。これは32bitアプリケーションと64bitアプリケーションで異なる設定を(同じキーの場所などに)保存したい、といった要求にこたえるものである。実行している環境に応じて、32bit用と64bit用で異なるレジストリ・キーが作られ、参照や更新などが自動的に振り分けられるようになっている。
この機能は非常に分かりづらく、主にプログラマが対応するべきことなので、ここでは詳細は述べない。以下のWebページなどを参照していただきたい。
さらに「レジストリ・リフレクション」という機能も用意され、一方を更新すると、自動的に対応するキーが更新される(反映される)機能も用意されている。完全に分けてしまうと、先ほどのフォルダのリダイレクトのように、保存したはずの値が読み出せない(例:32bitアプリケーションで保存したものが、64bitアプリケーションで読み出せないなど)ということが起こる可能性もあるので、自動的に反映するようにするためだ。しかし、非常に使いづらかったのか、Windows 7およびWindows Server 2008 R2以降では廃止されている。アプリケーションを開発/改修する場合は注意していただきたい。
以上、WOW64について解説してきたが、いくつか制限事項もある。最後にそれについて述べておく。
【2011/04/04】公開当初、「レジストリのリダイレクションとリフレクション」において、レジストリ・リフレクションの説明が一部重複していたので、修正しました。
【2010/07/01】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.