x86-64 Linuxには、32ビットアプリケーションを実行するための2つのオプションがあります。 1つはオプションを介してカーネル自体に構築できるオプションCONFIG_IA32_EMULATION
(ほとんどのカーネルに対してオンになっている)で、もう1つはqemu-i386
。
違いは何ですか?ネイティブに近いパフォーマンスで実行できますかqemu-i386
?ネイティブに近いですか、それともJITリコンパイラに似ていますか?
答え1
カーネル構成オプションCONFIG_IA32_EMULATION
x86-64カーネルの32ビットバイナリ実行をサポートする可能性を提供します。
このサポートには主に以下が含まれます。
- i386 システムコールのエントリポイントを提供します。 (i386とx86_64はシステムコール番号が異なります。)32ビットパラメータを64ビットに変換します。
- 32ビットELFファイル構造に従うようにELFローダ(
fs/binfmt_elf.c
実行を開始するためにファイルシステムからプロセスのアドレス空間に実行可能ファイルをロードする役割)をハッキングします。
その後、32ビットバイナリとカーネルの間に追加のレイヤーを追加せずに32ビットバイナリを実行できます。
一部深刻な脆弱性の歴史は短いです。(みんな丁寧に修理しましたが…誰も知りません)
qemu-i386(要求どおりにvgいいえqemu-system-i386)ユーザー空間エミュレータ。つまり、ユーザーモードで実行され、カーネルが特別な32ビットサポートを必要とせずに内部で32ビットプログラムをロードし、32ビットシステム呼び出しを64ビットシステム呼び出しに変換するなどの作業を担当します。
この主な違い(ユーザースペースで実行される追加のレイヤー)のため、qemu-i386(Wineを介してWindowsプログラムを実行することを考えてみてください)を使用すると、基本的なパフォーマンスに近いところでは期待できません。これにより、動的にリンクされた実行可能ファイルと要件が追加されます。 32ビットアプリケーションをデバッグするには特別なツールが必要です。
qemuの次のOPトライアルを編集します。
ネイティブに似ていますか、それともJITリコンパイラに似ていますか?
私たちが読むことができるように翻訳機の内部構造, qemu は以下に基づくツールです。「マイクロコードジェネレータ」バックエンドとして、これは(抽象)コードジェネレータに過ぎません。
この抽象コードはある程度最適化されたターゲット固有の機械語コードに変換されるため、抽象コードがコンパイルされたと言われています。
したがって、私たちは基本(コード実行)よりも一種のJITコンパイラ(コード)に近いのですが…タイムリーな「疑問があるかもしれません... ;-)