Skip to content
This repository has been archived by the owner on Apr 11, 2024. It is now read-only.

Add LoongArch-Old-and-New-World-Differences #74

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

sterling-teng
Copy link
Collaborator

Signed-off-by: Yanteng Si [email protected]

@xen0n
Copy link
Contributor

xen0n commented Nov 21, 2022

插眼 当前状态可额外提供的信息、可完善的措辞还是很多的

@sterling-teng
Copy link
Collaborator Author

插眼 当前状态可额外提供的信息、可完善的措辞还是很多的

Ping

@xen0n
Copy link
Contributor

xen0n commented Nov 29, 2022

插眼 当前状态可额外提供的信息、可完善的措辞还是很多的

Ping

咦,我在等你们把文档写完。。 🤦

我最近可能没空写大段文字,要不你们再加多点细节(考虑开发者写程序时候要关心的技术细节,尽量不要一笔带过),我帮忙看下?


第二阶段大概持续了两年,对于一个商业公司来说,时间相当漫长,这是不可接受的。所以在此期间,产品版一直使用第一阶段的软件生态,该阶段软件生态被公司的工程师称为旧世界,且用户只能获取到二进制软件包,截止到今天,我们使用的 loongnix、uos、Kylin 等商业操作系统发行版都属于旧世界。

与旧世界相对应的,第二阶段的 upstream 软件生态被工程师和广大社区开发者称之为新世界,新世界的软件生态有一个特点,即我们可以直接从社区拉下来软件包的源代码,在 LoongArch 机器上编译安装后,能直接运行,所以,新世界是对开源友好的,我们现在能获取到的新世界操作系统发行版有 CLFS、Archlinux、Gentoo(upstreamed)。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

可能要补充关于分裂的新世界的内容,即国内发行版 openEuler、openAnolis 可能采用与上游不同的 ABI tag note section(源于他们采用的 glibc 版本是正式上游之前的某个版本)、甚至 glibc 符号(相同原因),以提升该问题的关注度

cc @Rabenda

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

发行版新旧世界相关的差异,下面有单独的小节介绍,不适合放在这里。

这是篇手册性质的文档,一些背景,只是简单地提一下,不适合占用大量篇幅讲故事。


==== 固件

固件以不同的内存寻址方式来区分新旧世界。虚拟地址的为旧世界,物理地址的为新世界。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

“以不同寻址方式”,错误(固件跟内核没有本质不同),表意不清(其实只是 DMW 配置不同、暴露的 EFI 数据结构中指针字段的地址性质不同,而且对应用开发者不是很相关)。建议改成类似“新旧世界在固件层面的区分主要在于 EFI 应用程序启动时 MMU 所处状态,以及各数据结构中指针字段所含地址的形式。”然后扩写

另外新旧世界使用的 UEFI 数据结构也不太相同。不清楚下边提到的“X86 中断控制器”是怎么一回事?印象中旧世界(最早提交上游的 Linux 移植)就已经是自定义的一些结构体了,它们是照着 x86 数据结构抄的?这一块可能要考证一下。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议改成类似“新旧世界在固件层面的区分主要在于 EFI 应用程序启动时 MMU 所处状态,以及各数据结构中指针字段所含地址的形式。
可以

另外新旧世界使用的 UEFI 数据结构也不太相同。
这里我会去了解下。


==== 引导器

grub 以引导不同格式的内核来区分新旧世界。只能识别 ELF 内核的为旧世界,只能识别 PE 格式的 Linux EFI stub 的为新世界;旧世界传递 rd_start/rd_size,新世界传递 initrd,并增加了 Loadfile2 在内部传递。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这边句子有点口语化,但我目前暂时没什么想法。等下一版再看

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我上下文的表述结构是对齐的,我暂时也没什么想法;如果你觉得口语化,还是在这一版详细提出来吧,其它人也无异议的话,我下个版本完全按你的意思重构整篇文档。


==== 内核

内核以不同的引导协议来区分新旧世界。使用ELF引导协议的为旧世界,使用 EFI stub 引导协议的为新世界。另外,旧世界内核 NSIG=128,user_pt_regs不导出 orig_a0;新世界内核 NSIG=64,user_pt_regs 要导出 orig_a0;旧世界 MINSIGSTKSZ/SIGSTKSZ=2048/8192,新世界 MINSIGSTKSZ/SIGSTKSZ=4096/16384;同时,新旧世界内核在 ucontext、sigcontext、rt_sigframe 等结构体上也有些许差异。感兴趣的读者可以去 lore.kernel.org 的 linux-arch 存档里面对比 LoongArch 内核进上游的各个版本补丁之间的差异。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

“以不同引导协议区分”表意不完整,误导用户,下边那个“另外”可不是次要信息补充。。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我不明白哪里表意残缺,哪里误导用户,这段第一句简明概括了区分方法,然后第二句又详细地解释了如何区分。

上边那个“另外”确实有些不恰当,我会将它与下边的“同时”进行位置调换。


==== 操作系统

OS 以不同的 lib 库来区分新旧世界。旧世界使用 /lib64/ld.so.1,新世界使用 /lib64/ld-linux-loongarch-lp64d.so.1;Glibc symbol version 也有差异,旧世界使用 2.27,新世界使用 2.36.
Copy link
Contributor

@xen0n xen0n Nov 29, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

程序头的 ld.so,术语叫 program interpreter,程序解释器,此处可以这么叫,也可以叫“动态链接器路径”以便不懂 ELF 细节的开发者理解。肯定不叫“lib 库”(抛开实质不谈,这个说法本身就有问题,“lib”就是“库”)。

旧世界的 glibc 符号版本不全是 GLIBC_2.27,准确的描述应该是“与 glibc 2.27 版本的 MIPS 构建所用的符号版本一致”。

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

谢谢纠正,下个版本改用动态链接器路径。

glibc符号版本这里,等我请教操作系统工程师后,重写一版更加详细的。

谢谢你的审阅!

@yetist
Copy link
Contributor

yetist commented Dec 5, 2022

新旧世界的 /proc/cpuinfo 字段名称变了,影响应用解析和处理。
比如:"model name"-> "Model Name"

@yetist
Copy link
Contributor

yetist commented Dec 5, 2022

系统调用也有差异,79、80在新世界中没有了

@sterling-teng
Copy link
Collaborator Author

新旧世界的 /proc/cpuinfo 字段名称变了,影响应用解析和处理。 比如:"model name"-> "Model Name"

好的,下一版加上。

@sterling-teng
Copy link
Collaborator Author

系统调用也有差异,79、80在新世界中没有了

好的,下一版加上。

@SixWeining
Copy link

新旧世界的 /proc/cpuinfo 字段名称变了,影响应用解析和处理。 比如:"model name"-> "Model Name"

除此之外还多了一个空行(第二行)

  1 system type             : generic-loongson-machine
  2 
  3 processor               : 0
  4 package                 : 0
  5 core                    : 0

为此openmp在解析的时候需要特殊处理,我今天就碰到这个问题了

@sterling-teng
Copy link
Collaborator Author

新旧世界的 /proc/cpuinfo 字段名称变了,影响应用解析和处理。 比如:"model name"-> "Model Name"

除此之外还多了一个空行(第二行)

  1 system type             : generic-loongson-machine
  2 
  3 processor               : 0
  4 package                 : 0
  5 core                    : 0

为此openmp在解析的时候需要特殊处理,我今天就碰到这个问题了

涉及到代码级别的差异,篇幅过大,我暂时不准备在这篇文章里写太详细,根据你目前用到新旧世界差异的开发背景下的描述,我会进行一个指向性的概括,详情请关注下一版。

由于新旧世界环境切换起来有些繁琐,我这里贴出cpuinfo的新旧世界差异,供开发者以后查阅:(请自行忽略cpu频率等的硬件差异)

--- oldcpuinfo 2022-12-20 16:30:47.364454292 +0800
+++ newcpuinfo 2022-12-20 16:35:20.235440139 +0800
@@ -1,61 +1,62 @@
system type : generic-loongson-machine
+
processor : 0
package : 0
core : 0
-cpu family : Loongson-64bit
-model name : Loongson-3A5000LL
-CPU Revision : 0x10
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
FPU Revision : 0x00
-CPU MHz : 2300.00
-BogoMIPS : 4600.00
-TLB entries : 2112
-Address sizes : 48 bits physical, 48 bits virtual
-isa : loongarch32 loongarch64
-features : cpucfg lam ual fpu lsx lasx complex crypto lvz lbt_x86 lbt_arm lbt_mips
-hardware watchpoint : yes, iwatch count: 8, dwatch count: 8
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu complex crypto lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8

processor : 1
package : 0
core : 1
-cpu family : Loongson-64bit
-model name : Loongson-3A5000LL
-CPU Revision : 0x10
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
FPU Revision : 0x00
-CPU MHz : 2300.00
-BogoMIPS : 4600.00
-TLB entries : 2112
-Address sizes : 48 bits physical, 48 bits virtual
-isa : loongarch32 loongarch64
-features : cpucfg lam ual fpu lsx lasx complex crypto lvz lbt_x86 lbt_arm lbt_mips
-hardware watchpoint : yes, iwatch count: 8, dwatch count: 8
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu complex crypto lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8

processor : 2
package : 0
core : 2
-cpu family : Loongson-64bit
-model name : Loongson-3A5000LL
-CPU Revision : 0x10
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
FPU Revision : 0x00
-CPU MHz : 2300.00
-BogoMIPS : 4600.00
-TLB entries : 2112
-Address sizes : 48 bits physical, 48 bits virtual
-isa : loongarch32 loongarch64
-features : cpucfg lam ual fpu lsx lasx complex crypto lvz lbt_x86 lbt_arm lbt_mips
-hardware watchpoint : yes, iwatch count: 8, dwatch count: 8
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu complex crypto lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8

processor : 3
package : 0
core : 3
-cpu family : Loongson-64bit
-model name : Loongson-3A5000LL
-CPU Revision : 0x10
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
FPU Revision : 0x00
-CPU MHz : 2300.00
-BogoMIPS : 4600.00
-TLB entries : 2112
-Address sizes : 48 bits physical, 48 bits virtual
-isa : loongarch32 loongarch64
-features : cpucfg lam ual fpu lsx lasx complex crypto lvz lbt_x86 lbt_arm lbt_mips
-hardware watchpoint : yes, iwatch count: 8, dwatch count: 8
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu complex crypto lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants