Я намерен использовать Qemu для создания трассировки памяти для выполнения гостевой операционной системы x86.
Согласно вики-странице tcg, Qemu использует несколько помощников для загрузки/сохранения в целевую (гостевую )память. Это список инструкций tcg_gen_qemu_ld8s/u
, tcg_gen_qemu_ld16s/u
, tcg_gen_qemu_ld32s/u
, tcg_gen_qemu_ld64
. (У нас есть аналогичный набор инструкций по хранению ). Я перехватываю все вызовы вышеуказанных функций в файле target -i386/translate.c
Однако мне по-прежнему не хватает загрузки/сохранения некоторых инструкций, таких как
cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0
Вопросы:
guest_read()
)что можно инструментировать для трассировки всех загрузок из гостевой памяти???Извините, друзья, за вводящие в заблуждение инструкции в предыдущем письме.
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 переводятся для доступа к гостевой памяти??