配置guest

Posted by Underdog Linux on October 22, 2023

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 配置中的条目指定。 该条目有两个部分,用冒号分隔。 他们分别确定:

  1. guest设备可编程中断控制器 (PIC) 名称(由 vdev name 属性指定;请参阅Common vdev options
  2. 当中断设备希望引发中断时,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 引用此类节点,请执行以下操作:

  1. 在将托管您的guest的虚拟机的配置中,使用 name 选项为您的 vdev 命名; 例如:
    vdev moo_vdev name gary
    
  2. 在虚拟机的 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:
    1. 在将托管您的guest的 VM 的配置中,命名PIC vdev; 例如:
      vdev gic name gicfoo
      
    2. 在 guest 的 FDT 中,创建一个节点以通过名称识别 PIC; 例如:
      vgic: vgic@0 {
        qvm,vdev = "gicfoo";
      }
      

现在可以在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