选好了RISC-V芯片,接下来要面对的问题很现实:跑什么操作系统?软件生态能不能支撑项目开发?这是很多从ARM迁移到RISC-V的开发者最关心的环节。

RISC-V的软件生态在过去三年进步显著,但和ARM相比仍有差距。这篇文章从Linux主线支持、RTOS选型、编译器工具链、关键软件库四个维度,梳理RISC-V软件生态的现状和工程实践中的关键考量。

一、Linux主线支持:生态成熟度的分水岭

对于需要跑Linux的RISC-V芯片,主线内核支持(upstream mainline)是最重要的生态指标。主线支持意味着芯片的驱动代码已经合入Linux官方内核,后续的内核升级、安全补丁都能直接受益,不需要自己维护补丁分支。

RISC-V的Linux主线支持进展很快。RISC-V架构端口在2019年合入Linux 5.0内核,此后每个版本都在完善。到2024年,主流的RISC-V芯片(包括带MMU的应用处理器)基本都有主线支持。SBI(Supervisor Binary Interface)规范作为RISC-V特有的固件接口层,也在主线内核中有完整实现。

但"有主线支持"和"好用"之间还有距离。一些芯片的特定外设驱动(比如GPU、NPU、专用加速器)可能还在厂商的内核分支中,没有合入主线。选型时需要确认:芯片的基础功能(UART、GPIO、以太网、USB)是否主线支持,专用外设是否需要厂商补丁。

Linux发行版方面,Ubuntu、Fedora、Debian都提供了RISC-V版本。Ubuntu的RISC-V支持走得比较靠前,已经发布了多个正式版本。Fedora也有RISC-V的官方spin。这些发行版包管理器的软件仓库中,大部分常用软件都有RISC-V二进制包,但一些闭源商业软件(比如某些数据库、虚拟化平台)还没有RISC-V版本。

对于嵌入式Linux场景,Buildroot和Yocto是主流的根文件系统构建工具。两者对RISC-V的支持都比较成熟,可以定制裁剪出适合目标芯片的最小系统。Buildroot上手简单,适合快速原型;Yocto功能强大但学习曲线陡,适合产品化项目。

二、RTOS选型:FreeRTOS、Zephyr、RT-Thread的RISC-V适配

对于不需要跑Linux的嵌入式场景,RTOS是标准选择。RISC-V在RTOS领域的生态比Linux更成熟,因为RTOS的内核相对简单,移植工作量小。

FreeRTOS是最广泛使用的嵌入式RTOS,对RISC-V的支持非常完善。官方内核已经内置RISC-V端口,支持RV32和RV64,支持M/U特权级。FreeRTOS的RISC-V移植主要是中断处理和上下文切换的实现,利用RISC-V的ecall指令做系统调用,利用mtvec寄存器设置中断向量。这个移植工作多年前就完成了,稳定性经过大量项目验证。

Zephyr是Linux基金会旗下的开源RTOS,架构比FreeRTOS更现代,支持更丰富的协议栈(Bluetooth、WiFi、MQTT等)。Zephyr对RISC-V的支持是一等公民级别的,CI/CD流程中有RISC-V的持续测试。Zephyr的设备树(Device Tree)机制和Linux一致,从Zephyr迁移到Linux(或反过来)的设备描述可以复用。

RT-Thread是国内使用广泛的开源RTOS,对RISC-V的支持也比较完善。RT-Thread的优势在于中文社区活跃、文档齐全、组件生态丰富(GUI、文件系统、网络协议栈)。对于国内团队,RT-Thread的技术支持响应速度通常比国际开源项目更快。

选型建议:如果项目需要丰富的协议栈和现代架构,选Zephyr;如果团队熟悉FreeRTOS且项目简单,FreeRTOS够用;如果团队在国内、需要快速技术支持和中文文档,RT-Thread是务实的选择。

三、编译器工具链:GCC与LLVM的RISC-V支持

编译器是软件生态的基础。RISC-V的编译器支持经历了从"能用"到"好用"的过程。

GCC的RISC-V后端由SiFive等公司主导开发,目前已经非常成熟。主流GCC版本(GCC 12+)对RV64GC的支持完整,对RVV向量扩展的支持也在快速完善。GCC的RISC-V优化选项(-march、-mabi、-mtune)可以精细控制代码生成,针对不同微架构做调优。

LLVM/Clang的RISC-V支持进展也很快。LLVM的RISC-V后端在LLVM 15+已经比较稳定,对RVV的支持甚至在某些方面比GCC更超前(因为LLVM的向量中间表示更灵活)。LLVM的优势在于模块化架构,更容易集成自定义扩展的编译支持。

交叉编译环境搭建是实际开发的第一步。常用的方案有:直接使用芯片厂商提供的预编译工具链(通常基于GCC,做了芯片特定的优化);使用bootlin等第三方提供的预编译工具链;自己从源码编译GCC/LLVM(灵活但耗时)。

一个容易踩的坑是ABI选择。RISC-V有LP64和LP64D两种主要ABI(64位场景)。LP64D把浮点参数通过浮点寄存器传递,性能更好但要求硬件有浮点单元;LP64把浮点参数通过整数寄存器传递,兼容性更好但性能略低。选型时要和芯片的浮点配置匹配,混用会导致链接错误。

四、关键软件库与框架的RISC-V适配

除了操作系统和编译器,项目依赖的软件库和框架的RISC-V适配情况直接影响开发效率。

开源库方面,大部分主流开源项目已经支持RISC-V。OpenSSL、libcurl、zlib、SQLite等基础库都有RISC-V二进制包或可以从源码编译。Python、Node.js、Go等运行时环境也有RISC-V端口。这意味着大部分服务端应用可以相对顺利地迁移到RISC-V平台。

AI/ML框架方面,TensorFlow Lite Micro对RISC-V的支持比较完善,可以直接在RVV上跑推理。PyTorch的RISC-V支持还在早期阶段,训练基本不可用,推理可以通过ONNX Runtime间接支持。NCNN(腾讯的轻量级推理框架)有RISC-V优化分支,利用RVV做加速。

数据库方面,PostgreSQL和MySQL都可以从源码编译到RISC-V平台,但性能优化程度不如x86上的版本。Redis、MongoDB等也有RISC-V编译案例,但生产环境的部署案例还不多。

虚拟化方面,QEMU对RISC-V的模拟支持非常完善,是开发和测试的标准工具。KVM(内核虚拟机)的RISC-V支持在主线内核中已有,但成熟度不如x86/ARM,生产环境使用需要谨慎评估。

五、工程实践:从评估到落地的关键步骤

对于考虑采用RISC-V平台的项目,软件生态的评估和落地有几个关键步骤。

第一步,明确软件需求清单。列出项目依赖的操作系统、编译器版本、关键库和框架,逐项确认RISC-V支持状态。这个清单越具体,后面的风险评估越准确。

第二步,搭建开发环境做PoC(概念验证)。用目标芯片或QEMU模拟,跑一遍完整的编译-部署-运行流程。重点关注:编译是否有问题、运行时是否有异常、性能是否可接受。

第三步,评估长期维护成本。如果某些关键依赖没有RISC-V支持,需要自己移植或维护补丁分支,这个成本要算进项目预算。开源社区的活跃度是重要参考——社区活跃的项目,RISC-V支持会快速完善;社区冷清的项目,可能要自己长期维护。

第四步,制定回退方案。如果RISC-V平台的某个关键软件问题短期无法解决,是否有ARM或x86的回退方案?这个预案在产品化项目中很重要,避免被单一平台的软件问题卡住整个项目进度。

写在最后

RISC-V的软件生态已经跨过了"能不能用"的阶段,进入了"好不好用"的优化期。Linux主线支持基本完善,RTOS选型丰富,编译器工具链成熟,关键软件库的适配在快速推进。

和ARM相比,RISC-V的生态差距主要在商业软件支持和极致性能优化两个维度。但对于大部分嵌入式和边缘计算场景,RISC-V的软件生态已经足够支撑产品开发。随着采用RISC-V的项目越来越多,生态的飞轮效应会越来越明显——用户越多,软件支持越好;软件支持越好,用户越多。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐