第2回 Win32アプリケーションを実行するWOW64:64bit Windows時代到来(1/2 ページ)
互換性が重視されるWindow OSでは、64bit版Windows OSでも32bitアプリケーションのサポートが必須。それを可能にするWOW64とは何か? x64 CPUについても解説する。
前回は64bit版Windows OSについて、利用可能なメモリ容量の点からそのメリットをいくつか取り上げてみた。今回は、32bitアプリケーションを実行可能にするWOW64と、64bit CPUやWin64アプリケーションのプロセスモデルについてみてみよう。
WOW64:32bitコードを実行するための仕組み
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の仕組みを図にすると、次のようになる。
WOW64の構成
Win64(64bit)アプリケーションのAPI呼び出しはそのまま64bit Windows OSのカーネルへ渡される。これに対して、Win32(32bit)アプリケーションのAPI呼び出しはエミュレーション用の特別なDLLを経由してパラメータが変換され、その後64bit Windows OSのカーネルへ渡される。
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環境をエミュレーションするためのファイルは、SYSWOW64フォルダに格納されている。これは64bit版のWindows 7 Ultimate Editionでの画面例。
(1)Windowsフォルダ内にあるSYSWOW64を開いてみる。
(2)このフォルダを開く。
(3)ここにあるファイルは、32bit版のWindows 7 Ultimate Editionの%windir%\SYSTEM32フォルダにあるものとほぼ同じ。前述のいくつかのDLLファイルのみが異なる。
WOW64ではこのように、32bit版のWindowsコンポーネントを使うことにより、Win32アプリケーションを実行している。つまりエミュレーションというよりは、32bit版のWindows OSがほぼそのまま入っていて、その上でWin32アプリケーションを実行しているということになる。
例えば、このSYSWOW64フォルダの中にあるメモ帳(notepad.exe)をダブルクリックして実行してみよう。[スタート]メニューからメモ帳を起動すると通常は64bit版のメモ帳が起動するが、SYSWOW64フォルダの中にあるnotepad.exeを実行すると、32bit版のメモ帳が実行される。この様子はタスク・マネージャの[プロセス]タブで確認できる。
32bit版メモ帳を起動する
SYSWOW64フォルダの中にあるメモ帳(notepad.exe)を起動した場合の例。
(1)このタブを選択する。
(2)末尾に「*32」と付いていることから、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の制限
以上、WOW64について解説してきたが、いくつか制限事項もある。最後にそれについて述べておく。
- WOW64を使った場合のプロセス・アドレス空間はデフォルトでは2Gbytesに制限されている。Windows OSのバージョンによっては、32bitプロセスでもトータルで4Gbytes以上のメモリが利用できるものがあるが、WOW64では利用できない。
なお32bitプロセスを1つ起動するごとに、対応するWOW64が1つ起動する。それぞれのWOW64ごとに2Gbytesのメモリ空間(を使用する32bitプロセス)が実行できるので、例えば16Gbytesの物理メモリを持つシステムなら、理論的には2Gbytesの32bitプロセスを最大で7個程度起動できる(Windows OSやWOW64自身が利用するメモリが必要なので、実際にはここまで利用できない)。これは32bit版のWindows OSと比べると、大きな利点である。例えば32bit版のWindows 7では、最大4Gbytesの物理メモリしか利用できないからである。 - 32bitプロセスは64bitのDLLをロードできない(リソースのみのDLLならロード可能)。
- 16bitアプリケーション(Win16アプリケーション)を呼び出すことはできない。Win32やWin64 APIで利用されるハンドル情報は16bit幅には格納できないので、16bitアプリケーションに渡したり、結果を受け取ったりできない。そのため、WOW64ではWin16アプリケーションを実行できない。
- Virtual DOS Machine (VDM。いわゆるDOS窓)用の特別なAPIはサポートされていない。
【更新履歴】
【2011/04/04】公開当初、「レジストリのリダイレクションとリフレクション」において、レジストリ・リフレクションの説明が一部重複していたので、修正しました。
【2010/07/01】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.