重温计算机帝国的奇点!微软开源 DOS 1.0 源码:当年 5 万美元买下的 6K 代码

当一个古老的软件系统彻底退出历史舞台,大多数时候它的归宿只能是被锁进软盘盒里慢慢腐烂,或者在博物馆的某个角落里吃灰。然而,微软近年来却选择了一条极具人文情怀的道路——将这些改变了人类科技史的早期系统源代码进行整理,并以极其宽松的开源协议面向全球公众彻底公开。
适逢 86-DOS 1.00 诞生 45 周年之际,微软与历史保护团队合作,正式在 GitHub 上开源了目前已发现的最早 DOS 源代码仓库(仓库名为 DOS-History/Paterson-Listings)。这份极具分量的“代码化石”重见天日,不仅带我们重回了 45 年前那个个人计算机刚刚萌芽的英雄时代,更完整地为我们还原了微软帝国崛起的那颗“奇点”。
1. 86-DOS 的前世今生:微软帝国的惊天豪赌
回到 1980 年,当时的个人计算机巨人 IBM 正在秘密研发代号为 "Project Chess" 的桌面个人电脑(即后来的 IBM PC 5150)。为了能尽快让电脑上市,IBM 需要为其配备一套 16 位的操作系统。最初,IBM 属意的合作对象是当时微机操作系统霸主 CP/M 的研发商数字研究公司(Digital Research)。然而,傲慢的数字研究公司拒绝签署 IBM 苛刻的保密协议,且无法在短期内交付适配 16 位英特尔 8086 架构的操作系统版本。谈判宣告破裂后,焦头烂额的 IBM 最终将目光投向了当时只卖 BASIC 编译器、甚至还没有自己操作系统的“小作坊”——微软。
比尔·盖茨和保罗·艾伦意识到,这是一个能够改变微软命运的绝佳机会。然而,微软手头并没有现成的 16 位系统。如果从零开始研发,工期漫长,IBM 根本等不及。就在此时,他们注意到西雅图计算机产品公司(SCP)的软件工程师 Tim Paterson 之前为了测试 8086 原型板,自己编写了一个简易的 16 位系统。Paterson 随性地将其命名为 QDOS(Quick and Dirty Operating System,即“快速简陋操作系统”)。

微软当机立断,首先以 1 万美元的价格拿到了 QDOS 的非排他性授权。随后,在 1981 年 7 月 27 日,微软再次出资 5 万美元,从 SCP 手中将该系统的所有权买断。这套总大小仅仅 6KB 的简陋操作系统,在经过微软工程师团队的改造后,最终变身成了随同 IBM PC 一起发售的 PC-DOS 1.00。而微软在合同中精明地保留了将其授权给其他兼容 PC 厂商的权利(即 MS-DOS),直接奠定了微软此后数十年的行业垄断基础。
2. 探秘开发现场:本次开源仓库的珍贵遗产
与普通的“历史文物”展示不同,本次微软开源的 Paterson-Listings 仓库,可以说是一整套鲜活的“开发现场记录”。它并没有经过现代工程的高大上重构,而是原汁原味地保留了 Tim Paterson 当年写代码时的阶段性修改状态和手写批注。
仓库的核心内容非常丰富,包含了以下三个维度的极其珍贵的技术档案:
- 86-DOS 1.00 的完整内核汇编源码:这是整个 DOS 操作系统的鼻祖。由于当时还没有 C 语言的高效编译器,整个系统完全是用英特尔 8086 汇编语言写成。这让我们能直观地看到在只有 64KB 段内存限制的硬件上,工程师是如何设计中断处理和文件分配表的。
- 多份开发过程中的“快照(Snapshots)”:这些快照相当于那个没有 Git 的时代里,开发者手动备份的“Commit 记录”。通过对比不同快照文件,历史研究者能清晰地看到某个 Bug 是在何时被发现并修复的。
- 经典实用工具(如 CHKDSK.COM)的独立清单:这其中包括了著名的磁盘检查程序 CHKDSK 的初版汇编实现,展示了当时极简的逻辑结构。
这些散落着历史尘埃的汇编清单,是由 Yufeng Gao 与 Rich Cini 带领的历史保护团队,历经数月通过物理扫描仪扫描打印稿、进行高精度的 OCR 文字转录,并经过严格的技术校验和微软法务审核后,才最终得以在 GitHub 上以宽松的 MIT 协议公开。
3. 从 86-DOS 源码一窥经典的 FAT12 文件系统设计
在阅读这批开源汇编代码时,最让现代系统级程序员感到惊叹的,莫过于其中对于 FAT(File Allocation Table,文件分配表)文件系统的设计。在那个软盘空间只有 160KB 的极端环境下,Tim Paterson 创造性地简化了文件存储逻辑。
在 QDOS 阶段,系统采用的是经典的 FAT12 格式。它的核心设计极其精简:
- 极简扇区分配:FAT12 将磁盘空间划分为逻辑簇,每个簇在文件分配表中仅占用 12 位(1.5 字节)。这使得在内存极其紧缺的 8086 处理器上,整个 FAT 表可以直接读入内存中驻留,极大地提升了磁盘的读写性能。
- 8.3 命名规范的物理约束:由于目录项空间极为珍贵,每个目录项仅被分配了 32 字节。文件名部分被死死地限制在了 8 字节的主文件名加 3 字节的扩展名(即著名的 8.3 格式)。
+---------------------------------------------------------+
| FAT12 目录项结构 |
+---------------------+-------------------+---------------+
| 文件名 (8 字节) | 扩展名 (3 字节) | 其他元数据 |
+---------------------+-------------------+---------------+
由于目录项中没有冗余的指针,系统仅通过文件头部的第一个簇号作为索引,然后在 FAT 表中像单向链表一样串联起后续的物理块。这种天才般的资源权衡,至今仍在许多嵌入式小容量存储设备中发挥着余热。
4. 45 年前的“古董代码”对现代软件工程的启示
有人或许会产生疑问:在当前多核 CPU 普及、内存动辄几十 GB 的云计算时代,去阅读 45 年前仅有 6KB 大小、用于单任务命令行的汇编代码,是否纯粹只是出于复古的情怀?答案是否定的。在软件工程日趋臃肿、开发框架动辄嵌套数层的今天,DOS 1.0 的源码反而像一面镜子,映照出了软件工程中最纯粹的“资源约束之美”。
首先,它是一次纯正的极限工程学教学。在 DOS 1.0 编写的年代,没有大容量内存,没有多线程调度,每一个寄存器的复用、每一次栈指针的移动,都需要工程师在草稿纸上反复计算。在这种极度的硬件约束下, Paterson 展示了如何用最少、最直接的指令去管理硬件,这种“惜墨如金”的思维是现代高并发、低延迟底层开发中急需的。

其次,它体现了快速迭代与市场先行的商业哲学。QDOS 的全称是 Quick and Dirty,它不追求架构的完美,而是以最快速度跑通最核心的文件读写与控制台输入输出。微软正是用这套看似“脏乱差”的简陋系统,成功截胡了精益求精、但工期拖沓的数字研究公司。在软件开发中,完美的架构往往会死在实验室里,而能够快速推向市场并不断迭代的“极简可行产品(MVP)”,才有机会改写历史。
5. 本地复古模拟:FAT12 磁盘空间分配验证
为了让大家更直观地感受 DOS 1.0 的 8.3 命名规则和 160KB 软盘的物理边界,我们专门编写了一段 FAT12 文件分配模拟脚本。它能模拟在一个 160KB 单面软盘上,按照 8.3 文件名格式进行分配,并监控剩余空间的变化。
大家可以在本地的 practice 目录下运行 validate_dos_filesystem.py:
# 模拟在 160KB 单面软盘上分配 8.3 文件
# 运行输出片段:
# === MS-DOS 1.0 FAT12 Floppy File System Simulator ===
# [DOS] Allocated sectors for: COMMAND.COM (4950 Bytes)
# [DOS] Allocated sectors for: IO.SYS (1200 Bytes)
# [DOS] Allocated sectors for: MSDOS.SYS (2400 Bytes)
# [DOS ERROR] Bad filename: THISISALONGFILENAME.TEXT (Must match 8.3 format)
#
# A> DIR
# COMMAND COM 4950 Bytes
# IO SYS 1200 Bytes
# MSDOS SYS 2400 Bytes
#
# 3 File(s) 8550 Bytes used
# 155290 Bytes free

这套模拟工具能够帮助我们在现代操作系统中重温当年的经典限制,深刻感受 80 年代系统级软件设计的克制与精妙。

长按二维码关注 “边学边练”