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

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

重温计算机帝国的奇点!微软开源 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,即“快速简陋操作系统”)。

Mermaid Diagram

微软当机立断,首先以 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 展示了如何用最少、最直接的指令去管理硬件,这种“惜墨如金”的思维是现代高并发、低延迟底层开发中急需的。

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

其次,它体现了快速迭代与市场先行的商业哲学。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 年代系统级软件设计的克制与精妙。


公众号二维码

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

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

相关阅读

最新文章

热门文章

本栏目文章