Hotdry.

Article

MS-DOS 1.25/2.0 源码剖析:16位实模式内存管理与极简系统设计的启示

从 MS-DOS 早期源码解析 16 位实模式内存管理、FAT12 文件系统与 COMMAND.COM 架构,提取适用于现代嵌入式系统设计的极简主义哲学与工程实践。

2026-05-25systems

2026 年 4 月 28 日,恰逢 86-DOS 1.00 发布 45 周年之际,微软继续推进其早期操作系统历史的开源工作,公布了由 Tim Paterson 保存的最早 DOS 源码清单,包括 86-DOS 1.00 内核、PC-DOS 1.00 的多个预发布版本内核,以及 CHKDSK 等工具源码。这批珍贵的手写注释打印清单,经历史学家和档案工作者转录后,以 MIT 许可证托管于 GitHub。与此同时,微软早在 2018 年便已开源了 MS-DOS 1.25 和 2.0 的完整源码。这些代码不仅是计算机历史的活化石,更蕴含着对现代嵌入式系统设计极具价值的工程智慧。

16 位实模式内存管理:在 1MB 限制下的生存艺术

MS-DOS 1.25/2.0 运行在 Intel 8086/8088 处理器的 16 位实模式下,面临着一个硬性约束:仅 1MB 的物理地址空间。这一限制催生了独特的内存管理策略。系统采用分段寻址机制,通过段寄存器(CS、DS、SS、ES)与偏移地址的组合访问内存。这种设计虽然增加了编程复杂度,但为当时的硬件条件提供了最大灵活性。

在 MS-DOS 2.0 的内存布局中,系统区占据低地址端,包括中断向量表、DOS 内核和驻留驱动程序;用户程序则从低地址向上加载;而 COMMAND.COM 的巧妙设计在于其常驻 - 暂驻分离架构—— 将命令解释器分为两部分:常驻段(Resident Portion)始终驻留内存,负责处理中断 22H(程序终止)、23H(Ctrl-C 中断)、24H(致命错误)和 27H(驻留退出);暂驻段(Transient Portion)则加载到物理内存的末端,可被需要最大内存的用户程序覆盖。当用户程序退出后,常驻部分通过校验和检测暂驻段是否被修改,若被覆盖则自动从磁盘重载。

这种设计哲学对现代嵌入式系统具有直接启示:在资源受限的环境中,将代码按使用频率和必要性分层,非关键功能可以按需加载或牺牲,核心功能必须常驻。校验和机制(CHECK_SUM)则提供了一种轻量级的完整性验证手段,适用于无法承担复杂保护机制的简单系统。

FAT12 文件系统:简单即可靠的存储设计

MS-DOS 1.25/2.0 采用的 FAT12 文件系统,是简单性与可靠性的经典平衡。12 位的文件分配表(FAT)表项限制了单个卷的大小,但也带来了实现上的简洁。根目录固定大小,文件数据通过簇链映射,这种设计避免了复杂的动态内存分配。

从源码中可以观察到,FAT12 的实现严格遵循了最小可行复杂度原则。文件系统操作直接操作磁盘扇区,没有现代文件系统的日志、快照或加密等高级特性,但正因如此,其代码量极小,可靠性极高,且易于在资源受限的嵌入式设备上移植。对于现代物联网设备或工业控制器而言,这种 "够用即可" 的设计思路仍然适用 —— 在确定需求边界后,选择最简实现而非最复杂方案。

COMMAND.COM 架构:内存优化的工程典范

COMMAND.COM 的源码(v2.0/source/COMMAND.ASM)展示了一种极致的内存优化策略。文件头部的注释清晰说明了其三分结构:常驻代码段(CODERES)、初始化代码段(INIT)和暂驻代码段(TRANCODE)。初始化代码在系统启动后执行一次即被覆盖;暂驻段位于内存高端,可被应用程序覆盖;常驻段则守护系统核心功能。

这种架构的关键在于内存的动态博弈。当用户执行大型程序时,系统允许其占用暂驻段所在的内存区域;程序退出后,通过校验和快速判断是否需要恢复命令解释器。这一机制在当时的硬件条件下最大化了用户可用内存,同时保证了系统交互的连续性。

对于现代嵌入式系统,这种设计可转化为动态代码加载与卸载策略。在 Flash 空间充足但 RAM 有限的设备上,可以将非核心功能编译为独立模块存储于 Flash,需要时加载到 RAM 执行,执行完毕后释放。校验和或签名验证则确保了加载代码的完整性。

极简主义的设计哲学

通读 MS-DOS 早期源码,最深刻的感受是其极简主义的设计哲学。整个系统内核仅数十 KB,没有冗余的抽象层,每个功能都直接映射到硬件操作。中断 21H 提供的系统调用接口虽然简单,但覆盖了文件操作、内存管理、设备 I/O 等核心需求。

这种 "刚刚好" 的设计思维对当代嵌入式开发者具有警示意义。在资源受限的 MCU、传感器节点或边缘设备上,过度设计往往意味着功耗增加、可靠性下降和维护成本上升。MS-DOS 源码提醒我们:在明确需求边界后,最简实现往往是最优实现

可落地的设计参数清单

基于 MS-DOS 1.25/2.0 架构分析,提取以下适用于现代嵌入式系统的设计参数:

内存管理策略

  • 将固件划分为常驻区(核心中断处理、关键任务)与可覆盖区(用户界面、非关键服务)
  • 常驻区大小控制在总 RAM 的 20% 以内,为应用程序保留最大空间
  • 实现轻量级校验和验证(如 16 位 CRC 或简单累加和)用于代码完整性检测

文件系统选型

  • 对于小容量存储(<32MB),FAT12 仍是可靠选择,代码 footprint 可控制在 10KB 以内
  • 根目录条目数根据实际文件数量预设,避免动态分配带来的碎片化问题
  • 考虑使用只读文件系统(如 ROMFS)配合 RAM 缓存,进一步简化设计

代码组织原则

  • 采用分层加载架构:启动代码执行后释放、核心服务常驻、扩展功能按需加载
  • 中断向量表静态配置,避免运行时动态修改带来的不确定性
  • 系统调用接口保持稳定,便于应用程序移植与维护

资料来源

  • Microsoft Open Source Blog, "Continuing the story of early DOS development," April 28, 2026
  • GitHub: microsoft/MS-DOS (MS-DOS 1.25/2.0/4.0 source code)
  • GitHub: DOS-History/Paterson-Listings (86-DOS 1.00 and PC-DOS 1.00 pre-release source listings)

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com