主要观点:通过类似 WSL2 的 Linux 轻量级 VM 方法将 Linux 无缝集成到Starina中,实现基于 RISC-V H 扩展的 hypervisor 来运行 Linux,并记录逐步编写 RISC-V hypervisor 的过程。
关键信息:
- RISC-V H 扩展引入新的 CPU 模式和 CSR 以实现硬件辅助虚拟化,设计类似 Intel VT-x。
- 在 macOS 上测试 hypervisor 需使用嵌套虚拟化,QEMU 可模拟 RISC-V H 扩展。
- 逐步实现进入 guest 状态、运行简单
ecall
、运行 Hello World 程序、启动 Linux、添加设备树、支持rdtime
、定时器支持、MMIO 支持、virtio-fs 等步骤。 - Starina 支持类似 Unikernel 的模式,便于调试,可通过
gdbinit
脚本在 GDB 中同时调试 VMM、hypervisor 和 guest 内核。
重要细节: - 在 RISC-V 中,guest 内核模式为 VS-mode,需设置
hstatus.SPV
为 1 进入 guest 模式,首次进入时内核出现“instruction guest-page fault”错误。 - 运行简单
ecall
需准备 guest 的页表,将 guest 物理地址映射到 host 物理地址。 - 启动 Linux 时需配置相关内核选项,构建 boot 镜像并复制到 guest 内存,开始时出现空引用错误。
- 设备树需包含内存区域和 CPU 扩展等信息,可使用
vm-fdt
库。 - 实现定时器支持有
sbi_set_timer
和sstc
扩展两种方式,还需处理中断注入。 - MMIO 支持中 hypervisor 像 CPU 解释器,需处理 guest 对 MMIO 地址的访问。
- 最后实现 virtio-fs 完成 hypervisor 特定步骤,可通过特定脚本在 GDB 中调试。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。