对于一个大学项目,我必须扩展一个经过模糊化修改的QEMU版本。我想打印更多的调试消息。这个QEMU版本将Linux内核函数对kasan_report
和panic
的调用替换为超级调用,这样QEMU就可以处理该事件。
超级调用发生时执行的函数如下所示。
static void handle_hypercall_panic(struct kvm_run *run, CPUState*cpu){
/*
*/
}
现在我想读出QEMU中的内存,目前我可以访问CPUState
结构中的所有寄存器,并拥有函数的所有参数,包括指向格式字符串所在的内存区域的指针。现在,我如何从QEMU源代码访问内存区域并转储格式字符串?
我知道有一些文档,如果没有人回答我,我会阅读它们,但为了节省一些时间,提前询问是很好的。
使用cpu_memory_rw_debug
读取来宾内存,例如so:
uint8_t str[10];
if( cpu_memory_rw_debug( cpu, virtualAddressOfString, (uint8_t *)str, sizeof( str ), 0 ) )
{
printf( "Failed to read str!n" );
}
如果字符串所在的页面不在内存中,例如在页面文件中,则此函数将失败。处理此问题的最简单方法是访问来宾超级调用代码中的字符串,以强制将其加载到内存中。如果字符串位于一个页面中,则只访问第一个符号就足够了。如果有多个页面,您应该在每个页面中至少访问一个符号。