0%

洛佳:K210组RustSBI开发总结

我在第二个月的时间里完成了RustSBI很多部分的开发。它已经能运行rCore-Tutorial,并且支持qemu、K210
两款硬件平台。希望未来的时间里,我能为RustSBI编写更多平台的支持,也为丰富社区项目做一些贡献。

SBI是什么

SBI是操作系统的引导程序和运行时。机器上电时,SBI将配置环境,准备设备树,最终将引导启动操作系统。
操作系统需要访问硬件或者特殊的功能,这时候就需要通过ecall指令陷入M层的SBI运行时,由SBI完成这些功能再提供。
SBI的实现体现了RISC-V层级和模块化的开发特点,我们可以方便地更换SBI实现,无需重装操作系统,就能支持M层不同的功能,
比如无盘机、网络启动和管理等等,都是更高级的SBI实现能完成的。

SBI是一个标准,实现这个标准有很多款软件。OpenSBI就是其中的一款实现。本次实验使用Rust编写不同于OpenSBI的实现,
命名为RustSBI,希望从SBI到操作系统统一工具链,方便用Rust写操作系统的开发工作。
Rust在嵌入式上强大的生态也能让RustSBI受益,在工程上,我们可以方便地使用相关的库来编写新的SBI支持,
库已经是证明可用的,就无需自己反复调试。这能加快后续嵌入式开发、操作系统开发的开发过程。

目前的SBI标准还不包括特定具体的硬件,都是一些抽象的内容。未来需要观察新版本SBI标准的内容,
最终它会做成包罗万象的硬件抽象,还是朴实而简单的最小抽象,这需要社区共同寻找方向。

程序框架

可能需要了解RustSBI项目的全貌,就需要知道这些内容。包含这样的内容:

  • 公用基础库部分
  • 针对芯片的支持部分

公用部分就包括与SBI、RISC-V标准紧密相关的功能。这包括ecall指令的处理逻辑、下降到S特权级或者未来的U特权级的逻辑。
还有简单的数据结构,比如类似于位集(bitset)的类,用来读取哪些硬件线程是需要被处理的。
需要注意的是,单独的公用部分只是一个库,它不是二进制目标,不能直接编译到目标机器上,而是作为积木,
组成下文要讲的芯片的支持部分。

针对芯片的支持部分是运行时库具体实现的部分。这些都要编译到二进制的Rust编译目标,直接烧录到机器上,或者放入模拟器以便运行。
这些支持部分包括一些兼容性设计,比如在1.9.1版本的K210上运行1.11的操作系统,就需要这样的设计。
这个部分将调用riscv、riscv-rt等库,操作RISC-V架构的一些细节内容。

兼容性设计

K210这个芯片是RustSBI将要支持的目标。我们发现,K210芯片是基于1.9.1版本的标准的,可是最新的特权级标准已经是1.11,
有非常大的差别,下面要一一介绍这些差别,还有兼容性实现的方法。

1.9版本的虚拟内存和1.11版本都有相似的页表设计,但配置它们所在的寄存器是不一样的。
1.9版本中,需要在mstatus.VM寄存器里选择页表标准;但到了1.11它放在satp寄存器里面。1.9里面使用sfence.vm指令,
然而1.11里使用了sfence.vma,后者能多带一个ASID参数,而且二进制编码和前面的不同。
我在这段代码里给出了兼容性的解决方法。
这个代码里,每当使用sfence.vma刷新页表,我都执行sfence.vm指令来代替不存在的新版本指令,并且把特定的页表选项写进mstatus.VM里面。
这样就能运行旧版本的虚拟内存了。

1.11版本里有单独的页异常,然而在1.9里它们是被合并到访问异常里面的。
这就需要在我们前面的异常委托里做一些处理,操作系统里可能也需要一些处理。
1.9.1里并不存在S层的外部中断,这也需要我们在SBI里做一些兼容性支持。

SBI的兼容性设计可以延长芯片的生命周期,如果未来的芯片包含特定的外设,那么利用这些外设,芯片能支持更久更新的设计。
这样的外设可能包括,读写CSR产生特定的外部中断,这样就能在SBI层拦截CSR读写的内容,就能做兼容性设计了。

未来能做的事情

首先RustSBI是一个SBI实现,我们需要找到一个方法,测试SBI实现本身是否符合标准。
这可能通过自定义的测试框架之类的方法去实现。如果OpenSBI和RustSBI都通过这个框架的测试,说明RustSBI对标准的兼容性是有保证的。
实现起来可能比较细碎,需要一定的思考量。

未来SBI上可以做一些核的监视内容。目前还是通过跨核软中断实现多核的,未来应当通过硬件线程监视器也就是HSM模块完成多核支持。
这个模块需要SBI运行时做一定的调整,需要未来再继续做。

我去年曾收到一款NXP公司的芯片样品。这个芯片里面它有四个核,每个核的指令集都各不相同,其中有两个核是RISC-V指令集,
它们是不同的“IP核”。这样的芯片上如果能运行类似于RustSBI的软件,那会增强我们在异构计算上使用Rust和RISC-V的信心。
还有两个核是ARM核。不知道未来SBI标准会仅限于RISC-V平台,还是扩展到更多的平台上去。
虽然它是只有M和U特权的嵌入式芯片,但它的外设非常丰富,从蓝牙、USB主机到信用卡磁条识别器几乎都有,
应该属于这个公司用来试验外设的样片。我可以继续探索如何为它支持各种各样的外设。我已经写了一部分工作在这里