通过shmget
和shmat
,我可以从另一个程序访问一个程序中存储的数据。这是代码的要点:
key=ftok("shared.c",'c');
shmid=shmget(key,1024,0644|IPC_CREAT);
data=shmat(shmid,(void *)0,0);
printf("Enter the data");
gets(data);
同样,我可以编写另一个程序并用shmat
它来访问数据。
现在我想知道如何从主机操作系统访问它。由于共享内存 id 在主机内存中会有所不同,因此shmat
不起作用。如何从主机访问共享内存?
我们可以这样做吗:我们知道虚拟机管理程序中的每个操作系统都存在一个页表,它将逻辑地址映射到物理地址,有一个 pmap 表将虚拟机管理程序的物理地址映射到物理地址主机的物理地址,虚拟机管理程序中也存在影子页表,它将逻辑来宾地址映射到主机物理地址。有没有办法访问操作系统对应的影子页表或页表
答案1
实际上你可以做到,但你需要一些嵌入式软件开发经验,你可以使用虚拟机间通信的概念,这是通过使虚拟 PCI 设备可供主机和来宾使用来实现的。您还可以查看一些详细信息:[更新]https://github.com/qemu/qemu/blob/master/docs/specs/ivshmem-spec.txt
希望这会有所帮助!谢谢
答案2
但事实并非如此:虚拟机和主机不共享相同的内存。这就是为什么它被称为虚拟机器。正如您一直在使用的那样,共享内存是一个操作系统级别的概念;您不能使用它与(来宾)操作系统控制之外的东西共享内存。
原则上,虚拟机技术可以提供某种方式在来宾和主机之间共享内存。但这将违背虚拟化的目的:它将允许来宾程序逃离虚拟机。
如果要在虚拟机与其主机之间共享数据,请使用主机上安装在虚拟机中的目录中的文件(例如通过 VirtualBox 上的 vboxsf);或者更一般地使用文件某处两边都可以访问。
答案3
尽管我认为您应该有可能需要对齐内存段。 VM 技术升级后,这种对齐方式可能会发生变化,恕不另行通知。
正如吉尔斯指出的那样 - 你应该使用其他方式。 SLES11 有一种在主机和访客之间共享信息的“好”方式:主机生成 RAM 磁盘并定期更新其内容。访客安装此 RAM 磁盘 RO 并读取内容。默认情况下,它用于将有关主机状态的信息传递给来宾(可用 RAM、主机名称等)
答案4
您可能对此对 LXD 感兴趣。它使主机和来宾之间能够共享磁盘、内存等。顺便说一句,控制和限制资源仍然是可能的。