2012-08-12 6 views
7

Qemuを使用してx86ゲストオペレーティングシステムの実行のためのメモリトレースを生成する予定です。qemuメモリ操作

は、TCGのwikiページによると、QEMUはターゲット(ゲスト)メモリにロード/ストアを生成するために、ヘルパーの一握りを使用しています。 この命令リストはtcg_gen_qemu_ld8s/u,tcg_gen_qemu_ld16s/u,tcg_gen_qemu_ld32s/u,tcg_gen_qemu_ld64です。 (ストア命令にも同様のセットがあります)。 私はターゲット-I386/translate.cファイルが

に上記の機能に対するすべての呼び出しをトラップしています、私はまだ

cmp ecx, [r12+0x4] 
mov r10b, [r13+0x0] 
mov byte [rax+0xf0000], 0x0 
mov byte [rax+rdx], 0x0 

質問のように、特定の命令のロード/ストアをしないのです。

  1. 私が紛失している他のロード/ストアポイント(直接的または間接的)を指摘できますか?
  2. は、QEMUは、ゲストのメモリへのアクセスのための単一のエントリポイント機能を提供しています(のようなguest_read())ゲストメモリからすべての負荷を追跡するために計測することができます?
  3. 誰かがqemuがゲストメモリの状態をどのように維持しているかを理解できる良い文書を指摘できますか?前回のメールでの誤解を招くような手順については

申し訳ありませんが、友人。

cmp ecx, [r12+0x4] 
mov r10b, [r13+0x0] 
mov byte [rax+0xf0000], 0x0 
mov byte [rax+rdx], 0x0 

上記の手順はすべてtcg_gen_ld/stヘルパーでカバーされているようです。

しかし、今私は別の問題に遭遇しました:
ゲストメモリとのすべてのやりとりは、translate.cファイルのヘルパー命令によって行われると最初は考えました。 しかし、私は、cmpxcgh8bcmpxchg16bのようないくつかの命令のヘルパー関数が実際にゲストメモリにアクセスしていることを発見しました。

だから、それはゲストのメモリを読み取るための複数のエントリポイントがあるわけありません。 ゲストメモリにアクセスするためにldq命令とstq命令がどのように変換されるのか説明してください。

答えて

1

cpu_ld*_datacpu_st*_dataまたはcpu_ld*_data_racpu_st*_data_raと呼ばれるその他の関数は、データをロードする関数です。 _raバージョンには追加の引数があります。これは、生成されたコード内の呼び出し元のアドレスです。ロードまたはストアがページフォルトを生成した場合に、フォルト命令のアドレスを計算するために使用されます。例えば

cmpxchg8bためgrepをする

target/i386/mem_helper.c:void helper_cmpxchg8b(CPUX86State *env, target_ulong a0) 

その関数内を与える:

uintptr_t ra = GETPC(); 
... 
oldv = cpu_ldq_data_ra(env, a0, ra); 
newv = (cmpv == oldv ? newv : oldv); 
/* always do the store */ 
cpu_stq_data_ra(env, a0, newv, ra); 
関連する問題