DOS简介
DOS(Disk Operating System),是磁盘操作系统的缩写,是个人计算机上的一类操作系统。从1981年直到1995年的15年间,DOS在IBM PC兼容机市场中占有举足轻重的地位。而且,若是把部分以DOS为基础的Microsoft Windows版本,如Windows 95、98和Me等都算入,那么其商业寿命至少可以算到2000年。
DOS家族包括MS-DOS、PC-DOS、DR-DOS、FreeDOS、PTS-DOS、ROM-DOS、JM-OS等,其中以MS-DOS最为著名。虽然这些系统常被简称为“DOS”,但没有任何一个系统单纯以“DOS”命名(只有一个毫无关连的1960年代IBM大型主机操作系统以此命名)。此外,有几个和DOS无关、在非x86的微计算机系统上执行的磁盘操作系统在名称中也有“DOS”字眼,而且在专门讨论该机器的场合中也会简称为“DOS”(例如:AmigaDOS、AMSDOS、ANDOS、Apple DOS、Atari DOS、Commodore DOS、CSI-DOS、ProDOS、TRS-DOS等),但这些系统和DOS可执行文件以及MS-DOS API并不兼容。
设计架构
所有DOS类的操作系统都是在使用Intel x86或其兼容CPU的机器上执行的(主要是IBM PC及其兼容机)。最早的时候,DOS并未受限于此;为了在许多以x86为基础,但和IBM PC不兼容的机器上执行,产生了不少特定机器版本的DOS及类似的操作系统。
DOS是单一用户、单工的操作系统,拥有不可重入的基本核心函数(意即同时间只能有一个程序调用这些函数)。有一个例外的状况,就是常驻程序(Terminate and Stay Resident,缩写为TSR)。某些常驻程序允许用户多工操作;然而此时仍有“核心不可重入”的问题:当一个进程(process)调用了操作系统核心中的服务函数(也就是系统调用)时,在这个调用结束之前,其他的进程绝对不能进行系统调用、打断第一个进程。
DOS的核心为用户程序提供了各式各样的函数,例如:在屏幕上显示文字、从键盘读入字符、访问磁盘上的文件等等。
脚本语言
DOS透过批处理文件(扩展名为.BAT)提供界面脚本的功能。这些纯文本格式的脚本文件可以用任何的文本编辑器编辑。他们执行起来和编译而成的程序没有两样。文件中的每一行都被视为命令来执行。批处理文件也可以使用数个内部命令,例如goto和条件表达式。
硬件访问
DOS提供了简单的硬件抽象层,让程序员可以开发文字界面的应用程序;但这个硬件抽象层无法访问大部分的计算机硬件,像是显卡、打印机,或是鼠标等。这使得程序员必须直接访问硬件,导致每个应用程序都有属于自己的一组硬件周边驱动程序。硬件制造商会将他们的硬件规格书发布,以确保在受欢迎的应用程序中有它们的驱动程序。
设备保留名称
在DOS中,有数个名称保留给设备使用,无法拿来当一般文件的名称,且不管扩展名是什么;这些保留名称是用来将应用程序的输出发送给硬件周边用的。这样的限制也影响到数个版本的Windows,在某些情况下甚至会造成死机和安全性弱点。其中一些保留名称有:NUL:、COM1:或AUX:、COM2:、COM3:、COM4:、CON:、LPT1:或PRN:、LPT2:、LPT3:,以及CLOCK$。
磁盘命名法
在DOS中,磁盘驱动器是利用不同的字母命名的。标准的作法是保留“A”和“B”给软盘驱动器。若是系统只有一台软盘驱动器的话,DOS允许这台软盘驱动器同时使用这两个代号,然后DOS会要求用户更换磁片。这么做可以让用户把文件拷贝到不同的软盘上,或是执行某一片软盘上的程序,然后把资料文件存放在另一片软盘上。最早硬盘的代号为“C”和“D”。在一台硬盘驱动器上,DOS只允许一个活动分区的存在。随着支持的硬盘数量越来越多,磁盘代号的命名方法演变为:先将磁盘代号指派给每一颗硬盘驱动器的活动主分区,然后第二轮将代号指派给延伸分区中的逻辑卷,第三轮再把代号指定给非活动的主分区。(前题是:它们存在,而且包含了DOS可以读取的文件系统。)最后,DOS才将代号指派给光盘驱动器、RAM disk,以及其他的硬件。一般来说,磁盘代号都是依照驱动程序的加载顺序,按字母顺序指派的,但驱动程序也可以要求DOS指派不同的字母。例如网络磁盘驱动器的驱动程序通常会指派最后的几个字母。
因为DOS的应用程序会直接使用这些磁盘代号(和Unix类系统使用/dev目录的方法不同),因此若是新增了需要分配磁盘代号的硬件,可能会导致这些应用程序出错。举例来说:若是原本硬盘中的延伸分区中存在逻辑卷,此时新增一颗有主分区的硬盘的话,由于主分区拥有较高的分配优先权,所以原本硬盘的逻辑卷的代号就会改变。此外,就算是新增一颗只有延伸分区和逻辑卷的硬盘,还是会影响到RAM disk及光盘驱动器的代号。这个问题一直到9x系列的Windows都仍然存在;NT系列才有解决方案:磁盘代号会保留给已存在的磁盘驱动器机,除非用户手动更改。
引导流程
PC兼容机的引导扇区(MBR)位于第 0 扇区。对于DOS来说,这段代码会将DOS的HAL读入存储器中然后执行。在DR DOS及PC DOS中,这个HAL放在IBMBIO.COM文件中;而MS DOS则是放在IO.SYS。接下来这个HAL会加载位于IBMDOS.COM(PC DOS或DR DOS)或是MSDOS.SYS(MS DOS)里面的DOS内核。Windows 9x中附的DOS版本(MS DOS 7和8)将HAL和核心合并放在IO.SYS里面,而MSDOS.SYS则是文字格式的配置文件案。然后DOS核心会去执行CONFIG.SYS这个文件。在CONFIG.SYS中,SHELL这个命令指定了SHELL的文件位置(通常是COMMAND.COM)。接下来这个SHELL会被执行,然后它会去开启开机启动项(通常是AUTOEXEC.BAT)。
相关
与Windows的关系
纯32位版本的Windows(从NT开始;包含了2003、XP和Vista)并非以DOS为基础的。这些系统中内含了一个NT DOS虚拟机(NT Virtual DOS Machine,缩写为NTVDM),在上面执行一个修改过的DOS。原本以DOS为基础的系统使用传统的COMMAND.COM做为命令行界面,而Windows NT及其派生版本则是使用cmd.exe(不过cmd.exe也移植了许多DOS的命令)。x64架构的Windows也有cmd.exe(命令提示符),但是无法执行16位DOS程序(没有NTVDM)。
CMD
CMD命令提示符,(command)的缩写,是 Windows 系统中的命令行窗口。Windows 系统内部保留了可以执行 DOS 命令的 CMD 命令行窗口,但CMD 只是一个 Windows 下模拟 DOS 环境的程序,脚本是批处理,语法不完整,逻辑有缺陷。
CMD可以执行很多 DOS 命令,但是不能运行 DOS 程序。只能调用 Win32 或 Win64 的程序。
Shell
Shell 本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell 脚本编程,完成更加复杂的操作。Shell是Linux必有的,类似于 DOS 下的 command和后来的CMD。Shell的脚本十分完整,逻辑也严谨。
DOS命令
| 命令 | 备注 |
|---|---|
| MD | 建立子目录 |
| CD | 改变当前目录 |
| RD | 删除子目录命令 |
| DIR | 示磁盘目录命令 |
| PATH | 路径设置命令 |
| TREE | 显示磁盘目录结构命令 |
| DELTREE | 删除整个目录命令 |
| FORMAT | 磁盘格式化命令 |
| SCANDISK | 检查磁盘当前状态命令 |
| UNFORMAT | 恢复格式化命令 |
| DISKCOPY | 整盘复制命令 |
| VOL | 显示磁盘卷标命令 |
| SCANDISK | 检测、修复磁盘命令 |
| DEFRAG | 重整磁盘命令 |
| SYS | 系统复制命令 |
| COPY | 文件复制命令 |
| XCOPY | 目录复制命令 |
| TYPE | 显示文件内容命令 |
| REN | 文件改名命令 |
| FC | 文件比较命令 |
| ATTRIB | 修改文件属性命令 |
| DEL | 删除文件命令 |
| UNDELETE | 恢复删除命令 |
| VER | 查看系统版本号命令 |
| DATE | 查看日期命令 |
DOS常用命令例
1 | cls //清屏 |
版权声明

Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Scholar’s Blog博客,版权所有,侵权必究。