Page 31 - 《软件学报》2026年第6期
P. 31
2350 软件学报 2026 年第 37 卷第 6 期
RISC-V 指令集结构特性、LLVM IR、传统软件构建系统构成与工作机制等. 这些基础知识为 RuyiBuild 工具链
的构建、部署与转换能力提供了理论支撑与实现路径.
2.1 RISC-V 指令集架构
RISC-V 是近年来在学术界与工业界广泛受到关注的一种新型指令集架构 (instruction set architecture, ISA),
[1]
起源于 2010 年加州大学伯克利分校的项目. 其最显著特征在于开放性: RISC-V 的所有规范文档均对外公开发布,
且实现不受专利授权限制, 任何组织和个人均可自由构建符合该标准的处理器. 这一开放策略为处理器设计与创
新提供了前所未有的自由度.
RISC-V 遵循精简指令集计算 (RISC) 理念, 强调指令结构简洁、编码规则统一、实现门槛低 [13] . 在架构设计
上, RISC-V 自诞生之初即采用高度模块化的扩展机制 [2,14] , 将指令集划分为基础集和若干可选扩展模块. 其中,
RV32I 和 RV64I 分别为 32 位与 64 位基础整数指令集, 包含大约 40–50 条核心指令, 用于支撑基本的计算与控制
流逻辑. 在此基础之上, RISC-V 通过添加字母后缀来引入标准扩展功能, 例如: M 扩展提供整数乘除指令; A 扩展
提供原子操作指令; F/D 扩展提供单精度/双精度浮点指令; C 扩展提供 16 位压缩指令, 以减少代码体积. 多个扩展
可以组合使用, 形成特定应用的 ISA 子集 [15,16] . 例如, “RV64GC”通常表示 RV64I 基础指令集加上通用扩展集合
(IMAFD 等) 以及必要的控制状态寄存器和取指屏障扩展. 通过选择不同的扩展组合, RISC-V 可灵活覆盖从微控
制器到高性能处理器的各种需求. 其规范将各扩展设计为彼此兼容, 避免冲突, 并且允许实现者根据需要增减扩
展, 从而实现高度定制化.
然而, RISC-V 的这种模块化自由也带来碎片化和平台差异的挑战 [17] . 不同芯片厂商根据自身需求选择的扩
展组合可能互不一致, 从而造成二进制软件的通用性下降. 尤其是在需要发布二进制软件的领域 (如操作系统发行
版), 过多的可选扩展会让应用程序难以确定“最低公分母”的 ISA 支持集. 此外, RISC-V 在不同应用平台上表现出
不同的系统功能特性. 例如, 部分微控制器级实现不支持内存管理单元 (MMU) 与页表机制, 无法运行完整的 Linux
内核; 而高性能应用处理器则支持虚拟内存、向量计算、多级缓存等高级特性. 因此, 即便指令集一致, 系统软件
在不同平台上的运行行为也可能存在较大差异.
RISC-V 的模块化设计在提升架构可定制性的同时, 也引发了软件构建、部署与分发过程中的兼容性挑战.
在 RISC-V 生态中实现软件的一次构建、多平台适配、动态转换部署, 需要构建工具具备足够的指令集感知能力、
平台特征抽象能力与部署机制弹性. RISC-V 同时也给更多企业或其他单位进入 CPU 设计领域带来很多机会. 参
与 CPU IP 设计的企事业单位从一两家 (x86 和 ARM), 扩展到数十家. 每家 CPU 设计单位设计的 CPU 往往有不
同的微架构特性, 同样的二进制软件在不同的 RISC-V CPU 上可能会表现出巨大的性能差异 [18] . 这也为软件的开
发、编译和分发带来巨大挑战. 本文提出的 RuyiBuild 工具链, 正是在此背景下发展出的新型构建思路.
2.2 LLVM IR
LLVM IR 是 LLVM 编译器框架中的核心中间语言 [19–21] , 其在整个编译流程中承担着承上启下的枢纽作用.
作为一种面向静态单赋值 (static single assignment, SSA) 形式的中间语言, LLVM IR 能够精准地刻画程序的语义
与控制流程, 为后续的优化与目标代码生成奠定了结构基础. 每个变量在其作用域内仅被赋值一次, 所有操作均通
过带类型的中间寄存器 (通常以 % 符号开头) 完成. 这一机制极大地简化了编译器对数据依赖关系的分析, 也使得
如值传播、死代码消除、常量折叠等优化操作更为直接可靠. LLVM IR 是一种强类型的低级类汇编语言. 它既抽
象出通用指令系统 (如 add、sub、call、ret 等), 又保留了函数调用、内存模型、异常处理等高级语言语义. 同时,
它支持无限数量的虚拟寄存器, 避免物理寄存器资源受限所带来的瓶颈, 使得编译器在优化过程中拥有更大的调
度空间 [22] .
当前 LLVM IR 一般用于编译器内部各组件之间的信息交换, 如 Clang、Rust、Flang 等编译器前端将高级语
言转换为 LLVM IR, 然后通过编译器中端 (也可以是 opt 工具) 进行通用优化, 再通过编译器后端 (也可以是 llc 工
具) 将 LLVM IR 转换为具体硬件架构的汇编代码. LLVM IR 也被用于 LLVM 的链接时优化 (LTO) 技术的实现. 使
用 LTO 选项编译高级语言时, 如 clang -c -flto 时, 编译得到的结果是 LLVM IR 而不是真正的二进制目标代码 (如

