7 分•作者: eyengin•6 个月前
Hi HN,
我将教学操作系统 xv6-riscv 移植到了 HiFive Unmatched,并在真实硬件上运行起来,包括通过了用户测试。
我一直在自学操作系统内部原理,使用了 MIT 6.1810 的材料。在完成了大部分实验后,我非常渴望看看在裸机上运行操作系统是什么感觉,而不是在 QEMU 上。
Unmatched 可能没有最新的 RISC-V 特性,但它的文档很完善,而且 B 版本的发布使其价格更实惠,这使它成为了一个很好的学习平台。
移植过程涉及几个有趣的挑战:
- 硬件问题:处理诸如在 PTE 中启用 A/D 位(硬件不会自动设置它们,导致页面错误)、正确处理中断和指令缓存同步等问题。
- 启动流程:xv6 期望在启动时处于 M 模式,但标准的 RISC-V 启动流程(通常通过 OpenSBI)会跳转到 S 模式。为了弥合这一差距,我创建了一个最小的 U-Boot FIT 镜像,其中只包含 xv6 内核。这样,U-Boot SPL 负责处理复杂的 CPU/DDR 初始化,然后将控制权交给 M 模式下的 xv6(跳过 OpenSBI)。
- 驱动程序:移植了一个 SPI SD 卡驱动程序,替换了 virtio 磁盘驱动程序。
我在这里写了实现笔记:<a href="https://github.com/eyengin/xv6-riscv-unmatched/blob/unmatched/doc/NOTES.md" rel="nofollow">https://github.com/eyengin/xv6-riscv-unmatched/blob/unmatche...</a>
希望这对于其他正在学习操作系统内部原理并希望尝试在真实的 RISC-V 硬件上运行代码的人有所帮助。