【发布时间】:2020-07-04 09:37:25
【问题描述】:
背景
Qemu version 4.2.0,于 19 年 12 月发布,包括一个名为 TCG Plugins 的新功能。他们在tests/plugins 目录中有一些示例,API 或多或少定义在qemu-plugin.h 中。
该文件定义了两个枚举类型qemu_plugin_cb_flags 和qemu_plugin_mem_rw,它们被传递到注册回调的函数中。这些枚举似乎表明回调是读取还是写入 CPU 寄存器或内存。但是,所有示例插件都使用QEMU_PLUGIN_CB_NO_REGS,并且只有 2 个插件使用内存访问枚举。 hotpages.c 和 mem.c 使用 QEMU_PLUGIN_MEM_RW 作为默认注册内存回调 (qemu_plugin_register_vcpu_mem_cb)。 mem.c 在插件加载时有一个参数来选择它是读还是写,但是,它似乎在回调函数中没有任何区别。
问题
我的问题是,如何从插件回调函数访问客户内存和寄存器? API 似乎表明这是可能的,因为回调注册要求您说明您是否会访问它们,以及它是 RW 还是只是读取。
是否有使用这部分 API 的示例?我意识到这是 Qemu 功能的一个非常新的部分。
代码
当您在指令上注册回调时,例如在insn.c 中,您可以获得指令的虚拟地址。
uint64_t insn_vaddr = qemu_plugin_insn_vaddr(insn);
我正在运行一个裸机 ARM 程序,这个虚拟地址似乎与 ELF 文件中指令的地址相关。
在内存回调函数内部,你可以调用qemu_plugin_get_hwaddr来获取内存访问的硬件地址,但我不确定那个结构到底代表什么。
相关
这个答案已有 7 年历史,建议使用 GDB 界面。我的问题与使用 TCG 插件功能特别相关。
【问题讨论】:
标签: c arm qemu bare-metal