一、编译SDK、烧写并获取相关信息

SDK相关内容需要向各板卡厂商获取,这里不对SDK编译烧写过程做解释,直接对我们需要的一些内容做简单罗列

image 用于启动root
dts 我们会对设备树进行一些裁剪以方便hvisor启动 dts可以直接从SDK获取,也可以在启动linux后使用命令获取
dtc -I fs -O dts -o ./extracted.dts /proc/device-tree
直接从SDK获取的dts可读性更高
串口地址与型号 用于调试hvisor串口 对于arm64常见的串口,hvisor已经基本实现了全覆盖,包括imx_uart,pl011,uart_16550(8250)等

二、编写HVISOR配置文件

hvisor配置文件在/path/to/hvisor/platform中,文件目录如下

platform
├── aarch64
│   ├── imx8mp
│   ├── qemu-gicv2
│   ├── qemu-gicv3
│   ├── rk3568
│   │   ├── board.rs
│   │   ├── cargo
│   │   │   ├── config.template.toml
│   │   │   └── features
│   │   ├── configs
│   │   │   └── linux2.json
│   │   ├── image
│   │   │   └── dts
│   │   │       ├── Makefile
│   │   │       ├── rk3568-evb1-ddr4-v10-linux.dts
│   │   │       ├── zone0_rk3568.dts
│   │   │       └── zone1_rk3568.dts
│   │   ├── linker.ld
│   │   └── platform.mk
│   └── zcu102
├── loongarch64
│   ├── ls3a5000
│   └── ls3a6000
├── riscv64
│   ├── qemu-aia
│   └── qemu-plic
└── x86_64
    └── qemu

在aarch64下新增一个对应板卡名称的文件夹,这里就是新增rk3568文件夹

board.rs为启动zone0的配置文件,这部分内容在后面详细叙述,这里可以先从qemu里复制一个不改

config.template.toml根据相同架构的文件,只需要修改其中a55/a53字段即可

features中指定了hvisor需要启用的配置,必须添加的项目有uart driver、irqchip driver、cpu、pt_layout_XX四个字段,可选的配置项可以参考cargo.toml中的features。比如rk3568初始的features文件如下

gicv3
uart_16550
rk3568_uart_base
pt_layout_rk3568
a55

linux2.json是启动zone1的配置文件,可以先不填,此文件不影响编译

image中的内容其中dts就是我们在第一步获取的dts,此文件不影响编译

linker.ld直接复制qemu/rk3568的即可,唯一可能需要修改的值是BASE_ADDRESS,这个值是hvisor.bin的load地址,需要和uboot中对应上,第一次启动不改就行

platform.mk直接复制qemu/rk3568的即可,如果前面改里BASE_ADDRESS这里的地址要做同步修改

注意每次修改platform内容后需要make clean再重新编译,否则相关内容不会更新

三、Hvisor编译

mmu设置

现在hvisor肯定是编译不通过的,对于aarch64来说,hvisor有自己的页表,该页表在src/arch/aarch64/mmu.rs中实现,我们在features中填的pt_layout_rk3568需要在这个文件中有对应的实现,具体对mmu.rs的实现参考文件

实际上我们只需要关心哪部分是内存包含里串口,并把那部分内存设置为device类型即可,以此为基准参考qemu和rk3568的实现添加一个pt_layout_xx即可。