VMCoreInfo 设备

-device vmcoreinfo 会创建一个 fw_cfg 条目,供客户机存储转储详情。

etc/vmcoreinfo

客户机可用此 fw_cfg 条目为 QEMU 转储添加详细信息。

条目长 16 字节,采用小端布局:

#define VMCOREINFO_FORMAT_NONE 0x0
#define VMCOREINFO_FORMAT_ELF 0x1

struct FWCfgVMCoreInfo {
    uint16_t host_format;  /* formats host supports */
    uint16_t guest_format; /* format guest supplies */
    uint32_t size;         /* size of vmcoreinfo region */
    uint64_t paddr;        /* physical address of vmcoreinfo region */
};

仅完整写入 16 字节才被视为有效,并继续处理条目值。

向 guest_format 写入 0,会禁用 vmcoreinfo 条目值和内容的后续处理。

可以写入主机不支持的 guest_format,此时 QEMU 可忽略条目数据, 但仍可通过调试器访问 vmcoreinfo_realize::vmcoreinfo_state。

格式与内容

截至 QEMU 2.11,仅支持 VMCOREINFO_FORMAT_ELF。

条目指定一个 ELF note 的位置和大小,它会追加到 QEMU 转储。

note 的格式/类别必须与目标位数一致,大小必须小于 1Mb。

若 ELF note 名称为 VMCOREINFO,则应为 Linux vmcoreinfo note, 格式见 内核文档。 此时 QEMU 转储代码将内容作为 key=value 文本读取,查找 NUMBER(phys_base)。 预期此值比针对架构推测的值更准确。对于启用 KASLR 的客户机, 若旧工具不能处理 VMCOREINFO note,此功能尤其有用。