板virt为与任何真实硬件不相关的平台;它为虚拟机中使用。
如果你想简单的运行guest比如linux并且不关心减少真实硬件的一些特性和限制,virt为建议的板类型。
它为“versioned”板模型,因此与virt机器类型一样(它存在优化,bugfix和其他QEMU版本的修改),提供一个版本保证与之前的QEMU版本有相同的行为。比如virt-5.0机器类型将从QEMU5.0版本virt机器,且迁移特性在virt-5.0的QEMU 5.0和QEMU 5.1之间工作。迁移特性不能保证不同的QEMU版本能工作。
virt板支持:
- PCI/PCIe 设备
- Flash 内存
- 一个PL011 UART
- 一个RTC
- fw_cfg设备允许guest从QEMU获取数据
- 一个PL061 GPIO控制器
- 一个可选的SMMUv3 IOMMU
- 可热插的DIMM
- 可热插的NVDIMM
- 一个MSI控制器(GICv2M或ITS)。与GICv2相关默认为GICv2M。GICv3默认选择ITS(>=virt-2.7)。注意ITS不支持TCG模式
- 32个virtio-mmio传输层设备
- 在aarch64硬件使用KVM加速器运行guest
- 大量RAM内存(最少256GB,若使用高端内存,可以更多)
- 很多CPUs(若支持GICv3和高端内存,可以最多512个)
- 若CPU有trustzone, 仅安全领域设备
支持的guest CPU类型:
- cortex-a7(32位)
- cortex-a15(32位)
- cortex-a53(64位)
- cortex-a57(64位)
- cortex-a72 (64位)
- host(仅KVM时支持)
- max(与host一样仅KVM时支持;最好与TCG模拟)
注意默认位cortex-a15,因此对于aarch64 guest,你必须指明CPU类型。
可以输出图像,但不像X86 PC机器类型,没有默认的显示设备使能:你应该从“-device help”中显示设备选择一个。建议的选项位"virtio-gpu-pci";它为可以与KVM工作的唯一选择。你也需要保证你的guest kernel被配置支持它。
支持以下与机器相关的选项:
(1)secure
设置on/off来使能或禁用模拟一个guest CPU,该CPU支持ARM安全扩展(TrustZone)。默认为off。
(2)virtualization
设置on/off来使能或禁用模拟一个guest CPU,该CPU支持ARM虚拟化扩展。默认为off。
(3)mte
设置on/off来使能或禁用模拟一个guest CPU,该CPU支持ARM memory tagging扩展。默认为off。
(4)highmem
设置on/off来使能或禁用将设备和RAM放到高32位的地址空间。默认位on。
(4)gic-version
指明GIC的版本。有效的值为:2表示GICv2;3表示GICv3;host表示当使用KVM时使用与host上一样的GIC版本;max使用最好的GIC版本,与host一样需要使用KVM,对于TCG与3一样;
(5)its
设置on/off来使能和禁用ITS转换。在virt-2.7以后的版本默认对于机器类型为on。
(6)iommu
为guest创建IOMMU类型。有效值为:none表示不创建IOMMU,默认选项;smmuv3创建一个SMMUv3。
(7)ras
使用on/off来使能和禁用使用ACPI和guest外部abort异常将host内存错误报告guest。默认为off。
Linux arm和arm64内核的defconfig应该包含virtio和PCI控制器的设备驱动;但是一些老的内核版本,特别是32位ARM,不需要将所有默认的都使能。若你没有看到期望的PCI设备,需要检查guest配置:
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_PCI_HOST_GENERIC=y
若你想使用virtio-gpu-pci图像设备,你需要配置:
CONFIG_DRM=y
CONFIG_DRM_VIRTIO_GPU=y
板virt自动产生一个设备树dtb,该设备树被传递给guest。这提供一些信息,这些信息包括地址,中断线,和其他系统中其他各种设备的配置。Guest代码依赖并硬编码以下地址:
- Flash内存起始于地址0x0000_0000
- RAM起始于0x4000_0000
所有其他设备信息在不同QEMU版本之间会有差异,因此guest必须查看DTB。
QEMU对于virt支持两种类型的guest image启动,guest代码来定位dtb二进制的方法。
- 对于使用LINUX内核启动协议(这意味着任何non-ELF文件被传递给QEMU)的guest,DTB的地址也被传递到寄存器(r2为32位guest,x0表示64位guest)。
-对于以裸设备启动的guest,DTB的RAM的起始地址为(0x40000000).