欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > qemu 共享内存设备——ivshmem

qemu 共享内存设备——ivshmem

2025/2/23 0:56:30 来源:https://blog.csdn.net/cclethe/article/details/144698555  浏览:    关键词:qemu 共享内存设备——ivshmem

文章目录

    • 背景
    • 简单使用
    • 参考

背景

vshmem是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

简单使用

  1. qemu启动参数添加:-device ivshmem-plain,memdev=ivshmem -object memory-backend-file,id=ivshmem,share=on,mem-path=/dev/shm/shm1,size=16M

  2. 启动虚拟机,可以看到:
    在这里插入图片描述

  3. 虚机内使用测试程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <assert.h>#define SHM_SIZE (16 * 1024 * 1024)int main(int argc, char **argv) {char *p;int fd;int i;fd = open("/sys/bus/pci/devices/0000:00:04.0/resource2", O_RDWR);assert(fd != -1);p = mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);assert(p != NULL);for (i = 0; i < 8; i++) {printf("%c", p[i]);}munmap(p, SHM_SIZE);close(fd);return 0;
}
  1. Host 内向共享内存写入:echo “SIGN_01” > /dev/shm/shm1

  2. guest内运行程序:

$ sudo ./a.out
SIGN_01

参考

  • Inter-VM Shared Memory device

  • https://github.com/henning-schild-work/ivshmem-guest-code

  • vshmem内存共享设备

  • QEMU虚拟机内识别ivshmem设备

  • QEMU tutorial:How to use ivshmem-plain

  • Notes about ivshmem

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词