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  而不是真正的二进制目标代码         (如
   26   27   28   29   30   31   32   33   34   35   36