开发 QuickVisor GuestOS
GuestOS 工程简介
QuickVisor GuestOS 工程包含客户机程序源代码,客户机程序可以是裸机程序也可以是操作系统,客户机可访问的合法资源由 QuickVisor Scenario 工程中的虚拟机硬件视图定义。
开发 SylixOS GuestOS
为特定场景工程中的 GuestVM 构建 SylixOS 客户机操作系统。以 test_multi_vm_02 为例。
获取 GuestVM 的设备树文件
从已经配置好的 Scenario 工程中获取 GuestVM 对应的设备树文件,该设备树文件描述了 GuestVM 的硬件视图。
创建 SylixOS BSP 工程
打开 RealEvo-IDE,新建一个对应 Scenario 工程的工作空间,创建对应 GuestVM 的 SylixOS BASE 工程和 BSP 工程。参考
quickvisor_ls1046_sdk
中的示例工程,完成启动代码、添加必要的驱动代码、根据 GuestVM 的设备树文件配置地址空间。
修改 generic_timer 驱动
QuickVisor 当前仅支持 GuestVM 使用 generic-timer 的虚拟定时器,因此需要修改 generic-timer 驱动中使用到的寄存器和中断号。
修改 FPU 初始化配置
SylixOS 在 ARM64 架构中 FPU 单元的初始化有 4 种类型,对于 GuestVM 的 BSP 必须选择
ARM_FPU_VFPv4
或ARM_FPU_NONE
。
修改 PSCI 采用 HVC 实现
在虚拟化环境下,GuestVM 中的 PSCI 实现有 QuickVisor 接管,具体实现由 HVC 指令代替 SMC 指令。GuestOS 执行 HVC 指令后会产生陷入,QuickVisor 将根据 HVC 的参数模拟 PSCI 的功能。
编译并部署 GuestOS 镜像文件
编译并部署 SylixOS GuestOS 镜像文件到对应 GuestVM 的资源文件夹下。
开发 Linux GuestOS
为特定场景工程中的 GuestVM 构建 Linux 客户机操作系统。以 test_multi_vm_02 为例。
获取 GuestVM 的设备树文件
从已经配置好的 Scenario 工程中获取 GuestVM 对应的设备树文件,该设备树文件描述了 GuestVM 的硬件视图。
创建 针对 GuestVM 的 defconfig 文件
拷贝 Linux 源码目录下的
arch/arm64/configs/defconfig
到arch/arm64/configs/tmp-virt-v8_defconfig
文件,然后使用tmp-virt-v8_defconfig
文件进行 Linux 内核的配置以满足对应的 GuestVM,主要包括 VirtIO 设备驱动的支持,部分配置项如下,完整的文件见quickvisor_ls1046_sdk\workspace_guestos\workspace_linux\resource\script\patch\linux\tmp-virt-v8_defconfig
。
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_BLK_DEV=y
CONFIG_VIRTIO_BLK=y
CONFIG_NETDEVICES=y
CONFIG_VIRTIO_NET=y
CONFIG_FB=y
CONFIG_FB_SIMPLE=y
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_CLUT224=y
配置 设备树文件的 bootargs 参数
在 GuestVM 的设备树文件中,包含若干个段的 ROM 和 RAM,每个 ROM 和 RAM 内存段都可以配置对应的 firmware 文件,QuickVisor 在创建 GuestVM 时,会将对应的 firmware 文件加载到相应的内存中。如果 GuestVM 不具备直通的存储设备,则可以使用 initrd 参数指定 RAMFS,使用 root 参数指定根文件系统的挂载到那个设备上,使用 rootfstype 指定根文件系统的类型,使用 console 指定 Linux 的标准输出使用哪个设备,使用 init 设置 Linux 启动后执行的 init 进程,使用 earlycon 指定早期的调试打印串口。
chosen {
stdout-path = &uart0;
bootargs = "initrd=0x43000000,0x02000000
root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0
init=/linuxrc earlycon=pl011,0x09000000";
};
编译并部署 GuestOS 镜像文件
编译并部署 Linux GuestOS 镜像文件到对应 GuestVM 的资源文件夹下。