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
質問のように、特定の命令のロード/ストアをしないのです。
- 私が紛失している他のロード/ストアポイント(直接的または間接的)を指摘できますか?
- は、QEMUは、ゲストのメモリへのアクセスのための単一のエントリポイント機能を提供しています(のような
guest_read()
)ゲストメモリからすべての負荷を追跡するために計測することができます? - 誰かが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ファイルのヘルパー命令によって行われると最初は考えました。 しかし、私は、cmpxcgh8b
とcmpxchg16b
のようないくつかの命令のヘルパー関数が実際にゲストメモリにアクセスしていることを発見しました。
だから、それはゲストのメモリを読み取るための複数のエントリポイントがあるわけありません。 ゲストメモリにアクセスするためにldq命令とstq命令がどのように変換されるのか説明してください。