跳转到主要内容

新世界和旧世界的介绍与区别

简介

龙芯目前有两套生态, 这两套生态在社区常常使用新世界和旧世界称呼, 龙芯内部一般会使用ABI1.0称呼旧世界, ABI2.0称呼新世界, 对于用户来说新旧世界最为明显的区别就是他们主要支持的软件方向会有所不同, 本文大部分情况下会使用社区常用的新旧世界来称呼相关生态

旧世界: 兼容很多商业软件(QQ, 微信, 搜狗输入法等, 还有不少面向专用领域的商业软件), 由龙芯内部对其内核进行维护, 对龙芯的龙架构CPU新特性也会支持的更快, 主要内核版本有4.19, 5.4, 5.10, 主要发行版有Loongnix, 麒麟, 统信

新世界: 是龙芯在上游社区得到支持后发布的版本, 对开源软件的兼容性会比旧世界更友好, 内核版本也往往较新(大于5.19), 比如高版本火狐, 谷歌浏览器, 高版本的TG(小飞机)等, 支持的linux桌面也很多, 有不少开源社区的支持(Archlinux, 安同(aosc), 深度(deepin)), 并且已有部分商业系统支持(阿里的龙蜥), 并且因为有liblol的存在也可以跑很多旧世界商业软件(QQ, 微信, 龙芯浏览器等)

推荐使用

如果你是一个爱折腾, 有自行编译软件或想学习编译软件的能力, 喜欢追新, 对桌面美观度很在意, 满足上述任意两个要求或者有对高版本工具链的需求, 则建议使用新世界, 其他情况一律建议旧世界

判断已有系统的新旧世界

根据内核判断新旧世界并不十分准确, 龙芯内部往往使用看出一个系统中原生二进制文件的十六进制模式下第四行第一位的值

可以使用如下一句命令判断你的系统是新世界和旧世界, 如果回来的值是43就是新世界, 03就是旧世界

hexdump -s 48 -C /usr/bin/sh | head -n 1 | awk '{print $2}'

社区介绍摘录

以下信息摘抄自:龙芯社区

旧世界、新世界

最早只有一个世界。龙芯转向 LoongArch 之前,MIPS 的最底层生态已经成熟稳定,也就没有这档子事。但自从龙芯决定要搞自己单独一套架构,完全没有生态,那生态从哪来?龙芯一开始觉得 MIPS 是好的,于是把现有底层组件的 MIPS 字样就批量替换成 LOONGARCH,除了汇编、反汇编这种涉及机器语言的地方才真正重写,人们都觉得这样做没什么问题,你看这程序不是跑起来了吗?商业上时间不等人,为了抢占先机,龙芯把这个世界跑通之后直接就给下游厂商了。这个世界的底层逻辑就由此固化,很难撼动。是为“旧世界”,一个除了名字不一样,别的都跟 MIPS 一样的世界。

这些事情都做完之后,像是一个步骤结束了开始下一个步骤,龙芯才开始大举向上游开源社区推送 LoongArch 适配补丁。上游的同学们看了这些补丁,大跌眼镜,这不就是 MIPS 代码复制粘贴吗?接下来的事情很多人已经知道了——除了少数一些不关注平台移植细节和审美,甚至看都不看闭眼合并的上游之外,这些复制粘贴的补丁基本都折戟沉沙。龙芯的员工们也渐渐意识到,闭眼抄 MIPS 不行——毕竟是两个不一样的架构嘛!自己都说了做个新架构摆脱 MIPS 历史包袱,结果实际上是把历史包袱一个不差都复制过来,这样着实不好。很多人似乎也是被上游提醒了才知道,世界上不只 MIPS 一个架构,当做事情方法不一样的时候,MIPS 往往是特立独行的那个,而不是别人,因而跟 MIPS 无脑保持一致反倒增加了其他人的负担。

于是乎,后期的龙芯员工们停下了无脑推送,开始老老实实按正常方式移植、适配软件,写出了一些基本摆脱 MIPS 影响的东西,这些就能够顺利进入上游了。这些全新写作的代码基本没有历史包袱,互相之间也能正常配合,但正是由于摆脱了历史包袱,这个世界就总是与“旧世界”存在这里那里的不同,因而不能互相兼容;是为“新世界”。

旧世界固件、新世界固件

在一部分龙芯员工的描述中,旧世界固件也叫“虚拟地址固件”,新世界固件也叫“物理地址固件”。此命名的依据是该两种固件向软件开发者暴露接口的最大区别:旧世界固件提供的各种表格、指针地址都是 0x9000_xxxx_xxxx_xxxx 格式的,不是物理地址,而是透过预先配置的对整个物理地址空间的 1:1 可缓存映射窗口(与 Linux 内核对 CSR DMWIN1 的初始配置一致)访问内存的“虚拟地址”。这也是同一内核(目前)不能兼容新旧世界固件的主要原因之一。

除以上区别之外,该两种固件还有其他区别。下表列出了新旧世界固件所有存在差异的维度。由于该论坛的软件不支持 Markdown 表格,以下内容换成列表形式展现。

  • 指针性质
    • 旧世界固件:可缓存映射(虚拟)地址
    • 新世界固件:物理地址
  • 默认引导文件搜索路径
    • 旧世界固件:\EFI\BOOT\BOOTLOONGARCH.EFI 或与新世界一致
    • 新世界固件:\EFI\BOOT\BOOTLOONGARCH64.EFI
  • ACPI 6.5 规范
    • 旧世界固件::❌: 非标准
    • 新世界固件::✅: 规范实现

旧世界的 ACPI 表结构不同,是至今(2022.06)为止的新世界发行版都必须使用 initrd 覆盖固件 ACPI 表,才能正常启动的原因。具体而言,内核预期的 ACPI MADT 结构与旧世界不同,新世界内核直接看到旧世界 ACPI MADT 则会认为系统有 0 个 CPU,因而初始化失败。

可能存在一些旧世界固件,其默认引导文件也叫 BOOTLOONGARCH64.EFI。具体以你电脑上 EFI 分区的现状为准。但所有新世界固件都仅支持 BOOTLOONGARCH64.EFI 一个文件名。

BPI

新旧世界的固件对引导器、内核都仅仅提供相当标准的 UEFI 编程接口。但在 Linux/LoongArch 一侧,接受固件、引导器参数的具体方式,即“引导协议”(boot protocol)却存在历史包袱。即便早期的新世界内核(2022.06 之前),也不能从固件直接接受参数,而需要特制的 grub 为其转换一道,将标准的 UEFI 引导协议适配为龙芯公司特有的 BPI 引导协议。目前该问题已经解决,以 Linux v5.19-rc1 接受了 LoongArch 不带引导支持的补丁为分水岭,之后的新世界内核将以通用的 EFI stub 方式被 grub 或固件直接引导。

请注意,新旧世界的区分存在许多维度。从上面的描述也可看出,确实有一个历史时期,即便一个内核在用户态 ABI 层面被认为是新世界,它也可能仅支持旧世界引导协议,从而需要搭配旧世界固件使用。

BPI 是笔者对《龙芯 CPU 开发系统固件与内核接口规范》的简称,因为该规范本身没有简称,但早期 LoongArch Linux 移植中使用的 struct bootparamsinterface 与该规范一脉相承。(在 Linux/LoongArch 最初上游工作的中后期,使用该接口规范的版本 v6 v7 v8 v9 已经把结构体名字改成和 MIPS 时代一致的 struct boot_params 了,但在 LoongArch 推出以来的大部分时间这个结构体都叫 BPI,因此仍然保留这个名字。龙芯开发人员从 v10 开始,接受了上游提议,删除了所有 BPI 残余,看起来这些 MIPS 包袱他们自己也不喜欢 :�:)

《龙芯 CPU 开发系统固件与内核接口规范》是龙芯公司的企业标准,从 MIPS 时代(该规范初版发布于 2014 年 4 月 1 日)就已存在。为了不要让 LoongArch 架构从一开始就与龙芯公司的具体硬件、固件、参考系统产生不必要的耦合,以及为了尽量减少架构相关的独特内容以便降低维护负担,上游 Linux 社区一直不建议以该规范引导 Linux/LoongArch。由于龙芯最终接受了上游建议,该规范的 LoongArch 版已经不会正式发布了(即使发布也会删除所有 BPI 相关内容),所有 BPI 相关的实现细节都只能参考先前版本的 Linux/LoongArch 补丁。

新固件安装方法