虚拟机间共享内存设备ivshmem (Inter-VM shared memory device)设计用于共享运行不同客户机的多个QEMU进程以及与宿主机之间的内存区域。为了让所有的Guest虚拟机都能访问共享内存区域,QEMU将该设备建模为一个PCI设备,将共享内存作为PCI的BAR空间
ivshmem设备可以直接使用宿主机上的共享内存对象(内存映射的文件、内存设备、内存大页等),也可以从一个ivshmem server获取共享内存。当使用ivshmem server时,该设备可以与共享内存对象的多个对端建立中断通信机制
此次设计共享内存通信中间件为用户提供五块独立的共享内存块,通过不同 topic 加以区分,并提供较为简单的通讯接口如 send、recv、pub、sub接口,独立提供跨域同步功能接口 Wlock、Rlockfree 使得在不同机器上读写共享内存数据保证同步,单次同步时间约为 10 微妙。
通过虚拟的 PCI 设备,在不同 qemu 进程间共享由主机创建的内存区域。通过将共享内存映射进 pci 设备中的 BAR 区域,使得 guest 机器在访问或操作 pci 内部 BAR 内存区域以达到操作共享内存的目的,并且将系统事件映射进 pci 设备中的 MSI-X 中断作为跨域信号的通知方式以提高效率
优点:
缺点:
Ivshmem PCI设备有2个或3个BAR寄存器
PCI BARX | 描述 |
---|---|
BAR0 | 设备寄存器(256B的MMIO) |
BAR1 | MSI-X表和PBA(ivshmem-doorbell) |
BAR2 | 用作映射的共享内存对象 |
{{< callout type="warning" >}}
Warning注意:该场景必须有一个宿主机上的 ivshmem server,ivshmem 设备会连接到 unix socket 字符设备的该 server 上。ivshmem server 会为每一个 ivshmem 设备分配一个唯一的 ID(0-65535)。中断使用 MSI-X(message-signaled)机制,vector=N 用于配置 MSI-X 使用的 vectors 数量
{{< /callout >}}
基于 ivshmem-doorbell 重新设计跨域共享内存通信中间件
去除了对虚拟网卡依赖,采用了 ivshmem-doorbell 的驱动方式进行事件通知
默认提供五块共享内存(size : 8M)为用户使用,具体大小可根据用户选择进行具体配置