Memory 来自地址的QEMU KVM转储格式字符串

Memory 来自地址的QEMU KVM转储格式字符串,memory,linux-kernel,virtualization,qemu,kvm,Memory,Linux Kernel,Virtualization,Qemu,Kvm,对于一个大学项目,我必须扩展一个QEMU版本,该版本已被修改为模糊化。我想打印更多调试消息。此QEMU版本使用hypercall替换对kasan_report和panic的Linux内核函数调用,以便QEMU能够处理该事件 超级调用发生时执行的函数如下所示 static void handle_hypercall_panic(struct kvm_run *run, CPUState*cpu){ /* */ } 现在我想读出QEMU中的内存,目前我可以访问CPUState结构

对于一个大学项目,我必须扩展一个QEMU版本,该版本已被修改为模糊化。我想打印更多调试消息。此QEMU版本使用hypercall替换对
kasan_report
panic
的Linux内核函数调用,以便QEMU能够处理该事件

超级调用发生时执行的函数如下所示

static void handle_hypercall_panic(struct kvm_run *run, CPUState*cpu){
    /*
    */ 
}
现在我想读出QEMU中的内存,目前我可以访问
CPUState
结构中的所有寄存器,并拥有函数的所有参数,包括指向格式字符串所在内存区域的指针。现在如何从QEMU源代码访问内存区域并转储格式字符串


我知道有一些文档,如果没有人回答我,我会阅读它们,但为了节省时间,最好先询问。

使用
cpu\u memory\u rw\u debug
读取来宾内存,例如:

  uint8_t str[10];
  if( cpu_memory_rw_debug( cpu, virtualAddressOfString, (uint8_t *)str, sizeof( str ), 0 ) )
  {
    printf( "Failed to read str!\n" );
  }
如果字符串所在的页面不在内存中(例如页面文件中),则此函数将失败。处理此问题的最简单方法是访问来宾hypercall代码中的字符串,强制将其加载到内存中。如果字符串驻留在一个页面中,则仅访问第一个符号就足够了。如果有多个页面,您应该在每个页面中访问至少一个符号