2016-12-07 1 views
2

私はBochsやQEMUのようなエミュレータがどのように動作し、問題があるかを研究しています。つまり、x86ホスト上でx86ゲストOSをエミュレートして、ゲストがレジスタを割り当てる命令(例えばmov eax 3)エミュレータが実行するコードで実際のハードウェアのeaxレジスタに値が実際に割り当てられることは保証されているのでしょうか?QEMUは、x86〜x86エミュレーションのゲストレジスタと同じホストレジスタを使用しますか?

QEMUプロセスは独自のプロセスであるため(他のプロセスと汎用レジスタを共有する必要がないため)、またホストとゲストアーキテクチャは同じであり、したがって同じ汎用レジスタを有する。私は2つの命令があるQEMUでプログラムを実行することだった場合

また、:

mov eax 3 
add eax 2 

を、それはそうすることが、プログラムの変更しないだろうと判断することができれば、それは1つだけmov eax, 5命令に2を組み合わせただろう個々の命令の代わりに命令のブロックを実行することによってプログラムを実行するので、実行は不要ですか?

ここでは、ハードウェア仮想化ではなく、純粋なエミュレーション(Bochsまたは非KVM QEMU)を指しています。

+3

をx86またはx64上のx86をエミュレートするの特定の場合には、はい、それは可能性が高いです。プロセッサには、独自のプロセッサを実装するよりも簡単な機能が組み込まれています。タスク状態の切り替え、1つ。しかし、2番目の部分は、エミュレーションよりもコードの最適化に向いています。エミュレータはそのスワップを決して選択しません。潜在的にあらゆる種類の事柄を破る可能性があります。 –

+2

non-kvm 'qemu-x86_64-static'は、x86エミュレーションでx86を特別な場合はありませんが、まったく別のコードを生成します。意外なことに、 'mov' +' add'の組み合わせを最適化するのに賢明です。あなたは 'qemu-x86_64-static -d in_asm、out_asm test.elf'を使ってそれを走らせることができます。 – Jester

+2

BOCHSはディスパッチ・ループを持つ純粋なインタプリタ・エミュレータであり、動的再コンパイルはありません。 Bochsがどのようにボンネットの下で動作するのかを見てください。[サイトのトップページ](http://bochs.sourceforge.net/)。少なくともエミュレーション方法については、できるだけ早く実行するためのクールなトリックを使用します。 –

答えて

6

いいえ、QEMUはそのようには機能しません。 x86-x86は特殊なケースではなく、エミュレーション内の他のゲスト/ホストの組み合わせと同様に処理されます。すべてのゲストコードが最初に中間表現に変換されます。次に、単純な最適化パスが実行されます(ここで、 'load 2; add 3'は 'load 5'に単純化されます)。最後に、IRからネイティブ・ホスト・コードを生成して登録割り振りを行います。

IRゲストでは、レジスタは「TCG値」で表されます。これらのレジスタは、より高いレベルの言語で同様の変数です。ゲストレジスタはホストメモリのCPU状態構造に存在する値として定義されますが、TCGは実際に必要となるまでメモリに書き戻さないほどスマートですので、ゲストレジスタの 'ライブ'コピーはホストレジスタ内にあること。しかし、レジスタの割り当ては完全に別個のコードビットであるため、アロケータはゲストコードが最初に使用したものと同じx86レジスタを選択することはほとんどありません。

このようなIRを使用するのは、コンパイラまたはJITs(およびTCG QEMUはJIT)のための非常に一般的なデザインパターンです。利点は、考えなければならないさまざまな組み合わせの数が爆発することなく、複数のフロントエンドとバックエンドをサポートすることが簡単だということです。 QEMUは現在、18個のフロントエンドと9個のバックエンドをサポートしています。また、一般的な最適化(別々のadd命令を削除した定数フォールディングのような)は、IRで純粋に動作するだけで、一度実装する必要があります。 TCG IRがここに文書化されている

http://wiki.qemu.org/Documentation/TCG

関連する問題