[X]关闭

LoongArch介绍

文档创建者:LINUX课程
浏览次数:16
最后更新:2024-12-17
本帖最后由 LINUX课程 于 2024-12-20 13:30 编辑

1 LoongArch简介
LoongArch(中文名龙架构)是龙芯中科于2021年推出的一种新的RISC ISA(RISC(Reduced Instruction Set Computer)ISA,即精简指令集计算机指令集架构,RISC架构的核心思想是通过简化指令集来提高计算机的性能和效率。它使用较少且简单的指令集,使得每条指令的执行时间更加接近,从而提高了处理器的执行效率。)。LoongArch指令集包括一个32位版(LA32)、一个64位版(LA64)。 LoongArch定义了四个特权(PLV0~PLV3),其中PLV0是最高特权级,用于内核;而PLV3 是最低特权级,用于应用程序。龙架构采用基础部分加扩展部分的模块化组织形式。一个兼容龙架构的 CPU,除实现必需的基础部分(Loongson Base, LBase)外,可根据实际需求选择实现各扩展部分。目前龙架构已定义的扩展部分包括:虚拟化扩展(LoongsonVirtualization, LVZ)、二进制翻译扩展(Loongson Binary Translation, LBT)、128 位向量扩展(Loongson SIMD Extension, LSX)和 256 位高级向量扩展(Loongson Advanced SIMDExtension, LASX)。本篇介绍了LoongArch的寄存器、基础指令集、虚拟内存以及其他一些主题。

2 寄存器
LoongArch的寄存器包括通用寄存器(GPRs)、浮点寄存器(FPRs)、向量寄存器(VRs) 和用于特权模式(PLV0)的控制状态寄存器(CSRs)。

2.1 通用寄存器
LoongArch包括32个通用寄存器( $r0 ~ $r31 ),LA32中每个寄存器为32位宽, LA64中每个寄存器为64位宽。 $r0 的内容总是固定为0,而其他寄存器在体系结构层面 没有特殊功能。( $r1 算是一个例外,在BL指令中固定用作链接返回寄存器。)内核使用了一套LoongArch寄存器约定,定义在LoongArch ELF psABI规范中,详细描述参见 参考文献 :

Note
注意: $r21 寄存器在ELF psABI中保留未使用,但是在Linux内核用于保 存每CPU变量基地址。该寄存器没有ABI命名,不过在内核中称为 $u0 。在 一些遗留代码中有时可能见到 $v0 和 $v1 ,它们是$a0 和 $a1 的别名,属于已经废弃的用法。
2.2 浮点寄存器
当系统中存在FPU时,LoongArch有32个浮点寄存器( $f0 ~ $f31 )。在LA64 的CPU核上,每个寄存器均为64位宽。浮点寄存器的使用约定与LoongArch ELF psABI规范的描述相同:

Note
注意:在一些遗留代码中有时可能见到 $fv0 和 $fv1 ,它们是 $fa0 和 $fa1 的别名,属于已经废弃的用法。
2.3 向量寄存器
LoongArch现有两种向量扩展:
  • 128位向量扩展LSX(全称Loongson SIMD eXtention),
  • 256位向量扩展LASX(全称Loongson Advanced SIMD eXtention)。
LSX使用 $v0 ~ $v31 向量寄存器,而LASX则使用 $x0 ~ $x31 。
浮点寄存器和向量寄存器是复用的,比如:在一个实现了LSX和LASX的核上, $x0 的 低128位与 $v0共用, $v0 的低64位与 $f0 共用,其他寄存器依此类推。
2.4 控制状态寄存器
控制状态寄存器只能在特权模式(PLV0)下访问:




ERA,TLBRERA,MERRERA和DERA有时也分别称为EPC,TLBREPC,MERREPC和DEPC。

3 基础指令集
3.1 指令格式
LoongArch的指令字长为32位,一共有9种基本指令格式(以及一些变体):

Opcode是指令操作码,Rj和Rk是源操作数(寄存器),Rd是目标操作数(寄存器),Ra是 4R-type格式特有的附加操作数(寄存器)。I8/I12/I14/I16/I21/I26分别是8位/12位/14位/16位/ 21位/26位的立即数。其中较长的21位和26位立即数在指令字中被分割为高位部分与低位 部分,所以你们在这里的格式描述中能够看到I21L/I21H和I26L/I26H这样带后缀的表述。
3.2 指令列表
为了简便起见,我们在此只罗列一下指令名称(助记符),需要详细信息请阅读 参考文献 中的文档。
  • 算术运算指令:
  1. ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D
  2. SLT SLTU SLTI SLTUI
  3. AND OR NOR XOR ANDN ORN ANDI ORI XORI
  4. MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU
  5. MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU
  6. PCADDI PCADDU12I PCADDU18I
  7. LU12I.W LU32I.D LU52I.D ADDU16I.D
复制代码
  • 移位运算指令:
  1. SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W
  2. SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D
复制代码
  • 位域操作指令:
  1. EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D
  2. BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D
  3. REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W
  4. BITREV.D
  5. MASKEQZ MASKNEZ
复制代码
  • 分支转移指令:
  1. BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
复制代码
  • 原子操作指令:
  1. LL.W SC.W LL.D SC.D
  2. AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W
  3. AMXOR.D
  4. AMMAX.W AMMAX.D AMMIN.W AMMIN.D
复制代码
  • 栅障指令:
  1. IBAR DBAR
复制代码
  • 特殊指令:
  1. SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W
  2. RDTIME.D
  3. ASRTLE.D ASRTGT.D
复制代码
  • 特权指令:
  1. CSRRD CSRWR CSRXCHG
  2. IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W
  3. IOCSRWR.D
  4. CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE
复制代码
3 虚拟内存
LoongArch可以使用直接映射虚拟内存和分页映射虚拟内存。
直接映射虚拟内存通过CSR.DMWn(n=0~3)来进行配置,虚拟地址(VA)和物理地址(PA) 之间有简单的映射关系:

分页映射的虚拟地址(VA)和物理地址(PA)有任意的映射关系,这种关系记录在TLB和页 表中。LoongArch的TLB包括一个全相联的MTLB(Multiple Page Size TLB,多样页大小TLB) 和一个组相联的STLB(Single Page Size TLB,单一页大小TLB)。
缺省状态下,LA32的整个虚拟地址空间配置如下:

用户态(PLV3)只能访问UVRANGE,对于直接映射的KPRANGE0和KPRANGE1,将虚拟地址的第30~31位清零就等于物理地址。例如:物理地址0x00001000对应的非缓存直接映射虚拟地址是0x80001000,而其可缓存直接映射虚拟地址是0xA0001000。
缺省状态下,LA64的整个虚拟地址空间配置如下:

用户态(PLV3)只能访问XUVRANGE,对于直接映射的XSPRANGE和XKPRANGE,将虚拟地址的第60~63 位清零就等于物理地址,而其缓存属性是通过虚拟地址的第 60~61 位配置的(0表示强序 非缓存,1表示一致可缓存,2表示弱序非缓存)。
目前,我们仅用XKPRANGE来进行直接映射,XSPRANGE保留给以后用。
此处给出一个直接映射的例子:物理地址 0x00000000_00001000 的强序非缓存直接映射虚拟地址 (在XKPRANGE中)是 0x80000000_00001000 ,其一致可缓存直接映射虚拟地址(在XKPRANGE中) 是0x90000000_00001000 ,而其弱序非缓存直接映射虚拟地址(在XKPRANGE中)是 0xA0000000_00001000 。

4 Loongson与LoongArch的关系
LoongArch是一种RISC指令集架构(ISA),不同于现存的任何一种ISA,而Loongson(即龙 芯)是一个处理器家族。
龙芯包括三个系列:Loongson-1(龙芯1号)是32位处理器系列, Loongson-2(龙芯2号)是低端64位处理器系列,而Loongson-3(龙芯3号)是高端64位处理 器系列。
旧的龙芯处理器兼容MIPS架构,而新的龙芯处理器基于LoongArch架构。以龙芯3号为例:龙芯3A1000/3B1500/3A2000/3A3000/3A4000都是兼容MIPS的,而龙芯3A5000/3B5000/3C5000(以及将来的型号)都是基于LoongArch的。龙芯2号系列,龙芯2K2100/2K2000/2K1000/2K500(以及将来的型号)也都是基于LoongArch的。

5 龙芯系列处理器核(LoongArch架构)

龙芯基于LoongArch研发了LA132、LA264、LA364、LA464和LA664五大系列处理器核。
LA132为单发射32位结构,采用静态流水线,性能对标Cortex M4,在龙芯1C102、1C103等MCU中使
用。
LA264为双发射32/64位结构,采用动态流水线,性能对标Cortex A55,在龙芯2K0500、2K1000LA等
SOC中使用。
LA364为三发射64位结构,采用动态流水线,性能对标Cortex A75,在龙芯2K2000等SOC中使用。
LA464为四发射64位结构,采用动态流水线,SPECCPU2006分值为10-12分/GHz。双访存、四定点、双向量、128项重排序缓存。性能对标Zen1,在龙芯3A5000、3C5000、3D5000等CPU中使用。
LA664为六发射64位结构,采用动态流水线,SPECCPU2006分值为14-17分/GHz。四访存、四定点、四向量、两路同时多线程(SMT2)、256项重排序缓存。性能对标Zen2,在龙芯3A6000、3C6000、3D6000等CPU中使用。
LA132及LA264系列CPU核将开放给合作伙伴。
LA364核可以用于对战略客户的IP授权及SOC设计服务。
LA464、LA664系列CPU核限于自用。

6 参考文献
Loongson官方网站(龙芯中科技术股份有限公司):
http://www.loongson.cn/
Loongson与LoongArch的开发者网站(软件与文档资源):
http://www.loongnix.cn/
https://github.com/loongson/
https://github.com/loongsonlab
https://loongson.github.io/LoongArch-Documentation/
LoongArch指令集架构的文档:
https://github.com/loongson/LoongArch-Documentation/releases/download/2023.04.20/Lo
ongArch-Vol1-v1.10-CN.pdf(中文版)
https://github.com/loongson/LoongArch-Documentation/releases/download/2023.04.20/Lo
ongArch-Vol1-v1.10-EN.pdf(英文版)
LoongArch的ELF psABI文档:
https://github.com/loongson/LoongArch-Documentation/releases/download/2023.04.20/LoongArch-ELF-ABI-v2.01-CN.pdf(中文版)
https://github.com/loongson/LoongArch-Documentation/releases/download/2023.04.20/LoongArch-ELF-ABI-v2.01-EN.pdf (英文版)
LoongArch工具链规约文档:
https://github.com/loongson/LoongArch-Documentation/releases/download/2023.04.20/LoongArch-toolchain-conventions-v1.00-CN.pdf(中文版)
https://github.com/loongson/LoongArch-Documentation/releases/download/2023.04.20/LoongArch-toolchain-conventions-v1.00-EN.pdf(英文版)
Loongson与LoongArch的Linux内核源码仓库:
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
https://github.com/chenhuacai/linux/tree/loongarch-next

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则