2012-08-12 15 views
7

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:

  1. ¿Puede alguien señalar otros puntos de carga/almacenamiento (directos o indirectos) que me falta?
  2. ¿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?
  3. ¿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?

Respuesta

1

Las otras funciones que se cargan los datos se llaman cpu_ld*_data y cpu_st*_data, o cpu_ld*_data_ra y cpu_st*_data_ra. La versión _ra tiene un argumento adicional, que es la dirección de la persona que llama en el código generado. Se utiliza para calcular la dirección de la instrucción de fallas en caso de que la carga o la tienda genere un error de página.

Por ejemplo, grepping para cmpxchg8b da

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

y dentro de esa función:

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); 
Cuestiones relacionadas