Tengo la intención de utilizar Qemu para generar un seguimiento de memoria para la ejecución de un sistema operativo invitado x86.qemu operaciones de memoria
De acuerdo con la página wiki de tcg, Qemu usa un puñado de ayudantes para generar carga/almacenamiento en la memoria de destino (invitado). Esta lista de instrucciones es tcg_gen_qemu_ld8s/u
, tcg_gen_qemu_ld16s/u
, tcg_gen_qemu_ld32s/u
, tcg_gen_qemu_ld64
. (Tenemos un conjunto similar para las instrucciones de la tienda). estoy atrapando a todas las llamadas a las funciones anteriores en el meta-i386 archivo/translate.c
Sin embargo, todavía estoy perdiendo de carga/tiendas de ciertas instrucciones como
cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0
Preguntas:
- ¿Puede alguien señalar otros puntos de carga/almacenamiento (directos o indirectos) que me falta?
- ¿qemu proporciona una función de punto de entrada único para acceder a la memoria de invitado (como
guest_read()
) que puede ser instrumentada para rastrear todas las cargas de la memoria de invitado? - ¿Alguien puede señalar una buena documentación donde puedo entender cómo qemu mantiene el estado de la memoria de invitados?
Disculpen amigos por las instrucciones engañosas en el correo anterior.
cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0
Parece todas las instrucciones anteriores se están cubiertas con los tcg_gen_ld/st
ayudantes.
Pero ahora se han topado con otro problema:
Al principio pensé que todas las interacciones con el recuerdo de invitados pasan a través de las instrucciones de ayuda en el archivo translate.c. Sin embargo, encontré que las funciones auxiliares para algunas instrucciones como cmpxcgh8b
y cmpxchg16b
están realmente accediendo a la memoria del invitado.
Por lo tanto, significa que hay más de un punto de entrada para leer la memoria del invitado. ¿Puede alguien explicar por favor cómo se traducen las instrucciones ldq y stq para acceder a la memoria del invitado?