$ cd StarryOS
# 正常编译
$ make vf2
# 推荐开启 link time optimizations
$ make vf2 LTO=y
# 调试日志输出
$ make vf2 LOG=debug内核镜像文件位于 StarryOS_visionfive2.bin
TODO: 初始化分区表、OpenSBI 等
- 创建一个 FAT32 格式的分区
- 将编译好的内核镜像文件拷贝至根目录并重命名为
kernel - 创建文件
vf2_uEnv.txt,写入以下内容:其中boot2=load mmc 1:3 $kernel_addr_r kernel; go $kernel_addr_r1:3代表 1 号卡槽的分区 3,请根据实际情况调整;环境变量中kernel_addr_r应为0x40200000,如果不是的话请在此文件中进行覆盖
到这里,应当可以成功进入 ArceOS 并打印调试信息
- 创建一个 ext4 格式的分区,并将“分区名称”设置为
root(注意不是卷标);这里假设创建的分区是/dev/sda4 - 将 rootfs 刷写到此分区,如:
推荐先多次使用
sudo dd if=rootfs-riscv64.img of=/dev/sda4 status=progress bs=4M conv=fsync
resize2fs -M xxx.img尽可能压缩镜像文件大小以加快刷写速度 - 更新文件系统大小,扩大到整个分区:
sudo resize2fs /dev/sda4
至此,应当可以进入 Starry OS 的命令行进行交互,不过由于目前还未实现网卡驱动,所以无法使用 apk 安装软件包,可以在创建基础文件系统后,将需要运行的软件拷贝至文件系统。
- PLIC 无法工作
该平台与 QEMU RISC-V Virt Machine 相似程度较高,本仓库的适配代码与 axplat-riscv64-qemu-virt 也仅存在一些配置上的差异。以下对其简单说明:
-
配置文件:参考 Linux 中的设备树配置文件,修改 axconfig.toml,主要有以下内容需要调整:
phys-memory-base/phys-memory-size:物理内存区域kernel-base-paddr/kernel-base-vaddr:内核代码基地址mmio-ranges:这里我们为了方便直接把整个0x0到0x4000_0000都配置成了 MMIO 区域pci-*:目前没有实现 PCItimer-frequency:时钟频率rtc-paddr/plic-paddr/uart-paddr/uart-uirq/sdmmc-paddr:外设相关配置
timer-irq和ipi-irq在 RISC-V 架构上是固定的。 -
启动:最初我们在 U-Boot 中使用 booti 指令启动,因此伪装了 Linux 启动镜像文件头,即代码
boot.rs中.ascii \"MZ\"这一段。后来我们才发现可以直接用go指令更方便地直接进行跳转,不过这一段文件头因为可以兼容两种启动方式就保留了下来。 -
CPU 配置:VIsionFive 2 所使用的 JH7110 处理器有四个 64 位 RISC-V CPU(支持 rv64gc,编号为1-4)和一个 32 位 RISC-V CPU(支持rv32imfc,编号为0),因此 U-Boot 不会在 0 号核上启动,ArceOS 也无法在它上面运行。然而 ArceOS 许多设计都假定 cpuid 从 0 开始,我们把 cpu id 从原始的 1-4 映射到 0-3 来解决这个问题。
-
存储设备驱动:Simple SD/MMC Driver