档案库 · 产品创意 · 技术决策 · 2019
Stage0:用手敲的十六进制程序,从小于 1KB 的种子二进制引导出 C 编译器
Stage0 从一个人能手动输入、且每个阶段都要求 70% 程序员能读懂的十六进制程序开始,逐步构建出完整的 C 工具链。
Stage0
当时的题目
Stage0's goal, in the README's own words, is 'creating a bootstrapping path to a C compiler capable of compiling GCC, with only the explicit requirement of a single 1 KByte binary or less' — for machines that have no firmware, operating system or other supplied software to start from. The author, Jeremiah (GitHub oriansj), had spent months hearing that a proper C compiler could not be written in assembly, and found no human-written C compiler in assembly to copy.
它是怎么成立的
Stage0 攻击了计算领域最难的信任问题之一:当你不信任任何现有的编译器、固件或操作系统时,如何获得编译器?它的答案是一个看似疯狂的约束——手动创建的十六进制程序,其唯一目标是构建一条通往能编译 GCC 的 C 编译器的引导路径,从不超过 1KByte 的单一二进制开始。一位 Hacker News 读者称之为“一个奇妙的、疯狂而酷的目标”。
设计在可审计的层次中向上构建。Hex0 监控器汇编手动输入的十六进制程序并提供最小文本输入;第一阶段添加了日益强大的汇编器(Hex0、Hex1、Hex2),支持注释、标签和寻址;随后是一个最小的宏汇编器;链上的第一个 C 编译器被编写成 x86 交叉编译器,正是为了让每个人都能验证它的行为并观察它自举。两条规则贯穿每一步:代码必须能让 70% 的程序员理解,并且无论是手动构建还是自动化构建,生成的二进制文件必须完全相同。
该项目源于引导运动对不可验证工具链的担忧——迎接它的那条讨论串将这项工作与摆脱信任信任攻击以及保存不依赖于当今编译器的知识形式联系起来。README 中提到了灵感来源,包括 Edmund Grimley Evans 的 bcompiler 和 cc500、Jonesforth、PDP-1 的《Expensive Typewriter》,以及一个关于被困在房间里编程的思想实验;它还记录了作者保留在仓库中的失败尝试,供那些希望独立构建根二进制文件的人参考。
仓库快照显示链条已达到第三阶段:版本 1.0 的 M2-Planet C 编译器带有 x86 移植,一个用于 mescc-tools 引导的 dwarf-stub 生成器,以及允许构建者验证他们甚至不拥有的硬件程序的 x86 工具。主仓库已移至 GNU Savannah,POSIX 移植覆盖 x86、AMD64 和 AArch64,计划的未来是更多硬件移植,加上在 FPGA 和后来的 TTL 中实现 Knight 处理器。
妙在哪
- 体积和可读性限制将信任变成了工程属性:小于 1KB 且 70% 程序员能读的二进制文件是人类可以真正验证的。
- 以微小阶段增长链条意味着每个环节都可检查,而失败的实验(FORTH、Lisp)可以被搁置而不会丢失整个项目。
- 要求手动构建与自动化构建产生字节完全相同的二进制文件,提供了具体证明,说明没有哪个阶段秘密更改了代码。
- 将第一个 C 编译器编写为 x86 交叉编译器,让怀疑者可以观察其自举过程——回应了“真正的 C 编译器无法用汇编编写”的说法。
- GPLv3 许可证和 GNU Savannah 主页将该项目与自由软件引导运动联系起来,将个人证明转变为了共享基础设施。
做出来什么
The June 2019 Hacker News post drew 200 points and 68 comments debating a 'world's smallest C compiler' and the trusting-trust problem; commenters called it a 'bootstrap pilgrimage'. The master repository now lives on GNU Savannah, the README's stage3 shows the M2-Planet C compiler used in mescc-tools-seed generation to 'complete the circle', and the repository snapshot shows 585 commits and 1.1k stars.
可以借走的
要让某些东西可信,就把不可验证的部分缩小到人能全部读懂:对种子设置硬性的体积和可读性限制,然后从那个可审计的点重新构建。
后来
Stage0 仍然是可引导社区活跃的参考项目:README 指向 savannah.nongnu.org 作为主仓库,列出了 GitLab 镜像和 POSIX 移植仓库,并邀请通过电子邮件或 #bootstrappable 频道提交补丁。爬取快照显示 GitHub 上有 585 次提交、1.1k 星和 28 个关注者,M2-Planet、blood-elf 和 mescc-tools-seed 生成被定位为从原始十六进制到编译工具链“完成循环”的路径。发布讨论将其视为推动可信、可引导系统更广泛努力的一部分。
资料来源
- oriansj/stage0 — A set of minimal dependency bootstrap binaries
- Stage0 – A set of minimal C compiler bootstrap binaries (Hacker News discussion)
发现哪里写错了?告诉我们。
轮到你了
你刚读完一个点子。把你手上的题目说出来,看看谁接过同样的题。
免费账号 · 3 次免费提问 · 不用绑卡