QNX Hypervisor —— 内存

在QNX虚拟化环境中,被客户机视为连续物理内存的客户机物理内存,实际上可能是不连续的宿主机物理内存经由虚拟化组装的。

QNX虚拟化环境中的客户机按以下用途使用内存:

  • 普通操作(参见“虚拟化环境中的内存”)

  • 访问透传设备(参见“透传内存”)

  • 与其它客户机间共享信息(参见“共享内存”)

虚拟化环境中的内存

在QNX虚拟化环境中,配置了1GB内存的客户机将看到1GB可用内存,就像在非虚拟化环境中运行时看到的可用内存一样。这种内存分配对客户机体现为其物理内存。它实际上是由虚拟化配置从非连续物理内存组装而成的内存。ARM称这种组装内存为中间物理内存(intermediate physical memory);英特尔称其为客户机物理内存(guest hypsical memory)。简单起见,我们将使用客户机物理内存,而不区分平台(请参阅术语中的“客户机内存”)。

在QNX虚拟化环境中配置和访问内存时,一定要记住以下几点:

  • 分配给客户机和任何其它用途的内存总量不得超过板上可用的物理内存。

  • 必须是以QNX Neutrino OS 7.0的系统页面大小(4 KB)的倍数来分配内存。

  • 客户机看到的内存是由不连续的内存块组装而成的。对客户机体现的这种客户机物理内存,就像物理内存在未虚拟化的系统中体现的一样;例如,对于x86系统的遗留设备,也要有相同的间隙等。

  • 对客户机呈现的物理地址,实际上是客户机物理内存的客户机物理地址,qvm进程在创建VM时将其组装在一起。

  • 在客户机看到的地址(客户机物理地址)和该客户机物理地址最终转换到虚拟化层下的物理地址(宿主机物理地址)之间没有对应关系。

图片

图1:说明被客户机操作系统视为连续物理内存的内存,是如何通过物理内存中不相关区域的虚拟化配置组装的。

上面的图表以简化的示意图展示了QNX虚拟化系统中,客户机内存分配是如何从物理内存中不连续块组装而成的。出于简化图表,对Guest 1的内存分配是不完整的。为了便于阅读,在客户机之间添加了空白。也需要注意,一些物理内存区域可能会被保留(例如,主板体系结构的设备需要位于特定位置),并且不能分配给客户机。

为客户机配置内存时,需要配置内存分配的大小和任何平台细节,比如遗留设备的间隙(x86)或内存起始地址(ARM)。虚拟机管理器负责将物理内存块组装成每个客户机的客户机物理内存分配。

透传内存(Pass-through memory)

客户机以透传设备的方式访问物理设备时,需要将这些设备映射到被配置为可访问它们的内存区域。注意,透传设备的客户机物理地址不一定与虚拟机管理器域中的宿主机物理地址相同。换句话说,客户机看到的物理地址与从虚拟机管理器主机域看到的物理地址之间没有对应关系。

例如,设备A可以配置在Guest 0的物理内存的0x100处。这个设备可以被配置为Guest 0上同一位置(0x100)的透传设备,因此当Guest 0需要访问该设备时,它会在0x100位置查看。但是,我们应该记住,当客户机查看物理地址时,它查看的是一个客户机物理地址,它将会被转换成宿主机物理内存中的其它地址,比如0xC00000100。

图片

图2:说明客户机视为物理地址的透传设备的客户机物理地址,与设备的宿主机物理地址没有对应关系。

更多有关透传设备的信息,请参阅本章中的“透传设备”。

共享内存

可以分配部分的物理内存在客户机之间进行共享。客户机将使用虚拟设备(如vdev-shmem)连接到相同的物理地址(PA:physical address),并使用共享内存区域来共享数据,每当有新数据可用或已读取时,就会相互触发。

提示:

物理地址(PA)是宿主机中的实际物理地址,而不是客户机物理地址。客户机的物理地址很可能因客户机的不同而不同。

图片

图3:说明两个客户机之间共享的内存。每个客户机都把内存看作自己的内存。

有关如何在您的虚拟机管理器系统中实现内存共享的信息,请参阅“使用虚拟机管理器系统”章节中的“内存共享”。

配置内存

要为虚拟机分配内存,必须分配系统各部分所需的内存。您不能在一个块(chunk)中为VM分配所有内存。相反,您要分配映像所需的内存,然后再分配各种设备所需的内存等。

许多系统都有内存的保留区域。x86系统尤其如此,它需要在特定位置使用许多残留的设备。这些规则也适用于在虚拟环境中运行的客户机,因为操作系统期望存在残留的设备。

当为VM分配内存时,只指定可引导映像在客户机物理内存中的位置可能是方便和有效的,并让qvm进程确定设备、共享内存等的最佳位置。

如果要为客户机的可引导映像使用内存位置,则必须将客户机配置为在其内存内的这个地址中查找映像。此外,如果使用qvm配置加载组件加载可引导映像,则加载映像的地址必须与客户的配置匹配。(如果您没有指定地址,qvm进程将为您处理这个问题。)

例如,对于一个QNX Neutrino客户机,你可以执行以下操作:

为客户机映像,从起始地址0x80000000开始分配内存:

ram 0x80000000,128M

加载启动映像到这个位置:

load 0x80000000,/vm/images/qnx7.ifs

在客户机的构建文件中指定此位置:

[image=0x80000000]

[virtual=aarch64le,elf] .bootstrap = {

        [+keeplinked] startup-armv8_fm -v -H

        [+keeplinked] PATH=/proc/boot procnto -v

}

参见“配置”章节中的“内存”。

DMA设备容器(smmuman)

虚拟机管理器使用IOMMU/SMMU管理器(smmuman),该管理器确保没有任何透传设备能够访问未显式授予其访问权限的主机物理内存。

更多有关smmuman和如何使用它的信息,请参见“实用程序和驱动程序参考”章节中的smmuman,以及“使用您的虚拟机管理器系统”章节中的“DMA设备容器(smmuman)”。

原文链接:

http://www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.hypervisor.user/topic/virt/mem.html

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值