资讯动态

Linux 内核中的 LoongArch 架构入门指南:寄存器、指令集与虚拟内存详解

发布时间:2026/9/12 3:11:02 来源:尧图企业网站定制
Linux 内核中的 LoongArch 架构入门指南寄存器、指令集与虚拟内存详解【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读本文基于 Linux 内核源码树中的 Documentation/arch/loongarch/introduction.rst系统介绍 LoongArch 这一全新 RISC 指令集架构的三大核心主题寄存器体系GPR/FPR/VR/CSR、基础指令集与指令编码格式、以及直接映射/页表映射两种虚拟内存模型并结合 arch/loongarch 下的真实内核源码寄存器定义、地址空间宏、汇编入口进行交叉印证。读完本文你将能够理解 LoongArch 处理器在 Linux 内核中的特权级模型、ABI 寄存器约定、TLB 组织方式以及内核如何通过 CSR.DMWn 配置直接映射窗口完成物理地址到虚拟地址的换算。LoongArch 是什么一种全新的 RISC ISALoongArch 是一种全新的 RISC 指令集架构其风格与 MIPS 或 RISC-V 有相似之处但它是独立设计、与任何现有 ISA 都不同的体系。目前 LoongArch 共有三个变体LA32R精简 32 位版本Reduced 32-bitLA32S标准 32 位版本Standard 32-bitLA6464 位版本。LoongArch 定义了4 个特权级Privilege Levels, PLVPLV0 ~ PLV3从高到低排列。内核运行在 PLV0应用程序运行在 PLV3。用户态PLV3只能访问用户地址空间而特权寄存器CSR与内核地址空间仅对 PLV0 开放这与大多数现代 RISC 架构的分层保护思路一致。从内核源码看LoongArch 端口是 Linux 中一个完整且活跃的架构子目录涵盖 arch/loongarch/kernel入口、异常、调度、信号、arch/loongarch/mm内存管理、KASAN、TLB、arch/loongarch/include/asm寄存器与地址空间定义等完整体系并支持 KVM 虚拟化arch/loongarch/kvm。寄存器体系LoongArch 的寄存器分为四类通用寄存器GPRs、浮点寄存器FPRs、向量寄存器VRs以及仅在特权模式PLV0下可访问的控制状态寄存器CSRs。通用寄存器 GPRs$r0 ~ $r31LoongArch 拥有 32 个通用寄存器$r0~$r31。在 LA32 下每个寄存器 32 位宽在 LA64 下每个寄存器 64 位宽。其中$r0硬连线为常量零写入无效读取恒为 0除$r1外其余寄存器在架构层面没有特殊含义$r1硬连线为 BL 指令的链接寄存器即返回地址。内核采用 LoongArch ELF psABI 规范描述的一套寄存器约定本仓库内核侧的具体别名定义见 arch/loongarch/include/asm/regdef.h名称别名用途跨调用是否保留$r0$zero常量零未使用$r1$ra返回地址否$r2$tpTLS/线程指针未使用$r3$sp栈指针是$r4-$r11$a0-$a7参数寄存器否$r4-$r5$v0-$v1返回值否$r12-$r20$t0-$t8临时寄存器否$r21$u0percpu 基地址未使用$r22$fp帧指针是$r23-$r31$s0-$s8静态被调用者保存寄存器是两点需要特别注意$r21在 ELF psABI 中是保留寄存器但 Linux 内核将其用作 percpu 基地址。它通常没有 ABI 名称内核中称其为$u0。在内核汇编代码中可以找到它的实际使用痕迹例如 arch/loongarch/kernel/head.S 中csrwr zero, PERCPU_BASE_KS将 zero 写入 percpu 基地址保存 CSR而 arch/loongarch/kernel/entry.S 中csrrd t0, PERCPU_BASE_KS在异常入口恢复 percpu 基地址正是对$r21/$u0这一内核约定的实际落地。$v0/$v1是$a0/$a1的废弃别名。老代码中可能出现$v0/$v1它们分别对应$a0/$a1的旧称新代码应使用$a0/$a1。浮点寄存器 FPRs$f0 ~ $f31当 FPU 存在时LoongArch 拥有 32 个浮点寄存器$f0~$f31。在 LA64 核上每个寄存器 64 位宽。浮点寄存器约定同样遵循 LoongArch ELF psABI名称别名用途跨调用是否保留$f0-$f7$fa0-$fa7参数寄存器否$f0-$f1$fv0-$fv1返回值否$f8-$f23$ft0-$ft15临时寄存器否$f24-$f31$fs0-$fs7静态寄存器是与 GPR 类似$fv0/$fv1也是$fa0/$fa1的废弃别名。内核的 FPU 上下文切换与浮点异常处理实现在 arch/loongarch/kernel/fpu.S 与 arch/loongarch/kernel/kfpu.c 中。向量寄存器 VRsLSX 与 LASX目前 LoongArch 有两个向量扩展LSXLoongson SIMD eXtension128 位向量带来$v0~$v31向量寄存器LASXLoongson Advanced SIMD eXtension256 位向量带来$x0~$x31向量寄存器。VRs 与 FPRs存在重叠例如在同时实现 LSX 和 LASX 的核上$x0的低 128 位与$v0共享$v0的低 64 位与$f0共享其余向量寄存器同理。这种低位重叠设计允许硬件复用寄存器堆物理存储与 x86 AVX 与 SSE 的重叠思路类似。内核侧通过 CPUCFG2 中的CPUCFG2_LSXBIT(6)与CPUCFG2_LASXBIT(7)位来探测硬件是否支持相应扩展定义见 arch/loongarch/include/asm/loongarch.h。控制状态寄存器 CSRs特权寄存器CSR 只能在特权模式PLV0下访问是内核控制异常、TLB、定时器、性能监控等功能的基石。下表完整列出 LoongArch 的主要 CSR内核中对应宏定义见 arch/loongarch/include/asm/loongarch.h例如LOONGARCH_CSR_CRMD、LOONGARCH_CSR_EENTRY、LOONGARCH_CSR_DMWIN0等地址全称缩写0x0Current Mode InformationCRMD0x1Pre-exception Mode InformationPRMD0x2Extension Unit EnableEUEN0x3Miscellaneous ControlMISC0x4Exception ConfigurationECFG0x5Exception StatusESTAT0x6Exception Return AddressERA0x7Bad (Faulting) Virtual AddressBADV0x8Bad (Faulting) Instruction WordBADI0xCException Entrypoint AddressEENTRY0x10TLB IndexTLBIDX0x11TLB Entry High-order BitsTLBEHI0x12TLB Entry Low-order Bits 0TLBELO00x13TLB Entry Low-order Bits 1TLBELO10x18Address Space IdentifierASID0x19Page Global Directory Address for Lower-half Address SpacePGDL0x1APage Global Directory Address for Higher-half Address SpacePGDH0x1BPage Global Directory AddressPGD0x1CPage Walk Control for Lower-half Address SpacePWCL0x1DPage Walk Control for Higher-half Address SpacePWCH0x1ESTLB Page SizeSTLBPS0x1FReduced Virtual Address ConfigurationRVACFG0x20CPU IdentifierCPUID0x21Privileged Resource Configuration 1PRCFG10x22Privileged Resource Configuration 2PRCFG20x23Privileged Resource Configuration 3PRCFG30x30n (0≤n≤15)Saved Data registerSAVEn0x40Timer IdentifierTID0x41Timer ConfigurationTCFG0x42Timer ValueTVAL0x43Compensation of Timer CountCNTC0x44Timer Interrupt ClearingTICLR0x60LLBit ControlLLBCTL0x80Implementation-specific Control 1IMPCTL10x81Implementation-specific Control 2IMPCTL20x88TLB Refill Exception Entrypoint AddressTLBRENTRY0x89TLB Refill Exception BAD (Faulting) Virtual AddressTLBRBADV0x8ATLB Refill Exception Return AddressTLBRERA0x8BTLB Refill Exception Saved Data RegisterTLBRSAVE0x8CTLB Refill Exception Entry Low-order Bits 0TLBRELO00x8DTLB Refill Exception Entry Low-order Bits 1TLBRELO10x8ETLB Refill Exception Entry High-order BitsTLBEHI0x8FTLB Refill Exception Pre-exception Mode InformationTLBRPRMD0x90Machine Error ControlMERRCTL0x91Machine Error Information 1MERRINFO10x92Machine Error Information 2MERRINFO20x93Machine Error Exception Entrypoint AddressMERRENTRY0x94Machine Error Exception Return AddressMERRERA0x95Machine Error Exception Saved Data RegisterMERRSAVE0x98Cache TAGsCTAG0x180n (0≤n≤3)Direct Mapping Configuration Window nDMWn0x2002n (0≤n≤31)Performance Monitor Configuration nPMCFGn0x2012n (0≤n≤31)Performance Monitor Overall Counter nPMCNTn0x300Memory Load/Store WatchPoint Overall ControlMWPC0x301Memory Load/Store WatchPoint Overall StatusMWPS0x3108n (0≤n≤7)Memory Load/Store WatchPoint n Configuration 1MWPnCFG10x3118n (0≤n≤7)Memory Load/Store WatchPoint n Configuration 2MWPnCFG20x3128n (0≤n≤7)Memory Load/Store WatchPoint n Configuration 3MWPnCFG30x3138n (0≤n≤7)Memory Load/Store WatchPoint n Configuration 4MWPnCFG40x380Instruction Fetch WatchPoint Overall ControlFWPC0x381Instruction Fetch WatchPoint Overall StatusFWPS0x3908n (0≤n≤7)Instruction Fetch WatchPoint n Configuration 1FWPnCFG10x3918n (0≤n≤7)Instruction Fetch WatchPoint n Configuration 2FWPnCFG20x3928n (0≤n≤7)Instruction Fetch WatchPoint n Configuration 3FWPnCFG30x3938n (0≤n≤7)Instruction Fetch WatchPoint n Configuration 4FWPnCFG40x500Debug RegisterDBG0x501Debug Exception Return AddressDERA0x502Debug Exception Saved Data RegisterDSAVE其中返回地址类 CSR 存在一组惯用别名ERA、TLBRERA、MERRERA、DERA 分别也被称为 EPC、TLBREPC、MERREPC 和 DEPC。另外内核为 CRMD 中的各字段定义了位域宏如CSR_CRMD_PLV、CSR_CRMD_IE、CSR_CRMD_PG等见 arch/loongarch/include/asm/loongarch.h用于在汇编与 C 代码中统一操作当前模式、中断使能、分页使能等状态。基础指令集指令格式LoongArch 指令固定 32 位宽属于 9 种基本指令格式及其变体格式名组成2ROpcode Rj Rd3ROpcode Rk Rj Rd4ROpcode Ra Rk Rj Rd2RI8Opcode I8 Rj Rd2RI12Opcode I12 Rj Rd2RI14Opcode I14 Rj Rd2RI16Opcode I16 Rj Rd1RI21Opcode I21L Rj I21HI26Opcode I26L I26H操作数约定Rd 是目的寄存器操作数Rj、Rk、Ra 是源寄存器操作数a 表示 additional即额外源操作数。I8/I12/I14/I16/I21/I26 是相应位宽的立即数。较长的 I21 和 I26 以分离的高、低部分后缀 L 与 H存放在指令字中这是 LoongArch 把长立即数/长跳转偏移塞进 32 位指令字的关键编码技巧。指令清单为保持篇幅简洁此处按文档分类列出助记符详细语义请查阅文末 References 所列的 LoongArch ISA 官方文档。1. 算术指令ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D SLT SLTU SLTI SLTUI AND OR NOR XOR ANDN ORN ANDI ORI XORI MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU PCADDI PCADDU12I PCADDU18I LU12I.W LU32I.D LU52I.D ADDU16I.D2. 移位指令SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D3. 位操作指令EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D MASKEQZ MASKNEZ4. 分支指令BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL5. 加载/存储指令LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D LDPTR.W LDPTR.D STPTR.W STPTR.D PRELD PRELDX6. 原子操作指令LL.W SC.W LL.D SC.D AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D AMMAX.W AMMAX.D AMMIN.W AMMIN.D7. 屏障指令IBAR DBAR8. 特殊指令SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D ASRTLE.D ASRTGT.D9. 特权指令CSRRD CSRWR CSRXCHG IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE从内核源码角度这些特权指令正是 LoongArch 内核入口与内存管理代码的基础例如 arch/loongarch/kernel/entry.S 使用csrrd/csrwr读写 CSRTLB 相关指令TLBRD/TLBWR/TLBFILL 等与 arch/loongarch/mm/tlb.c 中的 TLB 管理逻辑一一对应CPUCFG指令则通过 arch/loongarch/include/asm/loongarch.h 中的read_cpucfg()封装暴露给内核用于探测 CPU 特性FPU/LSX/LASX/地址位宽等。虚拟内存LoongArch 支持**直接映射Direct-mapped与页表映射Page-mapped**两种虚拟内存模式。直接映射与页表映射直接映射由 CSR.DMWnn0~3配置虚拟地址VA与物理地址PA之间存在简单固定关系VA PA FixedOffset页表映射的 VA 与 PA 之间关系任意通过 TLB 与页表记录。LoongArch 的 TLB 由两部分组成MTLBMultiple Page Size TLB全相联支持多种页大小STLBSingle Page Size TLB组相联页大小单一。内核在 arch/loongarch/include/asm/loongarch.h 中为 4 个 DMW 窗口定义了初始化常量LA64 下CSR_DMW0_BASE/CSR_DMW1_BASE/CSR_DMW2_BASE分别取 VSEG 0x8000/0x9000/0xa000 左移DMW_PABITS48位对应 VA 的 bit60~61 为 0/1/2——这正是文档所述三种缓存属性的编码来源同时CSR_DMW1_MAT/CSR_DMW2_MAT位分别标记一致性缓存与弱序非缓存属性。LA32 的默认地址空间布局LA32 整个虚拟地址空间默认配置如下名称地址范围属性UVRANGE0x00000000 - 0x7FFFFFFF页表映射缓存PLV0~3KPRANGE00x80000000 - 0x9FFFFFFF直接映射非缓存PLV0KPRANGE10xA0000000 - 0xBFFFFFFF直接映射缓存PLV0KVRANGE0xC0000000 - 0xFFFFFFFF页表映射缓存PLV0用户模式PLV3只能访问 UVRANGE。对直接映射的 KPRANGE0 和 KPRANGE1PA 等于 VA 清除 bit30~31 后的值。示例物理地址0x00001000的非缓存直接映射 VA 为0x80001000缓存直接映射 VA 为0xA0001000。LA64 的默认地址空间布局LA64 整个虚拟地址空间默认配置如下名称地址范围属性XUVRANGE0x0000000000000000 - 0x3FFFFFFFFFFFFFFF页表映射缓存PLV0~3XSPRANGE0x4000000000000000 - 0x7FFFFFFFFFFFFFFF直接映射缓存/非缓存PLV0XKPRANGE0x8000000000000000 - 0xBFFFFFFFFFFFFFFF直接映射缓存/非缓存PLV0XKVRANGE0xC000000000000000 - 0xFFFFFFFFFFFFFFFF页表映射缓存PLV0用户模式PLV3只能访问 XUVRANGE。对直接映射的 XSPRANGE 和 XKPRANGEPA 等于 VA 清除 bit60~63 后的值缓存属性由 VA 的 bit60~61 配置bit60~61 0强序非缓存strongly-ordered uncachedbit60~61 1一致性缓存coherent cachedbit60~61 2弱序非缓存weakly-ordered uncached。当前内核只使用 XKPRANGE 做直接映射XSPRANGE 保留未用。内核侧宏定义同样印证了这一点arch/loongarch/include/asm/addrspace.h 中XUVRANGE/XSPRANGE/XKPRANGE/XKVRANGE分别定义为0x0、0x4000_0000_0000_0000、0x8000_0000_0000_0000、0xC000_0000_0000_0000且IO_BASE/UNCACHE_BASE取CSR_DMW0_BASE强序非缓存窗口、CACHE_BASE取CSR_DMW1_BASE一致性缓存窗口。直接映射换算实战以物理地址0x00000000_00001000为例在 XKPRANGE 中的三种直接映射 VA 分别是强序非缓存0x80000000_00001000一致性缓存0x90000000_00001000弱序非缓存0xA0000000_00001000这些换算在内核中由 arch/loongarch/include/asm/addrspace.h 的宏直接完成TO_PHYS(x)通过TO_PHYS_MASKLA64 下为 48 位掩码取低 48 位得到物理地址TO_CACHE(x)/TO_UNCACHE(x)分别与CACHE_BASE/UNCACHE_BASE相或得到缓存/非缓存的直接映射 VAPHYSADDR(a)则是 KPRANGEx/XKPRANGE 地址到物理地址的反向换算宏。KASAN 实现也充分依赖这一模型arch/loongarch/mm/kasan_init.c 根据地址落在XKPRANGE_CC_SEG一致性缓存段、XKPRANGE_UC_SEG强序非缓存段还是XKPRANGE_WC_SEG弱序非缓存段来计算对应的 shadow 偏移。Loongson 与 LoongArch 的关系LoongArch 是一种 RISC ISA而 Loongson龙芯是一个处理器家族二者是指令集与芯片产品的关系。Loongson 包含三个系列Loongson-132 位处理器系列Loongson-2低端 64 位处理器系列Loongson-3高端 64 位处理器系列。老龙芯基于 MIPS新龙芯基于 LoongArch。以 Loongson-3 为例Loongson-3A1000 / 3B1500 / 3A2000 / 3A3000 / 3A4000 均为 MIPS 兼容而Loongson-3A5000及其后续修订版全部基于 LoongArch。这一代际切换也是 Linux 内核在 MIPS 之外单独维护 arch/loongarch 架构目录、并为其配备完整启动流程Documentation/arch/loongarch/booting.rst与中断控制器模型Documentation/arch/loongarch/irq-chip-model.rst的直接原因。参考资料原文档在 References 一节列出了以下官方资料渠道此处仅列出资料类型与用途供读者按需检索官方渠道获取龙芯中科官方网站Loongson Technology Corp. Ltd. 官方站点龙芯开发者网站loongnix与龙芯组织代码托管主页提供龙芯与 LoongArch 的软件和文档LoongArch 指令集架构官方文档站包含完整的 LoongArch 规范Vol1含中文版与英文版 PDF覆盖本文所述的寄存器、指令集与虚拟内存的权威细节LoongArch ELF psABI 规范定义寄存器调用约定本文 GPR/FPR 表格即来源于此与重定位等二进制接口龙芯 Linux 内核维护仓库LoongArch 内核开发主线所在。如需深入指令语义、编码位域或 ABI 细节以上官方文档是唯一权威来源本文仅提供内核视角的导览与源码印证。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价