rCore Tutorial v3 是基于 RISC-V 特权级架构 1.10 版本来开发的。我们采用的真实硬件平台 Kendryte K210 基于 RISC-V 特权级架构 1.9.1 版本(2016 年),目前已经不被当前主流编译工具链所支持了。麻烦的是,RISC-V 特权级架构 1.9.1 版本和1.10版本确实有很多不同。为此,RustSBI 做了很多兼容性工作,使得基于RISC-V 特权级架构 1.10的系统软件几乎可以被不加修改的运行在 Kendryte K210 上。在这里我们先简单介绍一些开发板相关的问题。
K210 的内存是由 CPU 和 KPU 共享使用的,如果想要 CPU 能够使用全部的 8\text{MiB} 需要满足三个条件:
- KPU 不能处于工作状态;
- PLL1 必须被使能;
- PLL1 的 clock gate 必须处于打开状态。
否则, CPU 仅能够使用 6\text{MiB} 内存。
我们进行如下操作即可让 CPU 使用全部 8\text{MiB} 内存(基于官方 SDK):
sysctl_pll_enable(SYSCTL_PLL1);
sysctl_clock_enable(SYSCTL_CLOCK_PLL1);
默认情况下,K210 的 CPU 频率为 403000000 ,约 400\text{MHz} 。而计数器 mtime
CSR 增长的频率为 CPU 频率的 1/62 ,约 6.5\text{MHz} 。
K210 有完善的 SV39 多级页表机制,然而它是基于 1.9.1 版本特权级架构的,和我们目前使用的有一些不同。不过在 RustSBI 的帮助下,本项目中完全看不出 Qemu-5.0.0(特权级架构 1.10)和 K210( 特权级架构 1.9.1) 两个平台在这方面的区别。详情请参考 RustSBI 的设计与实现 的 P11 页的内容。
K210 的 S 特权级外部中断不存在(被硬件置为零),因此任何软件/硬件代理均无法工作。为此,RustSBI 专门提供了一个新的 SBI call ,让 S 模式软件可以编写 S 特权级外部中断的 handler 并注册到 RustSBI 中,在中断触发的时候由 RustSBI 调用该 handler 处理中断。详情请参考 RustSBI 的设计与实现 的 P12 页的内容。