Notes about ivshmem
ivshmem是QEMU提供的一种宿主机与虚拟机之间或多个虚拟机之间共享内存的特殊设备。它有两种形式:
- ivshmem-plain: 简单的共享内存区域
- ivshmem-doorbel: 除了共享内存,还能提供基于中断的通信机制
这种设备在虚拟机内部表现为PCI设备,共享的内存区域则以PCI BAR的形式存在。ivshmem PCI设备提供3个BAR:
- BAR0: 设备寄存器
- BAR1: MSI-X表
- BAR2: 共享内存区域
简单的共享内存场景只使用BAR2。如果需要基于中断实现额外通信,需要用到BAR0和BAR1。
只考虑共享内存这个场景,是如何做到内存共享的呢?在不同的虚拟机(这些虚拟机会共享内存)内,ivshmem device的BAR2地址(GPA)可能不同,但是对应的HPA是一样的,hypervisor会为不同虚拟机的ivshmem device的BAR2内存区域建立EPT映射,因此就达到共享内存的目的!
即:
- GPA1->HPA1
- GPA2->HPA1
Evidence on ACRN hypervisor:1
2
3
4
5
6
7
8
9
10
11
12
13// hypervisor code
static void ivshmem_vbar_map(struct pci_vdev *vdev, uint32_t idx)
{
struct acrn_vm *vm = vpci2vm(vdev->vpci);
struct pci_vbar *vbar = &vdev->vbars[idx];
struct ivshmem_device *ivs_dev = (struct ivshmem_device *) vdev->priv_data;
if ((idx == IVSHMEM_SHM_BAR) && (vbar->base_hpa != INVALID_HPA) && (vbar->base_gpa != 0UL)) {
//ept_add_mr is called to build EPT mapping for ivshmem BAR2!
ept_add_mr(vm, (uint64_t *)vm->arch_vm.nworld_eptp, vbar->base_hpa,
vbar->base_gpa, vbar->size, EPT_RD | EPT_WR | EPT_WB | EPT_IGNORE_PAT);
...
}
1 | //device model code |
参考资料: