从零构建操作系统的故事
Deepin
2025-10-22 1390字

我今天给你们讲另外一个 Linux 系统工程师的故事

还是 2015 年,我们以前的团队为了适配一款国产芯片,具体芯片的名字我就不讲了

那款芯片就只有三个东西 glibc、kernel 和 gcc,再也没有其他任何东西了,我们要把这款芯片从零撸起来,难度非常高。

很多人说,这不就是 LFS 嘛,根本没那么简单,一个操作系统 ISO 预装 3000 个包,一个仓库要 10000 个包,这些包如果在 X86,确实就是 LFS 的事情。

但是我们要解决的是,从零构建整个操作系统文件系统,特别是一些底层的软件包,比如数学库、向量库、编程语言相关的库,每个包都有一堆芯片指令集分支,代码里到处都是 ifdef 的宏,用来包括特定 CPU 平台的平台代码。

我们要移植的工作不光是编译一下,而是要把这个库的 X86 汇编翻译成国产芯片的汇编语言,这里需要对计算机架构、X86 指令集、国产芯片指令集、数学还有对特定编程语言都要了解才能干。

把指令集、国产芯片寄存器和数学算法补齐以后,才能编译,这种级别的编译最大的问题是软件包的循环依赖,因为确实太严重了,比如三个包 A、B、C,他的依赖关系不是 A -> B -> C, 他的依赖关系是 A -> B, B -> C, C -> A, A -> C, B -> A。

常规的方法根本无法编译,我们只能把某些包源码分拆了,比如把 A 分成两部分,伪造了两个 A1 A2 的包,先把 B 依赖 A 的部分弄好, B1 B2 编译出来,再回头来编译 A 的缺失部分。

这种底层构建的方法就叫作,多次编译法,多次编译才能解决芯片指令集底层缺失太多包又要从零构建的问题。

30 人干了半年,终于干到了 X11 这一层,可以说所有底层命令行的环境都干好了,这时候已经到合同最后期限了。商务同学说加把劲,我说,这个不是加把劲的问题,你换个团队 50 人干两年都没法从零启动一个芯片,我们 30 人干半年到 X11 已经非常牛逼了,干不了,真干不了,干不动了,赔钱吧,干不了

最后没办法,甲方来武汉,和我们喝一顿酒,问,全部干完要多久?

我说还要给我们半年时间,那半年怎么干的,30 人专门移植图形环境的东西,Gtk、Qt、浏览器,浏览器还要移植 JavaScriptCore 和 JIT,浏览器交叉编译要 1 天 1 夜,原生芯片编译最少 5 天一次,错一个参数就要重来,怎么知道参数对没对呢?上一次 5 天的编译结果会告诉你。

另外一个团队几十人把桌面环境从 QML 全部用 Qt 重写,因为国产芯片不支持 OpenGL。

最难受的是,干到 8 个月的时候,GCC 有 bug,那个 bug 是生成的汇编代码有问题,会造成我们另外一个桌面环境内存随机崩溃。

哎,就这样一个团队兵分三路:底层包/图形包移植、JIT 优化、桌面环境重写,又干了一遍。

一年的时间,从零支持了一款芯片,同时把桌面环境重写了一遍,那一年所有人,包括我,都累垮了。

所以,我从 deepin linux 出来以后,我记得阿里云一个技术人给我打电话要招募我,炫耀说他们在这款国产芯片用 GCC 5.3编译了整个系统,当时我都没理他。

现在这个故事就是当年的答案:整个大树都是我们 60 人干了一年的工作,底层的数学库、汇编指令集、编译器、桌面环境等等 1 万个软件包都是我们构建,你们就像余业玩 Linux 那样,按照 LFS 的方法重新编译一遍,你也好意思说操作系统是你们做的?这就是国内这些互联网大公司的水平,太 low,也是大多数玩 Linux 的人的现状,水平太差还喜欢攻击人。