LoongArch内核走过的这些年
LoongArch内核走过的这些年
LoongArch是龙芯中科自主研发的精简指令集架构,自2020年问世以来,在Linux内核社区中取得了显著进展。本文详细介绍了LoongArch从诞生到成熟的历程,展现了其在技术上的独特优势和对国产CPU产业的重要意义。
LoongArch简介
LoongArch是一个典型的、新兴的、先进的、自主的、兼容的精简指令系统(RISC)。它在设计上融合了多个现有架构的优点:
- 继承了MIPS的优秀传统
- 吸收了RISC-V的多项长处
- 通过二进制翻译技术,能够高效运行ARM和X86上的已有软件
这种设计使得LoongArch既能保持架构的先进性,又能充分利用现有软件生态。
出世:2020~2021
2020年,龙芯中科开始了LoongArch指令集的定义工作,并设计了首款基于该指令集的CPU——龙芯3A5000。同年,团队基于Linux 4.19内核进行了初步移植。
2021年5月,LoongArch指令集正式对外公布,龙芯中断模型也被纳入ACPI国际标准。随后,团队基于Linux 5.10内核进行了第二版移植。
2021年7月,LoongArch内核上游工作正式启动,目标版本为Linux 5.14。同时,LoongArch架构文档在GitHub上以中英双语形式发布。
2021年9月,基于LoongArch指令集的龙芯3A5000正式发布。随后,内核上游工作持续推进,共迭代了5个版本,目标版本从5.15逐步调整到5.16。
成长:2022~2023
2022年上半年,Binutils和GCC的LoongArch支持相继进入上游。内核上游工作持续推进,共迭代了10个版本,目标版本从5.16逐步调整到5.19。
2022年6月,Linux内核的LoongArch支持终于进入上游,历时20个月,迭代15个版本。在推进上游工作的过程中,团队摒弃了一些不合理的旧设计,代之以更好的新方法,但同时也产生了"旧世界"ABI 1.0和"新世界"ABI 2.0的兼容性问题。
2022年下半年,Linux 5.19实现了体系结构的基本功能支持,包括寄存器定义、启动管理、异常/中断处理、进程管理、内存管理、系统调用、信号处理、模块支持、SMP支持、NUMA支持等。Linux 6.0增加了中断控制器支持、PCI控制器支持、VDSO优化、堆栈回溯支持等。Linux 6.1增加了EFISTUB启动、新重定位(ABI 2.0)支持、Qspinlock支持、PerfEvents支持、KEXEC/KDUMP支持、BPFJIT支持、ACPI平台驱动支持等。
"旧世界"与"新世界"的主要区别体现在固件与内核的接口层面以及内核与应用的接口层面。为了解决兼容性问题,龙芯中科开发了libLoL(LoongArch on LoongArch)解决方案,通过DKMS内核模块和旧世界兼容C库,实现了新世界系统无缝运行旧世界应用的功能。这一方案由安同(AOSC)社区开发者王邈完成。
2023年,LoongArch在Linux内核中的支持进一步完善。Linux 6.2增加了ACPI/FDT两种启动方式、S3/S4电源管理、SPARSE-VMEMMAP功能、Alternative动态修改代码机制、Ftrace功能支持以及LS2K的PinCtrl驱动等。Linux 6.3增加了可重定位内核与地址随机化、KDUMP同一内核、硬件断点与Kprobes功能支持以及LS2K/LS7A的I2C驱动等。Linux 6.4改进了函数调用栈回溯,增加了内存操作与校验和计算优化、内核态使用浮点单元支持、Perf工具支持、nolibc库支持以及LS2K/LS7A的CLK和GPIO驱动等。Linux 6.5增加了Clang/LLVM编译内核的初步支持、向量扩展、龙芯3A6000支持、时间命名空间、JumpLabel/StaticKey、Uprobes功能支持以及LS2K/LS7A的RTC和HDA驱动等。Linux 6.6增加了RAID 5/6操作的向量优化、二进制翻译和KGDB/KCOV/KFENCE/KASAN四种调测功能支持,以及LS2K/LS7A的SPI、THERMAL和GPU驱动的显示控制器部分等。
2023年底发布的Linux 6.6版本是最新的LTS版本,LoongArch架构在Linux内核版本中的功能支持已经比较完备,龙芯各系列处理器和桥片都得到了Linux内核社区比较完整的原生支持。LoongArch已经成长起来了!
腾飞:2024~未来
2024年上半年,LoongArch在Linux内核中的支持继续扩展。Linux 6.7增加了动态抢占模式(PREEMPT DYNAMIC)支持、BPF CPU V4支持和KVM虚拟化的基础支持。Linux 6.8增加了内置DTB支持、通用CrashKernel支持、Clang/LLVM编译内核的全面支持、Rust支持、KVM虚拟化的向量支持和LS2K的APBDMA驱动。Linux 6.9增加了Objtool、ORC回溯器和实时补丁(LivePatch)的支持。Linux 6.10增加了UP内核和KVM半虚拟化IPI(PV IPI)的支持、改进了Rust支持、增强了LS2K的CLK和THERMAL驱动等。Linux 6.11增加了NEWSTAT系统调用、中断工作项、随机内核栈偏移、CPUFreq调频驱动和KVM PVTime等功能。
未来,LoongArch将继续扩展其功能,包括32位内核、实时内核、高级扩展中断、更多的KVM虚拟化特性以及完整的GPU驱动等。
LoongArch的先进性体现在多个方面:
- 通用系统调用表(unistd.h):继ARM64、OpenRISC、RISC-V、C-SKY后第五个采用
- 通用异常中断入口(generic entry):继X86、S390后第三个采用,领先于ARM64和RISC-V
- Rust支持:继X86后第二个采用,领先于ARM64和RISC-V