gpt4 book ai didi

Qemu-KVM : Translation of guest physical address to host virtual/host physical address

转载 作者:行者123 更新时间:2023-12-04 11:46:47 27 4
gpt4 key购买 nike

我正在做一个需要翻译的项目 qemu-guest物理地址来托管虚拟/物理地址。

我正在使用 VMI(虚拟机自省(introspection))来自省(introspection) qemu 进程(KVM VM)并读取存储在 virtio 环形缓冲区描述符中的 guest 物理地址。因此,我正在寻找一种简单的方法将 qemu 物理地址转换为主机端的主机虚拟地址。 (即,从 qemu 进程中提取尽可能少的信息)。

我在网上看到,在以前的版本中,qemu 将物理 RAM 基础存储在变量 phys_ram_base 中。 ,这样就可以得到主机虚拟地址如下:

host_virtual = phys_ram_base + guest_physical_address

在较新版本的 qemu 中是否可能出现这样的情况(例如,我如何获得 qemu 物理基地址——前 phys_ram_base?)

最佳答案

我不得不解决同样的问题,并提出了以下解决方案。
当使用带有 -enable-kvm 选项的 QEMU 时,内存通过 KVM_SET_USER_MEMORY_REGION 分配给 guest 。 ioctl。基本上,QEMU 准备了一个 kvm_userspace_memory_region struct,其中guest的物理地址与主机虚拟地址相关联,然后发出ioctl。现在,原来是KVMSlot struct 与 KVM API 提供的结构(几乎)是 1:1 的。 QEMU 存储所有信息,以在那里执行从客户物理地址到主机虚拟地址的转换。
KVMSlot 结构体定义如下:

    typedef struct KVMSlot
{
hwaddr start_addr;
ram_addr_t memory_size;
void *ram;
int slot;
int flags;
int old_flags;
/* Dirty bitmap cache for the slot */
unsigned long *dirty_bmap;
} KVMSlot;
start_addr是对应于所考虑插槽的开始位置的物理地址, ram是其对应的主机虚拟地址,然后是 memory_size是插槽的大小。
现在要执行翻译,您必须:
  • 找到合适的插槽。可以分配许多插槽,它们保存在 KVMSlot 的列表中。元素。列表的头部存储在KVMMemoryListener .要找到它,您可以检查访客物理地址是否在 start_addr 之间的范围内。和 start_addr + memory_size .
  • 计算您的访客物理地址在插槽中的偏移量 ( offset = gpa - start_addr )
  • 计算转换后的主机虚拟地址,如 hva = ram + offset .当然, guest 物理地址和主机虚拟地址中的偏移量是相同的,这就是您可以使用它的原因。

  • 最后,您可以使用函数 gpa2hva 检查翻译是否正确。 QEMU 监视器。

    关于Qemu-KVM : Translation of guest physical address to host virtual/host physical address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41860920/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com