访谈 | RustSBI 作者讲述 RISC-V 开源固件的精彩开发历程

语言: CN / TW / HK

「编者按」泰晓科技 Linux 技术社区正在开设一个人物或项目访谈栏目,诚邀 Linux 内核以及周边技术的开发者分享他们与开源的精彩故事。本期访谈,社区很荣幸邀请到了 RustSBI 的作者洛佳老师,由他来分享他用 Rust 开发 RISC-V Bootloader 的故事。本次访谈由晓怡主持与整理,   Ro gina 校订, 由社区负责人吴章金老师指导。

背景简介

RISC-V 是当前 “红得发紫” 的处理器架构,被国内外各大企业和科研院校热捧。

RISC-V Logo

RISC-V 之所以这样受追捧,得益于它完全开放的指令集架构和后发带来众多 “前车之鉴” 的先天性优势,这种开放性和后发优势吸引到的众多优秀个人与团队又进一步加速了 RISC-V 的发展进程。如今的 RISC-V,各种新的处理器型号不断迭代流片,各种系统与软件开发和适配工作正热火朝天,一幅蒸蒸日上的画面,乐观一点来看,预计在 3-5 年内有潜力逐步从 AIoT 推广到桌面和服务器等领域。

如今的 RISC-V 开源处理器,比之十年前的开源操作系统 Linux,有着诸多相似之处,而另外一个与它们极其相似的是开源编程语言 Rust。
Rust 同样是站在其他编程语言的肩膀之上推陈出新的全新编程语言,有诸多的优点,安全是其中很重要的特性,而今天咱们要介绍的 RustSBI 就是完全用 Rust 语言编写的,用于 RISC-V 处理器架构的 固件和引导程序,而这个程序通常用于启动 Linux 等操作系统,它运行在 RISC-V 处理器之上,用于引导 Linux 并为 Linux 提供 SBI 服务。

SBI 是 RISC-V 定义的一套 Supervisor Binary Interface,规范了运行在 Supervisor Mode 的操作系统调用底层 Machine Mode 服务的方式,而 RustSBI 是 SBI 标准的一种 Rust 语言实现,是 RISC-V SBI 规范标准中收录的实现之一。截止到本次访谈发表,RustSBI 已支持 SBI 标准 v1.0。

咱们今天邀请到的嘉宾洛佳老师刚刚上研一,他于本科期间就从零编写 RustSBI 软件,我们能找到的最早一笔提交记录是 10 Jul 2020。RustSBI 不仅支持 QEMU,也可以运行在包括 K210、D1 和 hifive-unmatched 等真实硬件上。

访谈实录

「洛老师好,记得上半年社区有邀请您做了题为《RISC-V 引导程序环境:应用&规范》 的直播分享,今天又很荣幸邀请到您来分享 RustSBI 的最新状态,非常感谢。在讨论具体技术之前,您方便简要介绍一下自己以及目前的学习与工作状态吗?」

我是洛佳,目前在华科的网安学院做软硬件协同防御,做的事情以安全为主,本科的时候我也是安全专业的学生,写固件和内核是业余爱好。

「我们了解到您在很多同学还在按部就班上课的时候,就开始了 RustSBI 的编写,是有怎样的机缘巧合开启这个开源项目的呢?」

RustSBI 项目是我在鹏城实验室开始做的项目,当时是为了解决 K210 这款芯片运行新版本 RISC-V 指令集内核的需求诞生的。固件作为裸机和内核的媒介,它可以通过“指令仿真”的方式来兼容老的硬件。

在上述项目开发过程中,我逐渐意识到当时 RISC-V SBI 固件接口的软件实现源码过于复杂,于是决定重新写一遍这个软件。另外,在编程语言选择方面,当时有了解到 Rust 语言在内存安全上总结了相当多的工程经验,被很多工程实践证明它是一门可以良好用于嵌入式领域的编程技术。而固件也是嵌入式应用,我之前又恰好在 Rust 嵌入式开发上积累了一些经验。这样我就很自然地把 Rust 编程语言和 RISC-V SBI 固件接口结合起来,逐渐启动了 RustSBI 项目的开发。

「RustSBI 这样一个项目牵涉到诸多新技术,比如 RISC-V 处理器,又比如 Rust 编程语言,作为一个在校的本科生开发者,这一过程带来了什么样的挑战、投入和收获呢?」

最大的挑战在于评价体系和课程上,比如我们计算机学院的课堂那会仍然是使用 16 位汇编和八十年代的 C 语言标准开设的,高级语言概念迥异,这些课程对学习 Rust 语言的帮助非常小。在那个时候,学习 Rust 语言几乎不能让我进入任何的学校比赛战队和实验室,也无法从学校对比赛的支持中获益,这一点最终在系统能力大赛对 RISC-V、Rust 语言的包容中是有所改观。

在本科阶段, 我很幸运地从 Rust 语言社区得到了足够的帮助。Rust 社区的交流非常活跃,社区伙伴交流的通常是最靠近市场的需求和工程技术,也有朋友乐于分享最前沿的学术知识。我发现在 Rust 语言的聊天主题下大家都会提供一些有帮助的建议。这些建议对于我在嵌入式 Rust 方面的开发非常宝贵。嵌入式开发是需要实际的硬件设备去验证的,联系厂商能得到大量对实际开发过程的帮助,这些帮助涵盖 Rust 和 RISC-V 等方面,这也是值得一提的收获。

在开发 RustSBI 的同时,我也参与到编程语言本身和相关的引导程序生态中。比如, 我为 Rust 语言的平台支持模块贡献了代码,完善的自旋提示函数也已经被合并到 Rust 标准库中。 除此之外,我也为 Oreboot 引导程序贡献了编译框架代码,重构了 Oreboot 项目,期间还有幸结识了欧洲开源固件社区的伙伴,并且为 Oreboot 在多款 RISC-V 芯片的支持工作做出了良好的铺垫。 Oreboot 项目算上前身有十九年的历史,把它整理井井有条是有一定难度的事情,也要特别感谢海量的社区朋友参与验证工作。

「RISC-V SBI 有哪些知名的开源实现?在这些实现中,咱们研发的 RustSBI 有什么独特和先进之处?又有哪些不足?对于潜在的不足,有哪些方面的改进计划呢?」

RISC-V SBI 的开源实现有 RustSBI、Coffer 和 O 开头的 SBI 实现等等。 RustSBI 在设计上或许没有先进的地方,但是它周边的 Rust 生态都非常安全和成熟,能够促使最终的软件解决方案向安全性上靠拢。 RustSBI 的接口和实现是分离的,我故意将它设计成这种方式,是为了避免非技术因素对开源软件的影响,能更好地体现软件开源本质。得益于这种设计, 厂商可以制作自己的 RustSBI 固件,而无需担心上游是否会接受,这有利于开发可控的固件产品。

作为一个开放的软件,RustSBI 会给开发者更多的空间。安全环境固件、调试固件等等,都是允许厂商和研究团队自由发挥的部分。开发者可以毫无拘束地编写创新性好的功能,这是 RustSBI 能给人带来最自由的地方。

RustSBI 目前的不足在于它缺少商业宣传,有竞争对手开发的同类软件在设计与实现还不如 RustSBI 的前提下,商业宣传反而非常成功。这也是我从研发该项目以来发现的一个重要的不足点,这方面我正在和各个厂商和社区沟通,希望增强厂家的固件可控和安全性意识。在竞争对手的商业话术下,固件看上去显得“不重要”,从而达成他们隐形地占领整个市场的目标,这对固件生态是非常不利的。希望未来我能在更多领域发掘和推广,唤起所有人对固件开发重要性的认识。

另一点需要提到的是,RustSBI 要改进的地方在于没有很好参与到厂家芯片的开发流程中。 厂家愿意在芯片开发完成后提供 Rust 支持,但在 DDR 等外设适配过程中,仍然会使用 Rust 语言之外的技术体系。 厂家目前会默认开发者只使用某一款引导程序,而忽视了固件的多样性和自主开发固件的重要性,这依然是目前 RustSBI 推广的阻力。

「RustSBI 作为一款开源软件,目前的社区开发与协作情况如何?开发与更新强度大吗,能兼顾好学业和项目的维护吗?有哪些方面需要更多的同学参与和支持?比如资金与测试工作等方面。」

目前来看 RustSBI 的贡献者主要来自高校的研究团队。研究团队根据自制内核和固件功能的初衷,完善周边的开源固件生态。厂商的协作也正在开始,这主要出自于厂商对推广生态链的诉求,和自主研发意识的产生和发展。我和朋友们乐于见到来自清华大学、浙江大学和更多科研机构的朋友对 RustSBI 生态的贡献,以及很乐意看到来自全国各地的全国大学生系统能力竞赛参赛队员使用 RustSBI 来支持战队的参赛作品。

RustSBI 在接口和实现分离的架构形成后,开发的模块划分已经明确,有助于厂商和社区大胆地设计代码,这方面其实一定程度上降低了 RustSBI 抽象库的开发难度。我认为如果要开发具有生态的项目,早期应当在方向上多设想,这样就能减少后期较大项目维护的难度。维护通常只需要检查逻辑即可,安全问题由语言本身的机制保障,节省了思考量。在 Rust 语言模块化开发和良好的生态下,一个本科生只用业余时间就能主持整个开源项目的维护工作,这是良好的编程语言技术给人类带来的便利,这在以前的编程语言技术下是不容易达到的。

开源项目和研究团队的兴趣结合将会是美好的事情,这些时候就容易吸引研究员和本科生参与,从校企合作项目中受益的同时,也容易将开源项目推广到更多的地方。无论哪种难度的工作都应当认真对待,这是开源项目吸引参与者的本源。经常和厂家沟通,可以拿到需要的测试用机器,这比资金支持对工作更有推进力。操作系统平台的支持工作仍然是需要大量测试的地方,这部分可以作为很好的科研实习项目。

「请问目前有哪些实际的硬件产品在使用 RustSBI?咱们有比较明确的适配计划吗?企业界对 RustSBI 的支持度现在怎么样?咱们有面向企业的商业服务计划吗?」

使用 RustSBI 的产品从单板计算机到服务器都有,已经公开的平台来看,从新的 D1 到较老的 K210、FU740 都有开发专项,但是支持程度各有不同,并且附有详细的文档。项目已经发展了两年,在物联网、能源领域已经有较好的应用,并且在开源项目的 star 数上超过所有竞争对手的总和。在项目发展的第三年,我希望和更多的主板厂商沟通,将 RustSBI 作为首先支持的固件接口;希望和更多学术团体沟通,让 RustSBI 成为固件领域科研的选项之一。在项目发展的第一个五年,我希望 RustSBI 能在 RISC-V 固件市场拥有 50% 的市场占有率,并且成为新设备开发、研发阶段的首选固件接口。

虽然企业实际使用 RustSBI 的信息需要等到企业发布产品后才能披露,但可以肯定的是,有越来越多的企业在考虑给自己的芯片增加 Rust 嵌入式开发支持,这个趋势对于固件开发是极其有利的。企业提供了调试接口、烧录软件后,固件开发的进程会如虎添翼。我们乐于见到通用计算、无线通信、网络基础设备、电源变换等领域的企业朋友共同合作,我和朋友们会继续联系企业界包括 CPU 在内的各类芯片生产商,在裸机开发开放的平台下,逐渐展开对更多企业芯片的支持工作,让固件成为芯片行业设计创新的一部分。

RustSBI 社区是百花齐放的集体,它不通过非技术规则限制参与的社区各方。对企业芯片的支持工作可能需要社区成员在交流中共同完成。对创新性较好的固件功能,企业可和社区的科研团队共同攻关,完成最终的客户需求。

「最后一个问题,对于打算学习 RustSBI 的同学,有哪些具体的建议和步骤呢?有撰写纸质书籍或者开设培训课程的计划吗?」

分开发和测试。开发固件要考虑固件也是嵌入式应用,从嵌入式 Rust 开始学起,了解内核需要哪些接口。测试要用完整的内核去测固件,要能运用 RustSBI 提供的 sbi-tests 测试套件。如果需要高级的固件功能,应当了解对应的测试套件或者开发方法。从现有的项目框架入手,很快就能上手编写简单的 RustSBI 固件。芯片越简单,固件也越简单,所以固件开发也对“一生一芯”项目和其他自己流片的同学非常友好。

目前 RustSBI 的核心概念大致成型,但是完整的生态还需要更多厂家、社区的参与。在生态逐渐完善后,我们收集已有的技术文档,就可以编写为对应的书籍了。固件运行内核和内核运行应用是相似的,如果要入门固件开发,内核开发的课程会有很大的帮助,比如可以参考清华的 rCore 操作系统课程,而专门针对 RustSBI 的课程可能需要和产业界相互适应之后慢慢再考虑推出。

尾声

非常感谢洛老师接受今天的访谈,祝学业顺利,也祝 RustSBI 项目取得更大的成功。

正如洛老师上面的分享所提到的:“ 固件作为裸机和内核的媒介 ”。它运行在处理器的最高层级特权模式,除了能为操作系统内核提供裸机的功能访问接口以外,还可以实现“指令仿真”、外设访问等其他复杂的功能。因此,除了要关注 Rust 擅长的软件安全特性以外,运行在更高级别特权模式的固件本身的开放性和透明性对于数据安全也非常重要,值得引起大家的重视。

在整个 RISC-V 芯片的开放生态中,我们很高兴看到有越来越多的国内软硬件团队或者个人参与其中,足迹遍及 RISC-V 芯片、操作系统、编译器、模拟器、固件与引导程序等诸多领域,而且不少工作都是原创性的甚至是基础设施级别的。这些开放性的工作以及与之相应的跨技术栈、跨地区的交流碰撞,不仅能给整个行业带来越来越多优秀的开发成果,而且也有利于技术深度的挖掘,有利于技术栈的打通和融会贯通以及由此带来的潜在技术突破,因此, 有利于整个行业的健康发展

非常乐见,在 RISC-V + Linux + Rust 等开源软硬件的高度融合趋势下,各类开源项目不断创建而且是百花齐放,各类人才不断从高校与社区中如雨后春笋般冒出来,整个行业的技术氛围也因此越来越浓厚。

接下来,泰晓科技 Linux 技术社区计划于每周五发布一期人物或项目访谈,访谈对象为 Linux 内核以及周边技术社区的开发者,敬请期待,记得关注哦!

左下角 阅读原文 ,可直接访问 RustSBI 项目代码仓库。