-
Notifications
You must be signed in to change notification settings - Fork 55
Add LoongArch-Old-and-New-World-Differences #74
base: main
Are you sure you want to change the base?
Conversation
2b81397
to
0ff7169
Compare
插眼 当前状态可额外提供的信息、可完善的措辞还是很多的 |
Ping |
咦,我在等你们把文档写完。。 🤦 我最近可能没空写大段文字,要不你们再加多点细节(考虑开发者写程序时候要关心的技术细节,尽量不要一笔带过),我帮忙看下? |
|
||
第二阶段大概持续了两年,对于一个商业公司来说,时间相当漫长,这是不可接受的。所以在此期间,产品版一直使用第一阶段的软件生态,该阶段软件生态被公司的工程师称为旧世界,且用户只能获取到二进制软件包,截止到今天,我们使用的 loongnix、uos、Kylin 等商业操作系统发行版都属于旧世界。 | ||
|
||
与旧世界相对应的,第二阶段的 upstream 软件生态被工程师和广大社区开发者称之为新世界,新世界的软件生态有一个特点,即我们可以直接从社区拉下来软件包的源代码,在 LoongArch 机器上编译安装后,能直接运行,所以,新世界是对开源友好的,我们现在能获取到的新世界操作系统发行版有 CLFS、Archlinux、Gentoo(upstreamed)。 |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
发行版新旧世界相关的差异,下面有单独的小节介绍,不适合放在这里。
这是篇手册性质的文档,一些背景,只是简单地提一下,不适合占用大量篇幅讲故事。
|
||
==== 固件 | ||
|
||
固件以不同的内存寻址方式来区分新旧世界。虚拟地址的为旧世界,物理地址的为新世界。 |
There was a problem hiding this comment.
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 数据结构抄的?这一块可能要考证一下。
There was a problem hiding this comment.
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 在内部传递。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这边句子有点口语化,但我目前暂时没什么想法。等下一版再看
There was a problem hiding this comment.
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 内核进上游的各个版本补丁之间的差异。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
“以不同引导协议区分”表意不完整,误导用户,下边那个“另外”可不是次要信息补充。。
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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 构建所用的符号版本一致”。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
谢谢纠正,下个版本改用动态链接器路径。
glibc符号版本这里,等我请教操作系统工程师后,重写一版更加详细的。
谢谢你的审阅!
新旧世界的 |
系统调用也有差异,79、80在新世界中没有了 |
好的,下一版加上。 |
好的,下一版加上。 |
除此之外还多了一个空行(第二行)
为此openmp在解析的时候需要特殊处理,我今天就碰到这个问题了 |
涉及到代码级别的差异,篇幅过大,我暂时不准备在这篇文章里写太详细,根据你目前用到新旧世界差异的开发背景下的描述,我会进行一个指向性的概括,详情请关注下一版。 由于新旧世界环境切换起来有些繁琐,我这里贴出cpuinfo的新旧世界差异,供开发者以后查阅:(请自行忽略cpu频率等的硬件差异) --- oldcpuinfo 2022-12-20 16:30:47.364454292 +0800 processor : 1 processor : 2 processor : 3 |
Signed-off-by: Yanteng Si <[email protected]>
Signed-off-by: Yanteng Si [email protected]