VM 配置文件是人类可读的纯文本文件。 当您启动 qvm 进程来创建 VM 并运行 guest 虚拟机时,qvm 进程会读取配置信息到底以了解如何组装和配置 VM。
一般规则
- 一行中数字符号** (#) 后面的所有内容都是注释**,将被忽略,空白行也是如此。
- qvm 配置中的条目(注释除外)是选项或参数。
Rules for options
- 选项可能会通过以下方式之一影响上下文:
- 该选项建立了一个可以在其中设置其他选项的上下文; 例如,
vdev
选项建立一个上下文,在该上下文中通过其他选项定义虚拟设备。 - 该选项适用于上下文; 例如,
cpu
选项后面的sched
选项适用于 cpu 选项建立的当前上下文,因此sched
有助于cpu
指定的 vCPU 的定义。 - 该选项既不建立上下文,也不应用于上下文; 例如,
ram
选项支持设置分配内存的位置和大小的参数,但它不支持任何选项。
- 该选项建立了一个可以在其中设置其他选项的上下文; 例如,
更多细节,参考下面的Contexts。
- 不适用于上下文的选项指定要包含在 VM 中的组件。
例如,cpu 指示 qvm 进程创建虚拟 CPU,load /vm/images/qnx7.ifs
指示 qvm 进程将 /vm/images/qnx7.ifs
的内容复制到 guest 系统地址空间。
- 未指定的选项没有默认值。
- 大多数(但不是全部)选项需要一个参数
(参阅下面的Rules for arguments和VM Configuration Reference章节的各个选项的条目)
- 一般来说,选项顺序并不重要。 例如,定义
vdev
的顺序并不重要(参阅下面的Exceptions)。
Rules for arguments
- 立即遵循它适用的选项
- 与它适用的选项位于同一文件中
Contexts
当 qvm 进程读取其配置文件以组装其正在创建的 VM 的组件时,建立上下文的选项后面的所有内容都在此选项的上下文中。 所有其他选项都适用于该选项,直到遇到建立上下文的新选项或到达文件末尾。 本质上,上下文是配置文件中将相关选项组合在一起的块。
例如,在以下代码片段中,每个 sched
选项都适用于前面的 cpu
选项:
cpu
sched 8 ram 32m
cpu
sched 6
由于cpu建立了上下文,因此每次遇到该选项时上下文都会发生变化; 每个 cpu 条目后面的内容要么适用于该选项,要么创建一个新的上下文。
如果某个选项在上下文中重复,则 qvm 进程将使用该上下文中该选项的最后一个实例。 例如:
cpu sched 8 cpu sched 6
创建 1 个调度优先级为 8 的 vCPU 和 1 个调度优先级为 6 的 vCPU。但是,以下情况:
cpu sched 8 sched 6 cpu
创建 1 个调度优先级为 6 的 vCPU(sched 8 被丢弃)和 1 个具有默认调度优先级(即 qvm 进程实例启动时的调度优先级)的 vCPU。
不过,cpu 选项后面的不同选项的顺序并不重要。 例如:
cpu sched 8 ram 32m
相当于:
cpu ram 32m sched 8
换行符是为了提高人类可读性,并且在 qvm 进程解析配置文件时会被忽略。
Exceptions
上述规则有一些例外,即选项顺序并不重要。 这些例外适用于以下组件:
system
如果指定了system选项,则它必须是 qvm 配置中的第一个条目 (参阅VM Configuration Reference章节的system)。
ram
必须在指定将使用内存的组件的任何选项之前分配内存:必须在引用guest内存的任何选项之前指定 ram
和 rom
选项。 例如:
ram 32m
load /qnx7.ifs
有效,因为 ram 32m
已分配了 32 MB,qvm 进程可以将 IFS 文件加载到其中。 但是,以下操作将会失败:
load /qnx7.ifs
ram 32m
因为没有分配内存,所以qvm进程无处加载IFS文件。
rom
与 ram 相同的排序规则。 必须在任何选项引用之前指定。
PIC vdevs
可编程中断控制器 (PIC) 的 vdev 必须在引用它们的任何其他 vdev 之前指定。 例如:
vdev ioapic
loc 0xf8000000
intr apic
name myioapic
vdev ser8250
intr myioapic:4
有效,因为 vdev ioapic
是在引用它的 vdev ser8250
之前指定的。 但是,以下操作将会失败:
vdev ser8250
intr myioapic:4
vdev ioapic
loc 0xf8000000
intr apic
name myioapicr
因为在指定此 vdev 之前,vdev ser8250
引用了 vdev ioapic
。
您应该始终为您的system命名,然后在 qvm 配置的开头分配 RAM 和 ROM。
文本替换
当 qvm 流程实例读取其配置信息时,它会在遇到以下字符序列时执行文本替换:
$env{envvar}
将文本字符串替换为 envvar
环境变量的值。
$asinfo_start{asinfo_name}
将文本字符串替换为 asinfo_name
指定的系统页面 asinfo 条目的起始地址。
$asinfo_length{asinfo_name}
将文本字符串替换为 asinfo_name 指定的系统页面 asinfo 条目的长度。
您可以使用此文本替换来使您的配置更加健壮。 例如,您可以将内存区域传递给 guest 虚拟机,而无需在 VM 配置中指定内存的主机地址,如下所示:
- 让hypervisor 主机的启动分配内存并使用系统页面 asinfo 条目(例如 guestmem1)记录其位置。
- 使用文本替换将名为 guestmem1 的系统页面 asinfo 条目中的信息放入 qvm 配置中:
pass loc 0x10000000,$asinfo_length{guestmem1},rw=$asinfo_start{guestmem1}
通过此配置,无论reserved memory实际位于主机中的哪个位置,该配置都将起作用。
同样,您可以使用 $env
将参数放入配置文件中。
例如,qvm 配置文件(例如 myconfig.qvmconf)中包含以下内容:
vdev ser8250 hostdev $env{HOST_DEV}
然后,您可以将 vdev ser8250 hostdev
选项设置为您为 HOST_DEV
输入的任何值,然后启动 qvm 进程实例,如下所示:
export HOST_DEV=/dev/ser3
qvm @myconfig.qvmconf
请注意,使用 $asinfo_start
时,仅传递叶名称,而不是完整路径。 例如,以下说法是不正确的:
pass
loc 0x10000000,$asinfo_length{guestmem1},rw=$asinfo_start{/foo/guestmem1}
以下是正确的用法:
pass
loc 0x10000000,$asinfo_length{guestmem1},rw=$asinfo_start{guestmem1}
有关系统页面 asinfo
数据结构数组的更多信息,请参阅Building Embedded Systems中的“System Page ”一章。
关于符号
用于指定内存地址和大小的默认符号(不需要前缀)是:
- address in memory – 16进制
- size or length of memory region – 10进制
如果您更喜欢使用默认符号以外的符号来写入内存地址或区域大小,则可以使用前缀来指定符号:
- 10进制 – 0d (e.g., 0d1234)
- 16进制 - 0x (e.g., 0x4D2)
您可以在地址和长度参数中使用大小乘数:“K”、“M”、“G”(或“k”、“m”、“g”); 例如:4K,1k相当于0x1000,0x400。 (请记住:大小乘数是十进制乘数,因此 4K 是 4 x 1024 = 4096,或 0x1000。)
其他数字配置值以十进制指定。 为了避免混淆,我们建议在使用十六进制值时指定前缀。