- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
龙芯架构与Linux内核
展开查看详情
1 . 龙芯新架构 LoongArch与Linux内核 陈华才 2023.03
2 . LoongArch 简介 目录 内 核 故 事 未 来 展 望 其 他 2
3 . LoongArch简介 • 从CISC与RISC谈起 • 中央处理器(CPU)分为CISC(Complex Instruction Set Computer,复杂指令集计算机)和 RISC(Reduced Instruction Set Computer,精简指令集计算机)两大类 • CISC的特征是指令集复杂而庞大、指令字不等长、寻址方式复杂、计算指令操作数可以是内存 等,典型代表有X86 • RISC的特征是指令集精简而高效、指令字等长、寻址方式简明、计算指令操作数必须是寄存器 等,典型代表有ARM、MIPS和Power • CISC和RISC各有优劣,在发展过程中也并非井水不犯河水,而是互相吸收对方的优点。X86在 内部早已实现RISC化(所谓微指令),而RISC也引入了SIMD等功能比较强大而复杂的指令 (所谓向量化) 3
4 . LoongArch简介 • 龙芯处理器(Loongson)与龙芯指令系统(LoongArch) • LoongISA:基于MIPS指令系统扩展(旧龙芯) LoongISA LoongSIMD • MIPS基础指令 LoongBT • 龙芯扩展指令:LoongEXT … • 向量扩展指令:LoongSIMD LoongEXT • 二进制翻译扩展指令:LoongBT MIPS32/MIPS64 R2/R6 • LoongArch:龙芯自主指令系统(新龙芯) • 龙芯基础指令 LoongArch • 128位向量扩展指令:LSX LVZ LASX LBT LSX • 256位向量扩展指令:LASX … • 虚拟化扩展指令:LVZ LoongBase • 二进制翻译扩展指令:LBT 4
5 . LoongArch简介 • 龙芯处理器三大家族 • 龙芯1号 • 32位单核CPU(小CPU) • MIPS32指令集或LA32指令集 • 主要面向工业控制、数据采集、消费电子等 • 龙芯2号 • 低端64位单核/双核CPU(中CPU) • MIPS64指令集或LA64指令集(龙芯2K500/2K1000/2K2000) • 主要面向工业控制、移动终端、嵌入式计算机等 • 龙芯3号 • 高端64位多核CPU(大CPU) • MIPS64指令集(龙芯3A1000/3B1500/3A2000/3A3000/3A4000)或LA64指令集 (龙芯3A5000/3C5000/3D5000) • 主要面向电脑(桌面计算机、服务器、高性能计算机)等 5
6 . LoongArch简介 • LoongArch的主要特征 • 典型的RISC:32位定长指令,32个通用寄存器,32个浮点/向量寄存器 • 4个特权级:PLV0~3,其中PLV0最高(内核态),PLV3最低(用户态) • 主要特权资源:控制状态寄存器(CSR) • 地址空间:支持可配置的直接映射和页表映射 • TLB:可变页大小的MTLB+固定页大小的STLB • Cache:一级指令Cache(ICache)、一级数据Cache(DCache)、二级牺牲Cache(VCache)、三级混合 Cache(SCache) Core-0 Core-1 Core-2 Core-3 I-Cache D-Cache I-Cache D-Cache I-Cache D-Cache I-Cache D-Cache V-Cache V-Cache V-Cache V-Cache S-Cache 6
7 . LoongArch简介-通用寄存器 寄存器编号 寄存器名称 寄存器用途 $r0 zero 常数0 $r1 ra 返回地址 $r2 tp TLS(线程局部存储)指针 $r3 sp 栈指针 $r4~$r11 a0~a7 参数寄存器 $r4~$r5 v0~v1 返回值寄存器(复用a0/a1) $r12~$r20 t0~t7 临时寄存器 $r21 x 保留未定义 $r22 fp 帧指针 $r23~$r31 s0~s7 静态寄存器 • 参数寄存器a0/a1与返回值寄存器v0/v1复用 • $r21在用户态未定义,在内核态用于每CPU变量基地址 • 子函数需要自己保存/恢复S系列寄存器,但可以随便使用T系列寄存器 7
8 . LoongArch简介-特权寄存器 寄存器编号 寄存器名称 寄存器功能简介 0x0 CRMD 当前模式信息,包括特权级、中断状态等 0x1 PRMD 异常前模式信息,位域定义类似于CRMD 0x2 EUEN 扩展部件使能,如FPU、LSX、LASX、LBT等 0x4 ECFG 异常配置 0x5 ESTAT 异常状态 0x6 ERA 异常返回地址 0xC EENTRY 异常入口地址 0x10 TLBIDX TLB索引(包含MTLB页大小) 0x11 TLBEHI TLB表项高位内容 0x12、0x13 TLBELO0/1 TLB表项低位内容(双页) 0x18 ASID 地址空间标识符 0x1B PGD 页全局目录(页表根目录)基址 0x1E STLBSIZE STLB页大小 0x20 CPUID CPU核编号 0x41 TCFG 定时器配置 0x42 TVAL 定时器剩余值 0x180~183 DMW0~3 直接映射配置窗口 … … … 8
9 . LoongArch简介 • LoongArch指令格式(共9种) • 2R-type: Opcode + Rj + Rd #OpName Rd, Rj • 3R-type: Opcode + Rk + Rj + Rd #OpName Rd, Rj, Rk • 4R-type: Opcode + Ra + Rk + Rj + Rd #OpName Rd, Rj, Rk, Ra • 2RI8-type: Opcode + I8 + Rj + Rd #OpName Rd, Rj, I8 • 2RI12-type: Opcode + I12 + Rj + Rd #OpName Rd, Rj, I12 • 2RI14-type: Opcode + I14 + Rj + Rd #OpName Rd, Rj, I14 • 2RI16-type: Opcode + I16 + Rj + Rd #OpName Rd, Rj, I16 • 1RI21-type: Opcode + I21L + Rj + I21H #OpName Rj, I21 • I26-type: Opcode + I26L + I26H #OpName I26 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这样的表述。 9
10 . LoongArch简介 • 内存管理:概述 • 字节序:只支持小尾端(LittleEndian) • 虚拟地址-物理地址转换规则 • 支持直接映射和分页映射两种方式 • 直接映射虚拟内存通过CSR.DMWn(n=0~3)进行配置,虚拟地址(VA)和物理地址(PA)之间有简单 的映射关系: VA = PA + 固定偏移 • 分页映射的虚拟地址(VA)和物理地址(PA)有任意的映射关系,这种关系记录在TLB和页表中。TLB包 括一个全相联的MTLB和一个组相联的STLB。 • 页面大小可配置(4KB/16KB/64KB……) • MTLB (Multiple Page Size TLB)的页大小随时可变,由CSR.TLBIDX.PS决定 • STLB (Single Page Size TLB)的页大小启动时可配置(由CSR.STLBSIZE决定),运行时固定不变 10
11 . LoongArch简介 • 内存管理:直接映射 KVRANGE (11) XKVRANGE (11) 0xC0000000 KPRANGE0/1 • MAT:内存访问类型(Cache属性) 0xC000000000000000 (10) 0x80000000 XKPRANGE • MAT=00:强序非缓存 (10) 0x40000000 UVRANGE 0x8000000000000000 • MAT=01:一致可缓存 (00/01) XSPRANGE (01) • MAT=10:弱序非缓存 0x00000000 0x4000000000000000 • MAT=11:保留未使用 左为32位地址空间 XUVRANGE (00) 右为64位地址空间 0x0000000000000000 63 62 61 60 59 0 前缀 64位线性地址 MAT 有效虚拟地址VA (10) 11
12 . LoongArch简介 • 内存管理:分页映射 • V:有效位 D:写脏位 • P:存在位 W:可写位 • PLV:特权级 MAT:Cache属性 • RPLV:特权级严格匹配标志 G:全局位 • PN:NUMA的ProtNone标志 SP:特殊页标志 63 62 61 60 12 11 10 9 8 7 6 5 4 3 2 1 0 64位页表条目 RPLV NX NR 页帧号PFN 0 SP PN W P G MAT PLV D V 12
13 . 内 核 故 事 • V5.19: • LoongArch体系结构主体部分于进入上游 • 2万1千行代码,历时20个月,迭代15个版本 • V6.0: • 中断控制器驱动、PCI控制器驱动和VDSO优化进入上游 • V6.1: • EFISTUB启动、Qspinlock、PerfEvents、Kexec/Kdump、BPF JIT等功能进入上游 • V6.2: • FDT启动、挂起(S3,Suspend)、休眠(S4,Hibernation)、Ftrace 等功能进入上游 13
14 . 内 核 故 事 • 中断控制器驱动的故事 问题:FDT具有描述irqchip级联的能力,ACPI 没有这种描述能力,而龙芯LoongArch采用的 是ACPI规范。 14
15 . 内 核 故 事 • 中断控制器驱动的故事(续) 15
16 . 内 核 故 事 • 中断控制器驱动的故事(续) 16
17 . 内 核 故 事 • EFISTUB启动方式的故事 • BootLoader(EFISTUB/Grub)传递给内核的信息:memmap、initrd、cmdline …… • 第一版:a0 = argc,a1 = argv,a2 = boot_params • boot_params包含了memmap和initrd等信息 • EFISTUB实现复杂,类似于X86 • 第二版:a0 = efi_boot,a1 = fdt_pointer • fdt_pointer包含了memmap、initrd和cmdline等信息 • 采用通用EFISTUB实现,同ARM64/RISC-V,但重度依赖FDT • 第三版:a0 = efi_boot,a1 = cmdline,a2 = system_table • EFI维护者亲自实现,LoongArch领先于ARM64/RISC-V 17
18 . 内 核 故 事 • 采用通用实现,避免盲目创新 • 集众人之智,特别先进、特别整洁,特别优雅 • 通用系统调用表(unistd.h) • include/uapi/asm-generic/unistd.h • 采用架构:ARM64、OpenRISC、RISC-V、C-SKY、LoongArch • 通用异常中断入口(generic entry) • kernel/entry/common.c • 采用架构:X86、S390、LoongArch • 通用自旋锁 • classic spinlock → ticket spinlock → qspinlock • LoongArch现在采用通用ticket spinlock、以后将采用通用qspinlock 18
19 .未 来 展 望 • 基本功能 • 重定位内核(PIE)、向量、虚拟化、二进制翻译 …… • 电源管理 • 动态调频(CPUFreq,DVFS)、温度调控…… • 调测工具 • Kprobe/Uprobe、WatchPoint、kgdb …… • 更多处理器支持 • 目前仅支持大CPU:龙芯3A5000/3C5000/3D5000,使用ACPI • 未来要支持小CPU:龙芯1X/2K500/2K1000/2K2000,使用FDT 19
20 . LoongArch开源生态 • UEFI规范:2.10版本开始支持LoongArch • ACPI规范:6.5版本开始支持LoongArch • Automake:1.18版本开始支持LoongArch • Cmake:3.20开始支持LoongArch • Meson:0.57开始支持LoongArch • Binutils:2.38版本开始支持LoongArch • GCC:12版本开始支持LoongArch • Linux:5.19版本开始支持LoongArch • Glibc:2.36版本开始支持LoongArch • Systemd:250版本开始支持LoongArch • FFmpeg:5.0版本开始支持LoongArch • QEMU:7.1版本开始支持LoongArch • GoLang:1.19开始支持LoongArch • LLVM:15版本开始支持LoongArch • .NET:7.0版本将支持LoongArch • OpenJDK/Rust/Musl……:正在努力进行上游工作 20
21 . 鸣 谢 ✓ 李雪峰 <lixuefeng@loongson.cn> ✓ 龙芯中科内核组组长,龙芯Linux内核代码的管理者和领头人 ✓ 毛碧波 <maobibo@loongson.cn> ✓ 吕建民 <lvjianmin@loongson.cn> ✓ 杨铁柱 <yangtiezhu@loongson.cn> ✓ 唐友灵 <tangyouling@loongson.cn> ✓ 何金阳 <hejinyang@loongson.cn> ✓ 张卿 <zhangqing@loongson.cn> ✓ …… ✓ 龙芯中科主要社区内核开发者(邮件列表里面常见)以及在幕后默默奉献的无名英雄。 ✓ 王雪瑞 <kernel@xen0n.name> ✓ 杨嘉勋 <jiaxun.yang@flygoat.com> ✓ 席若尧 <xry111@xry111.site> ✓ 龙芯社区主要贡献者,龙芯架构常态Reviewer,开发与沟通能力一流,在代码贡献之外起到了龙芯公司与社区及各内核子 系统Maintainer连接的纽带作用。 21
22 .我和《用芯探核》 ✓ 我是谁? ✓ 陈华才,龙芯中科内核开发者,Linux内核中 MIPS/龙芯3号、KVM/MIPS以及龙芯新架构 (LoongArch)的Maintainer ✓ 《用芯探核》是什么书? ✓ 立足龙芯而包罗万象 ✓ 第一本基于龙芯处理器的内核书籍 ✓ 第二本基于Linux-5.x版本的内核书籍 ✓ 创造性地使用“树形视图”和“链式视图” 来解析源代码的 22
23 .