この記事には、ARM64上のx64に関する情報が不足しています。ARM64EC ABI(旧ARM64X)はx64呼び出し規約に1:1のレジスタマッピングを備えています。(2021年6月) |
| WoW64 | |
|---|---|
| その他の名前 | Windows 64 ビット版上の Windows 32 ビット版 |
| 開発者 | マイクロソフト |
| 初回リリース | 2001年10月25日 (2001年10月25日) |
| オペレーティング·システム | マイクロソフトウィンドウズ |
| プラットフォーム | IA-64、x86-64、ARM64 |
| タイプ | 互換性レイヤー |
| ライセンス | 独自の商用ソフトウェア |
| Webサイト | docs |
Microsoftプラットフォーム上のコンピューティングにおいて、 WoW64 ( Windows 32-bit on Windows 64-bit ) は、64 ビット Windows 上で32 ビットアプリケーションを実行できるWindowsオペレーティング システムのサブシステムです。 [ 1 ]これは、Windows Server のServer Core (オプション コンポーネント) と Windows Nano Server (含まれていない)を除くすべての64 ビット版の Windowsに含まれています。 [ a ] WoW64 は、特に Windows 自体の構造変更を含む、32 ビット Windows と 64 ビット Windows の多くの違いに対処することを目的としています。
翻訳ライブラリ
WoW64サブシステムは、すべての64ビット版Windowsで同様のインターフェースを持つ軽量な互換性レイヤーで構成されています。WOW64サブシステムは、32ビット版Windowsアプリケーションを改変せずに64ビットシステムで実行するために必要なインターフェースを提供する32ビット環境の構築を目指しています。WOW64は複数のDLLを使用して実装されており、その中には以下のDLLが含まれます。[ 3 ]
Wow64.dll、ポインタや呼び出しスタックの操作を含む、32 ビットと 64 ビットの呼び出し間の変換(サンク) を行うWindows NT カーネルのコア インターフェイスです。Wow64win.dll32ビットアプリケーション(win32kサンク)に適切なエントリポイントを提供します。- 命令セットアーキテクチャによって異なる 32 ビット x86 命令を実行できるようにする dll 。
- x86-64では、
Wow64cpu.dllプロセッサを32ビットモードから64ビットモードに切り替える処理を行います。x86-64マシンには32ビットx86コードを実行するためのネイティブモードがあるため、この処理は計算コストが低く抑えられます。[ 4 ] - IA-64(Itanium 2 )では、低速の[ 5 ]ソフトウェアエミュレーションには3つのファイルが必要です。
Wow64cpu.dll「CPU抽象化レイヤー」、IA32Exec.binx86ソフトウェアエミュレータ、Wowia32x.dllエミュレータとWOW64システム間のブリッジです。[ 6 ] - ARMv8 64ビットでは、
xtajit.dllx86エミュレーションおよびwowarmhw.dllARM32モードへの切り替えに使用されます。[ 3 ]
- x86-64では、
レジストリとファイルシステム
WoW64サブシステムは、32ビットアプリケーションの実行におけるその他の重要な側面も処理します。32ビットアプリケーションとWindowsコンポーネント(例えば、64ビットアプリケーションと32ビットアプリケーションで異なるキーを持つレジストリ)との相互作用の管理に関与します。例えば、HKEY_LOCAL_MACHINE\Software\Wow6432Nodeは、HKEY_LOCAL_MACHINE\Softwareの32ビット版に相当します(ただし、32ビットアプリケーションはこのリダイレクトを認識しません)。Windowsのエディションに応じて、一部のレジストリキーは64ビットから32ビットにマッピングされますが、その他のキーの内容はミラーリングされます。
オペレーティングシステムは、%SystemRoot%\system3264ビットライブラリと実行ファイル用に ディレクトリを使用します。これは、多くのレガシーアプリケーションがこのパスを使用するようにハードコードされているため、下位互換性を保つためです。32ビットアプリケーションを実行する場合、WoW64は「system32」(DLLの読み込みなど)へのアクセスを%SystemRoot%\SysWoW64、32ビットライブラリと実行ファイルを含む に透過的にリダイレクトします。これらのリダイレクトの例外は次のとおりです。[ 7 ]
%SystemRoot%\system32\catroot%SystemRoot%\system32\catroot2%SystemRoot%\system32\driverstore(Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP にリダイレクトされます)%SystemRoot%\system32\drivers\etc%SystemRoot%\system32\logfiles%SystemRoot%\system32\spool
リダイレクトにより、32 ビット アプリケーションは WoW64 の状態を意識することなく動作し続けることができます。[ 7 ] 32 ビット アプリケーションが実際の にアクセスする場合、 Windows Vista 以降では%SystemRoot%\System32疑似ディレクトリ経由でアクセスできます。 [ 7 ] Wow64 の状態は 経由で検出できます。 %SystemRoot%\sysnativeIsWow64Process()
Program Filesディレクトリは2つあり、それぞれ32ビットアプリケーションと64ビットアプリケーションの両方から参照できます。32ビットファイルを格納するディレクトリは、両者を区別するためにProgram Files (x86)と呼ばれます。一方、64ビットファイルは、追加の修飾子なしで従来のProgram Filesという名前を維持します。この分離を維持するためにファイルシステムのリダイレクトは使用されません。代わりに、WoW64の変更や同様のクエリ結果を利用して、インストーラプログラムを正しいディレクトリに誘導します。[ 8 ]FOLDERID_ProgramFiles
ARM64にもいくつかの新しいディレクトリがあり、WOW64は32ビットx86プログラムだけでなく、32ビットARMプログラムの実行も処理しますSysArm32。ARM64は、いわゆるCHPE「コンパイル済みハイブリッドPE」もサポートしています。これは、ARM64コードをx86 dllコンテナに格納したものです(より効率的でエミュレーションフリーの互換性のため)。これらのdllは、にありますSyCHPE32。[ 9 ]
アプリケーションの互換性
32 ビット カーネル モードデバイス ドライバーのみを含む 32 ビット アプリケーション、または純粋に 64 ビット プロセスとして実装されているコンポーネントのプロセス空間にプラグインする 32 ビット アプリケーション (Windows エクスプローラーなど) は、64 ビット プラットフォームでは実行できません。
32ビットのサービスアプリケーションがサポートされています。OSドライブのWindowsフォルダにあるSysWOW64フォルダには、32ビットアプリケーションをサポートする複数のアプリケーション(32ビットアプリケーションのODBC接続を登録するためのcmd.exe、odbcad32.exeなど)が含まれています。MS-DOSおよび以前のバージョンのWindows用の16ビットレガシーアプリケーションは、通常、64ビット版のWindows Vista、7、8、10とは互換性がありませんが、仮想化ソフトウェアを使用することで64ビットWindows OS上で実行できます。一方、32ビット版のWindows XP、Vista、7、8、10では、通常、16ビットアプリケーションをほとんど問題なく実行できます。16ビットアプリケーションは、x64エディションのWindowsでは直接実行できません。これは、x64での実行時にCPUがVM86モードをサポートしないためです。
インターネット上には 64 ビット バージョンにプラグインできない 32 ビットActiveXコンポーネントが多数存在するため、 Internet Explorerは 32 ビット アプリケーションと 64 ビット アプリケーションの両方として実装されています。
以前は32ビット版がデフォルトで使用されていたため、64ビット版をデフォルトのブラウザに設定するのは困難でした。Internet Explorer 10ではこの点が変更され、32ビットアドオンは64ビットセッション内で実行されるため、2つのバージョンを切り替える必要がなくなりました。ユーザーが32ビットフォルダ(通常はC:\Program Files (x86)\Internet Explorer)に移動し、iexplore.exeファイルをダブルクリックすると、64ビット版も読み込まれます。Internet Explorer 9以前では、32ビット版のみが読み込まれていました。
2010年時点では、WoW64のx64版の翻訳層のバグ[ 10 ] [ 11 ]により、 Windows API関数GetThreadContextに依存するすべての32ビットアプリケーションが互換性を失っています。このようなアプリケーションには、アプリケーションデバッガー、コールスタックトレーサー(コールスタックを表示するIDEなど)、ガベージコレクション(GC)エンジンを使用するアプリケーションが含まれます。広く使用されているものの影響を受けるGCエンジンの1つ[ 12 ]はBoehm GCです。これは、同様に人気のあるMonoのデフォルトのガベージコレクターとしても使用されています。Monoは2010年10月からSGen-GCと呼ばれる新しい(ただしオプションの)GCを導入しましたが、これはBoehm GCと同じ方法でスタックスキャンを実行するため、WoW64とは互換性がありません。2016年7月時点で修正は提供されていませんが、回避策が提案されています。[ 13 ]
パフォーマンス
Microsoftによると、WOW64(x64)で動作する32ビットソフトウェアは、32ビットWindowsで実行した場合と同等のパフォーマンスを発揮しますが、スレッド数は少なくなります。x64以外のシステムでは、WOW64はソフトウェアエミュレーションのため、パフォーマンスのオーバーヘッドが発生します。[ 5 ]
64 ビット システムでは、32 ビット アプリケーションに 4 GB の仮想メモリを完全に割り当てることができますが、32 ビット システムでは、このアドレス指定可能なメモリの一部はカーネルやディスプレイ アダプタなどのメモリ マップされた周辺機器によって使用されるため失われ、通常、アプリケーションは最大で 2 GB または 3 GB の RAM しか使用できなくなります。
参照
- Shim(コンピューティング)
- ユーザーアカウント制御には、「新しい」ウィンドウの特定の領域にファイルを書き込む「古い」プログラムを処理するメカニズムも備わっています。管理者権限のないプロセスから保護された場所(Program Files や windows\system32 など)に書き込まれたファイルは、仮想ストアディレクトリにリダイレクトされます。
- Windows 上の Windows
注記
- ^具体的には:
- Windows XP Professional x64 エディション
- Windows Server 2003のIA-64およびx64バージョン
- Windows Vista、Windows Server 2008、Windows 7、Windows 8、Windows Server 2012、Windows 8.1、Windows 10、Windows Server 2016、Windows Server 2019、Windows 11、Windows Server 2022のx64バージョン
- Windows 10、Windows 11、Windows Server 2022のARM64バージョン。
wow64.dll、、、wow64win.dllおよびもあるwow64cpu.dll。
参考文献
- ^ QuinnRadich; DCtheGeek; msatranjr (2020年8月19日). 「WOW64実装の詳細」 . learn.microsoft.com . 2023年4月16日時点のオリジナルよりアーカイブ。 2023年4月16日閲覧。
- ^ Conway, Adam (2023年1月25日). 「Wine 8.0リリース:コントローラーの互換性向上、試験的なWoW64サポートなど」 XDA Developers . 2023年4月16日時点のオリジナルよりアーカイブ。 2023年4月16日閲覧。
- ^ a b「WOW64実装の詳細」。Microsoft 。2018年4月21日閲覧。
- ^ Eckels, Stephen (2020年11月9日). 「WOW64!Hooks: WOW64サブシステムの内部とフックテクニック」 . Mandiant .
- ^ a b「WOW64でのパフォーマンスとメモリ消費量」 Microsoft 2013年5月6日閲覧。
- ^ 「WOW64 実装の詳細 (Windows)」 2010年4月26日.オリジナルより2010年4月26日時点のアーカイブ。
Wow64cpu.dll– IA-64 実装の一部として表示される以前のバージョンの記事。 - ^ a b c「ファイル システム リダイレクター (Windows)」。msdn.microsoft.com。2023年2月2日。
- ^ 「winapi - SHGetFolderPath() 32ビット vs 64ビット」。スタックオーバーフロー。
- ^ Beneš, Petr (2018年11月4日). 「WoW64の内部:ARM版Heaven's Gateの再発見」 . mindless-area (wbenny.github.io) .
- ^ Saw, Zach (2010年11月13日). 「WOW64のバグ:GetThreadContext()が古いコンテンツを返す可能性がある」 . Zach Sawのブログ. 2010年11月15日閲覧。
- ^ 「WOW64 OSのバグ:古い32ビットXPアプリがWin7 WOW64で動作しない」 Microsoft Developer Network 2010年11月11日 2010年11月15日閲覧。
- ^ 「Boehm Garbage Collector (Boehm GC)に関する議論」 。 2011年7月16日時点のオリジナルよりアーカイブ。2010年11月25日閲覧。
- ^ 「GetThreadContextはWOW64で古いレジスタ値を返す」。Microsoft = 2016年7月23日。2016年8月19日時点のオリジナルからアーカイブ。 2016年7月23日閲覧。