为什么 Linux 与 RISC-V 是天作之合?
引言
各位朋友,大家好,欢迎回到《Inside Computing》。
过去三十多年里,Linux 改变了整个软件世界。
今天,大多数网站服务器、云计算平台、超级计算机、网络设备,以及无数嵌入式系统,背后都运行着 Linux。
Linux 已经证明,一个开源操作系统,不但可以与商业操作系统竞争,在很多领域甚至可以做得更好。
但是,这里一直存在一个重要的限制。
软件虽然是开放的,但软件下面运行的处理器,通常并不开放。
大多数个人电脑和服务器使用 x86 架构。
大多数智能手机和嵌入式设备使用 ARM 架构。
这两种架构都非常强大,也非常成熟。
但是,它们主要掌握在少数公司手中。
后来,RISC-V 出现了。
RISC-V 是一种开放的指令集架构。
一个开放了软件与处理器之间的硬件接口。
另一个开放了完整的软件平台。
这就是为什么很多人认为,Linux 与 RISC-V 是天作之合。
但是,它们为什么如此适合彼此?
所谓“开放”,是不是意味着所有 RISC-V 处理器都是完全开源的?
接下来,我们就来仔细分析。
第一章:RISC-V 到底开放了什么?
首先,我们需要纠正一个常见误解。
RISC-V 并不意味着所有 RISC-V 处理器都是完全开源的。
RISC-V 真正开放的是指令集架构,也就是 ISA。
指令集架构规定了处理器能够理解的基本语言。
它定义了处理器能够执行哪些指令。
例如:
把两个数字相加。
从内存中读取数据。
把数据写入内存。
比较两个数值。
跳转到另一条指令。
我们编写的每一个程序,最后都必须被翻译成机器指令,处理器才能真正执行。
在 x86 世界中,指令集主要由 Intel 和 AMD 控制。
在 ARM 世界中,企业通常需要从 Arm 公司获得架构授权,或者获得现成处理器设计的授权。
RISC-V 采用了不同的方式。
它的指令集规范是公开的。
大学、初创企业、大型公司,甚至个人研究人员,都可以根据 RISC-V 标准设计自己的处理器。
他们不需要从头发明一套全新的软件架构。
但是,这颗处理器的具体设计,仍然可以是私有的。
一家企业可以使用开放的 RISC-V 指令集,同时不公开自己的流水线设计、缓存结构、分支预测器,以及芯片的物理实现。
所以最准确的说法是:
RISC-V 是一种开放指令集。
一颗 RISC-V 处理器可以是开源的,但它不一定必须开源。
即使如此,开放指令集仍然具有非常重要的意义。
因为它开放了软件与处理器之间最关键的接口。
第二章:Linux 天生具有可移植性
Linux 是 RISC-V 非常理想的合作伙伴,因为 Linux 从来不是只为一种处理器设计的。
今天,Linux 可以运行在很多处理器架构上。
包括:
x86。
ARM。
PowerPC。
IBM Z。
LoongArch。
以及 RISC-V。
Linux 为什么能够做到这一点?
原因在于,Linux 内核把通用操作系统功能,与处理器相关代码分开了。
Linux 内核的大部分代码,可以在不同处理器架构之间共享。
例如:
进程调度。
文件系统。
网络协议。
设备管理。
安全机制。
内存分配。
这些功能在不同处理器上,基本都可以使用相同的 Linux 内核代码。
只有最底层的部分,需要针对不同处理器架构进行适配。
例如:
系统启动。
中断处理。
页表操作。
上下文切换。
原子操作。
系统调用入口。
因此,当 RISC-V 出现以后,开发者不需要从头编写一个全新的操作系统。
他们只需要向 Linux 内核加入与 RISC-V 相关的底层架构支持。
一旦这些工作完成,RISC-V 就可以直接继承 Linux 几十年来积累的软件成果。
它可以使用 Linux 的网络功能。
可以使用 Linux 文件系统。
可以使用 Linux 的安全机制。
可以使用 Linux 开发工具。
可以使用 Linux 容器。
还可以运行成千上万的开源应用程序。
这就是 RISC-V 最大的优势之一。
它不需要从零开始建立一个完整的软件世界。
因为 Linux 已经提供了这个软件世界。
第三章:RISC-V 是模块化的
Linux 和 RISC-V 还拥有一个非常重要的共同点。
它们都非常灵活,而且具有模块化设计。
RISC-V 并不是一套庞大而且完全固定的指令集。
它首先提供一个很小的基础指令集。
然后,处理器设计人员可以根据实际需要,加入不同的标准扩展。
例如:
M 扩展增加乘法和除法指令。
A 扩展增加原子操作。
F 和 D 扩展增加浮点运算。
C 扩展增加压缩指令。
V 扩展增加向量处理能力。
H 扩展增加虚拟化支持。
一颗简单的嵌入式处理器,可能只需要很少的扩展。
而一颗服务器处理器,可以加入向量指令、虚拟化、高级内存管理,以及很多其他功能。
因此,RISC-V 可以从很小的控制器,一直扩展到功能强大的应用处理器。
Linux 同样具有这种扩展能力。
一台小型嵌入式设备,可以运行一个非常精简的 Linux 系统。
而一台云服务器,可以运行完整的 Linux 发行版。
它可以运行容器、虚拟机、数据库,以及大型存储系统。
这使 Linux 与 RISC-V 的组合非常有吸引力。
RISC-V 提供处理器基础。
第四章:Linux 为 RISC-V 提供了真正的软件生态
一套处理器架构,如果只有指令集,本身并没有太大用处。
它还需要编译器。
需要调试器。
需要系统库。
需要操作系统。
也需要各种应用程序。
而 Linux 可以把这些部分连接到一起。
RISC-V 开发者可以使用 GCC 和 LLVM 编译软件。
可以使用 GDB 调试程序。
可以使用标准 C 语言库。
可以运行 Shell、文本编辑器、服务器软件、数据库和各种开发工具。
开发者还可以使用 QEMU,在真实硬件出现以前,测试 RISC-V 软件。
这一点对于一个新的处理器架构尤其重要。
硬件开发需要很长时间。
一颗芯片从设计、验证、制造,一直到最终上市,可能需要几年时间。
但是软件开发者并不一定需要一直等待。
通过 QEMU,他们可以提前测试 Linux 内核、编译器、系统库和应用程序。
这样可以缩短硬件开发与软件开发之间的时间差。
Linux 还让已有的开源项目,更容易支持 RISC-V。
很多程序本来就支持 Linux。
只要源代码具有良好的可移植性,通常只需要很少修改,就可以重新编译成 RISC-V 版本。
这比为一个新处理器重新建立完整的软件生态,要容易得多。
第五章:RISC-V Linux 是怎样启动的?
一个典型的 RISC-V Linux 系统,会经过多个启动阶段。
不同平台的具体过程可能有所不同。
但一个常见的启动顺序是:
首先,处理器从 Boot ROM 开始运行。
然后加载 OpenSBI。
接下来,系统可能启动 U-Boot 或 UEFI。
最后,引导程序加载 Linux 内核。
Linux 内核启动以后,再运行最初的用户空间系统。
在这些组件中,很多人最不熟悉的可能就是 OpenSBI。
RISC-V 定义了不同的特权级。
Machine Mode,也就是机器模式,是最高特权级。
Supervisor Mode,也就是监督模式,通常由操作系统内核使用。
User Mode,也就是用户模式,由普通应用程序使用。
Linux 内核通常运行在监督模式。
但是有些非常底层的操作,Linux 仍然需要更高权限固件的帮助。
例如:
启动另外一个 CPU 核心。
设置系统定时器。
发送处理器核心之间的中断。
或者控制平台的电源功能。
Linux 会通过 Supervisor Binary Interface,也就是 SBI,发送这些请求。
OpenSBI 是 SBI 接口中最常见的开源实现之一。
你可以把 OpenSBI 理解成一座桥梁。
它连接 Linux 内核与最底层的机器固件。
所以,简化后的启动流程就是:
硬件。
然后是 OpenSBI。
然后是引导程序。
接下来是 Linux 内核。
最后进入用户空间应用程序。
这种分层设计,可以让不同的 RISC-V 平台使用更加统一的软件模型。
第六章:两个社区都重视上游开发
Linux 和 RISC-V 能够很好地结合,还有另一个重要原因。
两个社区都非常重视上游开发。
在 Linux 社区中,上游开发意味着把代码提交到官方主线项目。
这比把重要驱动程序和内核补丁,保存在厂商自己的私有仓库中要好得多。
一家芯片公司可以为自己的处理器制作一个特殊版本的 Linux。
短期来看,这种方法可能可以正常工作。
但是,如果这些修改永远无法进入 Linux 主线内核,这家公司就必须独自维护所有代码。
每当 Linux 发布一个新版本,就可能产生新的代码冲突。
安全更新也会变得更加困难。
驱动程序会逐渐过时。
用户也会一直依赖某一家厂商。
当 RISC-V 公司把自己的硬件支持提交到上游项目以后,情况就会得到改善。
它们的驱动程序可以成为 Linux 主线内核的一部分。
其他开发者可以审核代码,并帮助改进。
未来的新版本 Linux,也更容易继续支持这些硬件。
这种开放协作模式,是 Linux 能够长期成功的核心原因之一。
对于 RISC-V 的长期发展来说,它同样非常重要。
开放规范当然很有价值。
但是,开放规范再加上完整的上游软件支持,力量会更加强大。
第七章:为什么这种组合非常重要?
Linux 与 RISC-V 的结合,在很多方面都具有重要意义。
第一,它可以改善计算机教育。
学生可以学习从 C 语言代码开始,经过编译器输出、RISC-V 汇编、机器指令、Linux 系统调用,最后到处理器执行的完整过程。
第二,它有利于嵌入式开发。
企业可以设计定制的 RISC-V 系统。
然后使用 Linux 管理驱动程序、网络、存储、安全和应用程序。
第三,它有利于技术研究。
编译器工程师、操作系统开发者和处理器设计人员,都可以在一个开放架构上测试新的想法。
第四,它可以提高供应链的多样性。
不同国家和不同企业,都可以设计兼容的处理器,而不必完全依赖某一个指令集所有者。
但是,我们也必须保持现实。
开放指令集,并不会自动带来一颗高速处理器。
处理器性能仍然取决于很多因素。
例如:
流水线设计。
分支预测。
缓存架构。
内存控制器。
芯片制造工艺。
以及编译器优化。
RISC-V 也不会自动解决芯片制造、GPU 支持、先进封装和软件兼容性等问题。
RISC-V 开放的是一个关键接口。
剩下的整个生态,仍然需要继续建设。
结论
那么,Linux 与 RISC-V 为什么如此适合彼此?
因为 RISC-V 开放了软件与处理器之间的接口。
GCC 和 LLVM 把源代码转换成 RISC-V 机器指令。
OpenSBI 和引导程序,把底层硬件连接到 Linux 内核。
QEMU 让开发者可以在真实硬件准备好以前,就开始开发和测试软件。
开源社区则帮助驱动程序、开发工具和平台支持进入上游项目。
Linux 为 RISC-V 提供了完整的软件基础。
RISC-V 则为 Linux 提供了一种新的硬件架构。
这种架构不像传统的商业指令集那样,被少数公司完全控制。
Linux 与 RISC-V 的组合非常强大。
但是,这个故事仍然在发展之中。
现在的问题已经不再是:
RISC-V 能不能运行 Linux?
答案是,它当然可以。
真正的问题是:
RISC-V Linux 的软件生态有多成熟?
哪些 Linux 发行版已经支持 RISC-V?
现有 RISC-V 硬件的性能和体验怎么样?
RISC-V 最终能不能与 x86 和 ARM 竞争?
这些问题,我们将在下一期视频中继续讨论。
感谢大家观看,我们下期再见。
