x86 アプリが ARM プロセッサで実行できないのはなぜですか?

x86 アプリが ARM プロセッサで実行できないのはなぜですか?

コンピュータでは、カーネルはアプリケーションとハードウェア (CPU) の間に位置し、ソフトウェアがハードウェアと対話できるようにします。

では、Microsoft Surface X (SQ1 および SQ2 プロセッサ) では、開発者が x86 Windows からアプリケーションを移行できないのはなぜでしょうか? たとえば、Chrome、Firefox、一部のベンチマーク ツールやゲームなどです。Microsoft は x86-64 カーネルを ARM バージョンに置き換えるだけで、ほとんどのアプリケーションは正常に動作すると思っていました。

Linuxでも同様です。

答え1

この場合、カーネルは期待するほど多くの処理を行いません。特に、カーネルはコンパイルされたバイナリを構成するマシン コードを変換/解析/解釈/変更しません。

誰かがコンパイルソースコードをバイナリに変換すると、実際にはそのソースコードをマシンコード命令CPUが理解できるもの。

特徴の一つは86 のプラットフォームは共有指図書互換性のあるすべてのハードウェアで実行できます。こうすることで、コンパイラは、PUSHスレッド経由で実行した場合に、どの x86 CPU でも命令を理解し、期待どおりの動作を行うと予想できます。

異なる命令セットを使用します。この場合、ソース コードを ARM CPU が理解できる命令 (その命令セットで定義されている命令) にコンパイル (変換) する必要があります。

すべてのプログラムが「ネイティブ」バイナリ (CPU の命令セットによって実装された整形式の命令のみで構成されるバイナリ) を使用するわけではありません。Java や C# などの言語は仮想アセンブリ言語にコンパイルされ、実行時にネイティブ命令に JIT コンパイルされます。その他のプログラムでは、特定のプラットフォーム用にカスタマイズされたインタープリタが使用されます。

つまり、ARM CPU は x86 でコンパイルされたプログラムが使用する言語を認識しませんし、その逆も同様です。カーネルはハードウェア アクセスや CPU スケジューリングなどを制御しますが、システムで実行されているプログラムの命令は変更しません。プロセスを作成して実行を開始し、CPU に実行時間を割り当てて、多くのプロセスが半同時に共有できるようにするだけです。

関連情報