[解説]64bit Windows時代到来 第2回 Win32アプリケーションを実行するWOW64 1.WOW64 デジタルアドバンテージ 打越 浩幸2010/07/01 |
Page1
Page2
|
前回は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コンポーネントを使うことにより、Win32アプリケーションを実行している。つまりエミュレーションというよりは、32bit版のWindows OSがほぼそのまま入っていて、その上でWin32アプリケーションを実行しているということになる。
例えば、このSYSWOW64フォルダの中にあるメモ帳(notepad.exe)をダブルクリックして実行してみよう。[スタート]メニューからメモ帳を起動すると通常は64bit版のメモ帳が起動するが、SYSWOW64フォルダの中にあるnotepad.exeを実行すると、32bit版のメモ帳が実行される。この様子はタスク・マネージャの[プロセス]タブで確認できる。
32bit版メモ帳を起動する | ||||||
SYSWOW64フォルダの中にあるメモ帳(notepad.exe)を起動した場合の例。 | ||||||
|
このような仕組みのため、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 …プロンプトを変更 |
レジストリのリダイレクションとリフレクション
ファイル・システムのリダイレクションと同様に、レジストリのエントリにもいくつかリダイレクトされるものがある(HKLM\SoftwareやHKCUなど)。これは32bitアプリケーションと64bitアプリケーションで異なる設定を(同じキーの場所などに)保存したい、といった要求にこたえるものである。実行している環境に応じて、32bit用と64bit用で異なるレジストリ・キーが作られ、参照や更新などが自動的に振り分けられるようになっている。さらに「レジストリ・リフレクション」という機能も用意され、一方を更新すると、自動的に対応するキーが更新される(反映される)機能も用意されている。完全に分けてしまうと、先ほどのフォルダのリダイレクトのように、保存したはずの値が読み出せない(例:32bitアプリケーションで保存したものが、64bitアプリケーションで読み出せないなど)ということが起こる可能性もあるので、自動的に反映するようにするためだ。
この機能は非常に分かりづらく、主にプログラマが対応するべきことなので、ここでは詳細は述べない。以下のWebページなどを参照していただきたい。
さらに「レジストリ・リフレクション」という機能も用意され、一方を更新すると、自動的に対応するキーが更新される(反映される)機能も用意されている。完全に分けてしまうと、先ほどのフォルダのリダイレクトのように、保存したはずの値が読み出せない(例:32bitアプリケーションで保存したものが、64bitアプリケーションで読み出せないなど)ということが起こる可能性もあるので、自動的に反映するようにするためだ。しかし、非常に使いづらかったのか、Windows 7およびWindows Server 2008 R2以降では廃止されている。アプリケーションを開発/改修する場合は注意していただきたい。
WOW64の制限
以上、WOW64について解説してきたが、いくつか制限事項もある。最後にそれについて述べておく。
-
WOW64を使った場合のプロセス・アドレス空間はデフォルトでは2Gbytesに制限されている。Windows OSのバージョンによっては、32bitプロセスでもトータルで4Gbytes以上のメモリが利用できるものがあるが、WOW64では利用できない。
-
32bitプロセスは64bitのDLLをロードできない(リソースのみのDLLならロード可能)。
-
16bitアプリケーション(Win16アプリケーション)を呼び出すことはできない。Win32やWin64 APIで利用されるハンドル情報は16bit幅には格納できないので、16bitアプリケーションに渡したり、結果を受け取ったりできない。そのため、WOW64ではWin16アプリケーションを実行できない。
-
Virtual DOS Machine (VDM。いわゆるDOS窓)用の特別なAPIはサポートされていない。
INDEX | ||
[解説]64bit Windows時代到来 | ||
第2回 Win32アプリケーションを実行するWOW64 | ||
1.WOW64 | ||
2.64bit CPUとWin64 | ||
「特集」 |
ホワイトペーパー(TechTargetジャパン)
- Windows TIPS (2010/7/2)
− Virtual Routerで仮想無線LANルータを構築する
− 公開鍵認証でSSH2サーバにログインする(PuTTY編)
− icaclsでアクセス制御リスト中のメンバーを検索する - Win32アプリケーションを実行するWOW64 (2010/7/1)
互換性が重視されるWindow OSでは、32bitアプリのサポートも必須。それを可能にするWOW64とは何か? x64 CPUについても解説 - Windowsの互換性テクノロジの仕組み(後編) (2010/6/30)
アプリケーションの互換性問題を解決する「互換性データベース」の作成・適用手順を中心に、互換性テクノロジの活用方法や限界について解説 - 第226話 会議中にノートでメモ (2010/6/29)
ノートPCを使って会議のメモ。合理的なのは分かるけど、ディスプレイばかり見て応対するのは失礼ってもんでしょう。とはいえ……
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -