QNX 虚拟化环境中的guest配置方式与非虚拟化环境中的配置方式相同。 例如,对于 QNX guest,请使用构建文件(buildfile
)。
配置guest时,请确保其配置与其将在其中运行的 VM 的配置(参考Assembling and configuring VMs)一致,就像您必须确保正确配置操作系统以在特定硬件平台上运行一样。
如果您正在构建 QNX guest,请确保将virtual
属性添加到guest的构建文件中,以便它知道它将运行的 VM 架构。 例如,对于 ARM,您需要:
[virtual=aarch64le,elf ...
对于x86:
[virtual=x86_64 ...
ARM 和 x86 guest 虚拟机都需要在其构建文件中添加一些附加指令(参考Building a QNX Hypervisor system章节的Building guests)。
有关 QNX buildfiles
文件的更多信息,请参阅Building Embedded Systems中的“OS Image Buildfiles”一章。
来宾必须与它将运行的 VM 相匹配:架构、主板特定信息、内存和 CPU、设备等(请参阅Assembling and configuring VMs)。
guest 资源类型
每台设备都位于特定位置(或“空间”)供guest使用。 该空间定义了其资源类型。 在 VM 配置中,这些位置条目以资源类型标识符开头,后跟冒号。 冒号后面的信息取决于资源类型。 支持的标识符及其标识的资源类型是:
- mem 该位置是guest-physical地址(intermediate physical address)。 冒号后面的数字给出了guest理解的物理地址。
- io 该位置位于 x86 I/O 空间中。 后面的数字是端口号。
- pci
该位置是一个 PCI 设备。 它后面可能有两种不同类型的说明符:
pci:vendor_id/device_id[/device_index]
pci:bus_number:device_number[.function_number]
例如,以下内容指定 vdev 是端口 4 上的 I/O 设备:io:4
。
有关如何使用这些标识符的更多示例,请参阅VM Configuration Reference一章中 pass qvm
配置选项的 loc 选项。
默认资源类型
如果设备配置中未指定资源类型标识符,则选择合适的默认值。 最常见的默认资源类型是mem,但默认值会根据vdev而变化。 例如,VIRTIO 设备的默认资源类型是 pci,但这些设备也可以指定为 mem 资源。
有关每个设备的默认资源类型,请参阅各个设备的描述。
Guest中断
guest中断由 VM 配置中的条目指定。 该条目有两个部分,用冒号分隔。 他们分别确定:
- guest设备可编程中断控制器 (PIC) 名称(由 vdev name 属性指定;请参阅Common vdev options)
- 当中断设备希望引发中断时,PIC 输入线被置位
在 x86 平台上,自动提供本地组件高级可编程中断控制器 (LAPIC
: Local component Advanced Programmable Interrupt Controller) 硬件; 无需为其指定 vdev,并且向 LAPIC 硬件提供中断的guest vdev 应该简单地为其中断指定“apic”(后面不带冒号或数字)。
在 ARM 平台上,自动提供通用中断控制器 (GIC) 硬件; 无需指定此 vdev。 但是,如果您想更改其选项的值,则可以指定它(参考Virtual Device Reference章节的vdev gic)。
- 例子
以下命令在 x86 平台上创建虚拟 I/O APIC 设备:
vdev ioapic
loc 0xf8000000
intr apic
name myioapic
以下在ARM平台上创建虚拟PL011设备:
vdev pl011
loc 0x1c090000
intr gic:37
从用户提供的 FDT 引用 vdev FDT 节点
由于描述 vdev 的 FDT 信息是由 qvm 进程在启动时生成的,因此该信息不能包含在您为 guest 虚拟机提供的 FDT 中 — 创建 FDT 时该信息不可用。
为了解决这个问题,hypervisor提供了一种机制,允许您引用guest中的特定 FDT 节点。 这些FDT节点位于qvm进程生成的FDT中。 要从guest的 FDT 引用此类节点,请执行以下操作:
- 在将托管您的guest的虚拟机的配置中,使用 name 选项为您的 vdev 命名; 例如:
vdev moo_vdev name gary
- 在虚拟机的 FDT 中,创建一个节点以按名称识别 vdev; 例如:
vmoo: vmoo@0 { qvm,vdev = "gary"; }
有了 FDT 中的这些信息,qvm
进程将能够为 guest 虚拟机提供一个 FDT,它将所有对 guest 虚拟机 FDT 中带有 qvm,vdev
的节点的引用重定向到它生成的相应 qvm vdev
节点,然后删除 qvm,vdev
节点。
有关 QNX hypervisor系统中的 FDT 的更多信息,参考ACPI tables and FDTs。
- 例子:引用PIC vdev
下面显示了如何在 qvm 生成的 FDT 中引用 PIC 的节点,以便 qvm 进程在启动时可以更新 guest 虚拟机的 FDT:
- 在将托管您的guest的 VM 的配置中,命名PIC vdev; 例如:
vdev gic name gicfoo
- 在 guest 的 FDT 中,创建一个节点以通过名称识别 PIC; 例如:
vgic: vgic@0 { qvm,vdev = "gicfoo"; }
- 在将托管您的guest的 VM 的配置中,命名PIC vdev; 例如:
现在可以在guest的 FDT 中引用该设备节点; 例如在设备节点的中断父属性中:
some-device-node {
interrupt-parent = <&vgic>;
};
或其中断映射属性:
interrupt-map = < 0 0 0 0 &vgic 0 140 0 0 0 0 1 &vgic 0 149 0>
- 用于包含 qvm,vdev 属性的节点的 FDT 标签可以是您想要的任何内容。
- 来宾 FDT 中的 qvm,vdev 属性值必须与 VM 配置中 vdev
name
选项的值匹配。
关于 gic vdev 名称(仅限 ARM)
如果您未在 VM 配置中指定 vdev gic
,或者指定 vdev gic
但未指定 name
选项,则 PIC vdev 默认为 vdev gic name gic
。 即为vdev配置中断时,使用gic来识别PIC; 例如:
vdev pl011 loc 0x1c090000 intr gic:37 hostdev /dev/ser2
如果您为 PIC 指定另一个名称(即不是 gic,而是 gary),则在为其他 vdev 指定中断时必须使用该名称; 例如:
vdev pl011 loc 0x1c090000 intr gary:37 hostdev /dev/ser2