LoongArch 是由龙芯(Loongson)推出的一套现代 RISC 风格指令集架构,设计目标兼顾开源生态、国产处理器自主可控以及面向云、嵌入式与高性能计算的可扩展性。LoongArch 将基础整数与浮点指令集合、可选的向量扩展、二进制翻译与虚拟化能力,以模块化的方式组织,允许实现者根据需要选择扩展集。理解 LoongArch 参考手册的关键点,对于底层软件、编译器后端、操作系统内核与性能调优人员至关重要。 LoongArch 提供两种基本的实现宽度:LA32 与 LA64。LA64 在兼容 LA32 应用的同时,支持更大的寄存器宽度和扩展的地址空间。寄存器集采用 32 个通用寄存器 r0-r31(r0 恒为 0),浮点与向量寄存器独立定义。
所有指令为固定 32 位长度,按 4 字节对齐,编码风格上将寄存器字段从低位依序排列,而 opcode 位从高位向低位排列,形成若干典型格式,包括 2R、3R、4R、若干带立即数的格式,便于编译器代码生成与解码实现。 整数指令覆盖常见的算术运算、位移与位操作、比较与分支、加载存储以及原子与 LL/SC 同步原语等。ADD、SUB、MUL、DIV 等指令在 W(32 位)和 D(64 位)两种语义下定义,LA32 实现时仅需支持 32 位行为。ALSL 等乘加/位移组合指令用于优化乘法移位场景,PC 相对寻址指令(PCADDI、PCALAU12I 等)便于生成位置无关代码。位操作与位域指令如 BITREV、REVB、BSTRPICK/INS、CLZ/CLO 等在实现字节序变换、位打包与解析时很高效,利于字符串、压缩与多媒体处理的微优化。 内存访问模型是 LoongArch 的重要组成。
LoongArch 支持三类访问属性:Coherent Cached(CC),Strongly-ordered UnCached(SUC),与 Weakly-ordered UnCached(WUC)。访问类型通过虚拟地址关联的 MAT 字段确定,软件通常通过页表或直接映射窗口配置。SUC 访问保证顺序一致性,可用于 I/O 映射,WUC 允许合并与乱序优化以提高吞吐,CC 则走缓存一致性协议以实现多核共享内存一致性。架构对自修改代码与指令缓存一致性提出了硬件与软件协同的原则,要求在需要时使用 IBAR 或 CACOP 等指令进行缓存同步。 地址翻译方面,LoongArch 支持直接地址(Direct Mapped)与页表映射(Mapped)模式。直接地址模式通常用于内核引导与某些嵌入式配置,映射模式下通过 TLB 加速虚拟地址到物理地址的翻译。
TLB 由 STLB(单一定页大小的集合相联 TLB)与可支持多页大小的 MTLB 组成,查询时两者可并行查找。TLB 条目包含 VPPN、PPN、ASID、V/D/PLV/MAT/NR/NX 等字段,支持奇偶页对存储以提高缓存效率。TLB refill 异常机制允许软件或硬件进行页面回填,架构为 TLB refill 与机器错误异常提供独立的上下文与 CSR 集,以避免异常嵌套时的状态污染。 页表走访机制在 LoongArch 中具备灵活性。系统可以采用多级页面表,每级目录结构与条目长度可通过 PWCL/PWCH CSR 配置。LoongArch 还定义了支持"Huge Page"与页表条目格式的规范,页表行可以自动被拆分以填充到 TLB 的双页对结构。
对于需要软件辅助的页表遍历,LDDIR 与 LDPTE 指令提供了对目录与页表项的访问接口,有助于实现软件页面走访或配合硬件 Page Walker 完成复杂的表查找。 异常与中断模型设计上,LoongArch 将异常与中断严格区分。异常通常由指令执行过程中的异常情形产生,中断则由外部或内部硬件事件触发。体系中定义了 4 个特权级 PLV0-PLV3,PLV0 为最高特权。CSR.CRMD 保存当前模式信息,而 PRMD、TLBRPRMD 与 MERRCTL 则保存异常前的上下文以支持在不同异常类型返回时恢复。中断采用线中断与消息中断两种形式,消息中断允许内核以更细粒度的方式处理向量化中断源,CSR.ESTAT、ECFG 与一系列 MSGCSR 用于状态记录与路由控制。
控制与状态寄存器(CSRs)是 LoongArch 特权资源的核心。CSRs 既承担异常向量基地址、TLB 操作寄存器、页表基址、定时器配置、性能监控单元配置与计数器、调试/监视点配置,也包含 CPUCFG 用于动态识别当前处理器实现的功能集。CPUCFG 提供版本化的特征位,例如 VALEN/PALEN、LSX/LASX 启用、LL/SC 与原子指令支持、硬件页表遍历能力与 DIV32 行为等,能够帮助操作系统与运行时在运行时决定特性集与采取兼容策略。 并发与原子操作原语在多核环境下尤为重要。LoongArch 支持丰富的原子内存指令,包括 AM{SWAP/ADD/AND/OR/XOR/MAX/MIN} 等,提供 .W/.D/.B/.H 等粒度,以及带或不带数据屏障(_DB)语义的变体,确保在需要时执行读-改-写序列的同时实现数据屏障效果。LL/SC 对(LL.W/LL.D 与 SC.W/SC.D)提供了通用的乐观原子实现,且 SC 返回值会反映操作是否成功,便于用户空间构建自旋重试循环。
LoongArch V1.1 引入 LL.ACQ 与 SC.REL 语义,以支持 acquire/release 内存语义,更利于构建高效的同步原语。 浮点与向量扩展在 LoongArch 中同样重要。基本浮点单元遵循 IEEE 754-2008 标准,实现单精度与可选双精度操作、比较、转换、 fused multiply-add(FMADD)等指令,并提供 FCSR 用于异常掩码、标志与舍入模式设置。向量扩展以 LSX(128 位)与 LASX(256 位)为代表,提供 SIMD 加速能力,常见的向量浮点、整型以及加密与复数指令均通过扩展定义。架构允许实现者选择性实现向量扩展,并通过 CPUCFG 标志告知软件可用性。 虚拟化与二进制翻译扩展进一步提升平台的通用性。
LVZ 虚拟化扩展为操作系统虚拟化提供硬件加速支持,涉及访客与宿主的 CSR 集、虚拟化模式与访存转换,设计上将 Host 与 Guest 的 CSR 区分以减少上下文切换负担。LBT 二进制翻译扩展用于提高跨 ISA 翻译效率,支持 X86、ARM、MIPS 等二进制翻译指令集的加速。在选择实现这些扩展时,CPUCFG 字段为软件判断能力提供了可靠依据,从而在运行时采取合适的运行时路径或禁用不可用指令。 对于操作系统与编译器开发者而言,LoongArch 的几个实践建议非常关键。首先,使用 CPUCFG 与运行时特征检测替代硬编码版本判断,保证程序在不同实现间稳健运行。其次,内核页表与 TLB 管理应严格遵循架构对对齐、权限与 MAT 的要求,充分利用 DMW 直接映射窗口简化高效内核访问。
第三,对于并发数据结构,优先使用架构提供的 AM 原子指令或 LL/SC 模式以获得高性能且语义清晰的同步。第四,在处理自修改代码或热补丁场景时,结合 IBAR 与 CACOP 保证指令流的可见性与缓存一致性。 在安全与鲁棒性方面,LoongArch 的异常模型、页表权限与 NX/NR 控制为内核提供基础防护能力。页表中的 RPLV 与 PLV 字段使得内核可对不同特权等级施加差异化访问策略,NX 与 NR 标志分别用于执行与读取禁止,结合强制性的 SUC 类型可用于构建可信 I/O 通道。针对设备驱动与 DMA 场景,CCDMA 支持缓存一致性 DMA 能力,减少软件维护缓存一致性的复杂度。 生态与迁移层面,LoongArch 致力于兼顾兼容与演进。
LA64 对 LA32 的向后二进制兼容,结合可选的 32 位地址模式与虚拟地址缩短功能,使得在多代软硬件之间能平滑迁移。编译器后端需要生成既满足 ABI 要求又能利用 PC 相对寻址、LDPTR/ADDU16I.D 等指令组合优化的代码。调试支持方面,硬件提供丰富的 watchpoint 与 breakpoint 机制,CSR.DEBUG 与 DSAVE/DERA 等寄存器为调试器提供完整的上下文保存与恢复能力。 总体来看,LoongArch 参考手册不仅是一套技术规范,也是一份面向系统实现、编译器构建、性能工程与安全设计的蓝图。对于希望在国产处理器生态中设计可靠系统与高效应用的工程师,深入理解 LoongArch 的指令语义、内存模型、TLB 与页表机制、CSR 接口与扩展特性至关重要。通过合理利用 CPUCFG 进行特性检测、遵循一致的异常与页表处理流程、采用原子与同步语义构建线程安全数据结构,并针对向量与浮点扩展进行代码路径优化,能够最大化发挥 LoongArch 平台在性能与可维护性之间的平衡优势。
未来随着架构的演进与生态逐渐完善,LoongArch 在国产硬件与软件栈中的影响力将进一步提升,成为构建自研处理器与操作系统生态的重要基石。 。