实现一个 RISC-V 虚拟机监控程序

主要观点:通过类似 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_timersstc扩展两种方式,还需处理中断注入。
  • MMIO 支持中 hypervisor 像 CPU 解释器,需处理 guest 对 MMIO 地址的访问。
  • 最后实现 virtio-fs 完成 hypervisor 特定步骤,可通过特定脚本在 GDB 中调试。
阅读 32
0 条评论