Windows 10までは、ARM64 CPUのシステムでは、エミュレーションの機能によりx86アプリは動作しましたが、x64アプリは動作しませんでした。Windows 11でARM64 CPUのシステム上でx64アプリを動作させるためのエミュレーション機能が実装されました。そこで、Wow64に関するAPIの振る舞いを確認してみました。
WoW64 (Windows 32-bit on Windows 64-bit) サブシステム
64ビットWindowsが異なるアーキテクチャーの32ビットCPUの32ビットアプリを動作するようにエミュレーションする機能はWoW64 (Windows 32-bit on Windows 64-bit) サブシステムと呼ばれています。
x64の64ビットWindowsシステム上で、x64アプリ(64ビットアプリ)が動作するのは当たり前です。Windowsの32ビットから64ビットの移行時は、過去の資産を生かすためには、x86アプリ(32ビットアプリ)が64ビットWindows上で動作させることが必要でした。それを実現する仕組みとして、64ビットWindowsにWoW64サブシステムが用意されました。
Windows 10のWoW64サブシステム
Windows 10のWoW64サブシステムでは、x64の64ビットWindowsの場合は、x86の32ビットアプリが動作しました。ARM64の64ビットWindowsの場合はARM32とx86の32ビットアプリが動作しました。
Windows 11のWoW64サブシステム
Windows 11のWoW64サブシステムでは、ARM64の64ビットWindowsの場合は、さらにx64の64ビットアプリも動作するようになりました。64ビットアプリが動作するため、WoW64のもともとの名前の由来のWindows 32-bit on Windows 64-bitは、Windows on Windows 64-bitが適切なのかもしれません。
Windows 10 / 11のWoW64サブシステムのまとめ
まとめると以下の表になります。
64ビット Windows 10 | 64ビット Windows 11 | |
---|---|---|
x64 64ビット CPU | x86アプリ | x86アプリ |
ARM64 64ビット CPU | x86アプリ、ARM32アプリ | x86アプリ、ARM32アプリ、x64アプリ |
この表からは、ARM64 CPUのWindows 11では、エミュレーションでx86アプリ、ARM32アプリ、x64アプリが動作することがわかり、また、ネイティブでARM64アプリが動作するので、すべてのアーキテクチャーのアプリが動作することがわかります。
実際にARM64 CPUのWindows 11のタスクマネージャーで、実行しているアプリのアーキテクチャーの確認すると以下のように、各アーキテクチャーのアプリがすべて動作していることがわかります。
WoW64に関するAPI
WoW64に関するAPIがいくつかあります。
たとえば、実行中のアプリがどのシステム(NativeシステムなのかWoW64サブシステムなのか)上で動作しているかを調べるAPIや、現在アプリを実行中のWindowsのWoW64サブシステムがどのアーキテクチャをサポートしているかなどを調べるAPIなどです。
具体的には以下のAPIがあります。
各CPUアーキテクチャーでビルドしたテストアプリでこれらのAPIを呼び出して、各Windowsの振る舞いを確認したいと思います。
WoW64に関するテストツール
前述したWoW64に関連する5つのAPIを確認するテストツールを作成しました。WoW64Testです。このテストツールは、動作確認の為にx86 / x64 / ARM32 / ARM64の4つのCPUアーキテクチャーでビルドしたものを用意しました。このテストツールは、このサイトのツールのページで公開しています。
このWoW64Testツールを、下記の環境で動作させて、各APIの挙動を確認しました。
- 32ビットWindows 10 on x64 CPU
- 64ビットWindows 10 on x64 CPU
- 64ビットWindows 11 on x64 CPU
- 64ビットWindows 10 on ARM64 CPU
- 64ビットWindows 11 on ARM64 CPU
Windows 11は、32ビット版が存在しないので、64ビット版のみの確認となります。Windows 10は、32ビット版と64ビット版が入手可能なx86/x64については両方を確認し、ARMについては64ビット版しか入手できなかったため、64ビット版のみの確認となります。
上記の各WindowsのWindowsシステムとサポートしているWoW64サブシステムの関係は以下の表にようになります。
CPU | Windows | Windowsシステム | WoW64サブシステム |
---|---|---|---|
x64 | 32ビットWindows 10 | x86 | – |
x64 | 64ビットWindows 10 | x64 | x86 |
x64 | 64ビットWindows 11 | x64 | x86 |
ARM64 | 64ビットWindows 10 | ARM64 | ARM32, x86 |
ARM64 | 64ビットWindows 11 | ARM64 | ARM32, x86, x64 |
上記の関係から、x86 / x64 / ARM32 / ARM64 のCPUアーキテクチャーでビルドしたアプリの各Windowsシステムでの動作可否は以下のようになります。
x86アプリ | x64アプリ | ARM32アプリ | ARM64アプリ | |
---|---|---|---|---|
32ビットWindows 10 on x64 CPU | 可 (Native) | – | – | – |
64ビットWindows 10 on x64 CPU | 可 | 可 (Native) | – | – |
64ビットWindows 11 on x64 CPU | 可 | 可 (Native) | – | – |
64ビットWindows 10 on ARM64 CPU | 可 | – | 可 | 可 (Native) |
64ビットWindows 11 on ARM64 CPU | 可 | 可 | 可 | 可 (Native) |
あるCPUアーキテクチャーでビルドしたアプリの実行をサポートしていないWindows上で、アプリを起動しようとすると、以下のようなダイアログが表示され、実行できないことが通知されます。
各CPUアーキテクチャーでビルドしたアプリの動作条件がわかったので、次回は、実際に各APIの動作を見ていきます。
今回の投稿では、WoW64サブシステムの概要と関連するAPI、および、テストツールについて紹介しました。次回の投稿では、このテストツールを使って、各Windowsで各APIの実際の動作を確認したいと思います。
“WoW64サブシステムとARM64 ♯1” への1件の返信