Я намерен использовать 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
Вопросы :
- Может кто-нибудь указать на другие точки загрузки/сохранения (прямые или косвенные), которые мне не хватает??
- Предоставляет ли 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 переводятся для доступа к гостевой памяти??