3页 第一部分DOS概述 第1章DOS简介 在进一步阅读本书之前,首先要清楚什么是DOS。本章首先扼要地介绍DOS操作系 统,再简短地介绍操作系统的历史,以说明DOS产生的历史渊源。本章的内容还将涉及 DOS结构及接口。因为这是一个非常粗略的介绍,所以不要关注一些尚不清楚的术语,因 为在本章之后的其它各章还会对其进行更详细的解释。 1.1 什么是DOS DOS由四个基本模块组成: ·引导记录(The boot record)此记录起始于每个磁盘的0道、0扇区、第1面上, 是由DOS FORMAT命令格式化磁盘时放入的。对于硬盘,引导记录位于DOS分 区的第一个扇区内。这个需要一个扇区空间的记录,标识了该磁盘,并含有用于引 导该磁盘的初始化程序。 · BIOS 基本输入/输出系统(BIOS)是存放在ROM中的。这个面向物理设备的 低层接口,使得各种软件可以透明地使用各种变幻莫测的硬件设备。对于DOS它 也通过从磁盘中调入I/O来扩展其功能。 · DOS程序 DOS是通过两个程序来实现的。一个是O/I系统,它是从磁盘中调 入的接口模块,用来扩展ROM BIOS的功能,并包含有标准的设备驱动程序集。 另一个文件是磁盘操作系统(DOS),它是一个所有运行在计算机上的程序的高层 接口,而不管该程序是否使用磁盘。 ·命令处理程序(The command processor)大多数人认为该模块即是DOS。命令 处理程序是人们工作在该系统下运行DOS服务的标准界面,它产生命令提示符 (C>),接收命令,并执行用户向系统请求执行的各项任务。 各个模块将在第2章“DOS系统结构”和第3章“动态的DOS” 中详细介绍。然而我们 在这里还是作些基本的介绍。 BIOS提供了一系列功能,程序员可以利用这些功能来完成各种操作而不必关心底层 硬件的细节。在本书中,我们将利用BIOS来执行各种实例程序里的必需操作。在本书第 五部分“参考手册”中,按顺序详细介绍了BIOS中每个功能的作用。 虽然BIOS功能非常强,但它离完整性还差得很远。建立在BIOS基础上的DOS平 台,为编程者提供了很多必要的服务。在通用的操作系统(如DOS)成为现实之前的早期 4页 个人计算机上,程序员所写的程序中,常常包含有与DOS功能等同的内容。因此,跟踪应 用程序的过程,也是非常复杂和可怕的。 由于DOS功能的编程已由Microsoft(和其它厂商)完成,DOS已成为读者在程序开 发中的伙伴。虽然不能认为DOS中的一切都工作得非常正确而不会出错,但可以假定 DOS是坚实的(除非有其它已证实的理由)。第五部分则包含了各种DOS功能的一项一 项详细介绍。 1.2 DOS的历史 多少年以来,DOS一直被当作微型计算机的最原始的操作系统。今天的DOS,所拥有 的用户数比任何其它操作系统要多得多。它已变得非常复杂,是一个带有各种工具和应用 程序来满足各种需要的操作环境。 DOS富有远见卓识之处就在于,它能处理各种复杂的微处理器的复杂特性,如80386 和80486等。将来的DOS版本,甚至可以处理多任务,支持多用户,尽管Microsoft公司还 没有明确地提供这方面的信息。一些人可能会对此心存疑问,特别是出现了新一代操作系 统—Windows和Windows NT之后。 DOS首先是由Seattle Computer Products公司为其计算机将86—DOS第一次注册的。 DOS的最原始程序是由Tim Paterson编写的。它开始于1980年8月,第一个产品诞生于 该年的8月。那时,Digited Research的CP/M操作系统在微机操作系统领域有着广泛的 应用。86-DOS的一个特殊设计是CP/M的应用程序很容易转换过来,它保留了同样的文 件控制块结构和功能,因此,可以自动地将CP/M的程序转换到86—DOS上。 因为86-DOS只能工作在1980年刚上市的8086/8088 CPU芯片上,所以很少有人知 道它的存在。但那些已经从8位的8088/Z80标准和CP/M系统升级到s-100系统的人 们,已经出现了86-DOS的用途,同时,Seattle Computer Products公司也已建立了拥有几 个多客户的市场基础,其中至少还包括一两个硬件制造广商,与此同时,Microsoft公司也 在与SCP公司接触,要他们为一个未知的公司研制一个新的版本。而在当时,没有人(除 Microsoft公司外)知道,IBM也在寻找一种操作系统。在1981年1月,Paterson知道了那 个客户的名字,并且Microsoft公司已经将从86-DOS分离出的版本注册在他们自己的名 下,那年4月,Paterson离开了Seattle Computer Products公司,加盟到了Microsoft,以后 几个月,他按照IBM的需要,进一步裁剪了该系统。 在1981年7月,Microsoft从Seattle Computer Products公司那里,以相当低的价钱 (少于10万美元)购买了86-DOS的全部版权。以后,SCP公司对此交易提出过起诉,最后 法院判决Microsoft支付了数百万美元的补偿。其结果是Microsoft公司毫无异议地永远 拥有了最流行的操作系统的版权。 当1981年8月10日IBM发布PC时,Microsoft同时准备了MS-DOS 1.0(对于IBM 机器为Personal Computer DOS,并非PC DOS,IBM从来不接受PC DOS这个大众化的术 语,以后IBM版本也都简称为DOS。) Paterson在1982年结束了直接参与DOS工作的生涯,但他仍活跃在PC舞台上,最 5页 近他作为各种派生的BIOS的专家,在Phoenix Technologies公司担任顾问。 在PC原始版本发布后,DOS在一些市场中还没有成为主流。 IBM还选择了CP/M- 86和Softech的P-system作为PC的可选系统。然而,卖主很少代理这些产品,也很少有 可以在这些操作系统上使用的开发语言。此时,Microsoft已经在编程语言方面也获得了 良好声誉。IBM用DOS发布自己的软件,开发者就迅速捡起这个从未停止过转动的球,开 发出了新的功能。 CP/M-86和P-system也从来没有脱离PC市场,它也一直在参与着市 场的竞争。 DOS已经正式修改过很多次(并且一直还有许多版本并非是为通用系统而设计的), 尽管每次发展总包含一些改进和错误纠正,但实际上每次版本都对应着一些硬件的改变 —其中的一种就是磁盘格式和容量的改变。 表1.1列出了正式公布的主要DOS版本(按日期)和主要的改进。本表中还未包含那 些非主流的版本。 表1.1 DOS的各种版本 版本 日期 硬件或操作系统上的更新 86-DOS 1980.8 Seattle Computer Products的版本(1980年4月开始设计, 作者Tim Paterson)。 1.0 1981.8 原始PC机,单面磁盘 1.1 1982.3 双面磁盘,日期时间印记 1.25 1982.3 第一个OEM版本(ZDOS),增加了VERIFY。 2.0 1983.3 PCXT,包括硬盘。 2.1 1983.10 IBM PCjr和便携式PC。 3.0 1984.8 PC AT,包括高密度磁盘。 3.1 1985.3 网络。 3.2 1985.12 扩充支持新的介质。 3.3 1987.4 支持PS/2。 4.0 1988.6 支持大于32M的硬盘驱动器。 EMS内存性能的集成支持。 5.0 1991.6 支持XMS,高位内存块(UMB)和HMA。 6.0 1993.3 支持磁盘的压缩,碎片去除,改进的CONFIG.SYS结构, 防病毒产品。 综合表1.1可以看出,每个新DOS版本的性能提高和其所需的内存量总是相对应 的。DOSV1.0可存在于16K内存之下,原始的IBMPC只允许使用64K内存。版本2至 少需要24K内存(如果安装设备驱动程序的话,还需要更多的内存)。任何可用的程序至 少需要128K的最小内存。作为版本3,DOS需要36K内存(如果安装设备驱动程序和文 件外壳的话,所需更多),机器如果少于512K内存几乎不能使用了。对于版本4, 512K变 成必需的内存,并且640K以上内存(扩展内存和扩充内存,详见第2章)利用变成了现 实。因为内存紧张,DOS5.0提供了将DOS调入高位内存的方法,这样,它看上去便比 DOS 4少用了传统的常规内存,但它使用了更多的高内存区。最后,DOS6是一个最强大 的DOS版本,但它提供了一个改进的内存管理方法,使得已经安装的内存能发挥出最大 6页 的效益。 让我们了解一下每个DOS版本所包含的改变之处。在这本书中,我们有一些约定,如 V1,表示的是版本1,但也包括V1的子版本;而v1.n表示v1版本的子版本n。 1.2.1 1.0版 · DOS V1.0是支持PC的最原始系统。它支持基本的单面、8个扇区(8-sector磁盘格 式,并且提供了所有基本的磁盘服务。主要的改变(相对cp/M而言)是,它包括了支持磁 盘目录结构、管理文件属性及文件大小的功能。版本1.0还加入了比原始86-DOS改进的 磁盘分配和管理功能,更好的操作系统服务程序以及启动初始化时执行AUTOEXEC .BAT批处理文件的功能。IBM只是向生产厂家发放此版本。有趣的是,这个DOS版本没 有包括文件的日期和时间印记,这也是它和以后DOS版本的一个主要区别。 1.2.2 1.1版 在版本V1.1(最后一个只属于IBM的版本),加入了日期、时间印记,并且加入了支 持双面磁盘的驱动程序,还有一些错误更正。它发布于1982年3月。 1.2.3 1.25版 · V1.25是第一个非IBM的而由原始设备制造厂商(OEM)发布的版本。(版本号从 1.1跳到1.25对应了IBM版本号和Tim Paterson个人修订控制系统版本的不同,IBM V1.1就是众所周知的版本V1.24)。在这个版本中加入了VERIFY功能,即加入00h作为 目录结束标志字节(IBM的版本到2.0才出现了该功能)。 V1离统一的标准还差得很远;Microsoft不直接向最终用户销售该产品,而是授权给 OEM厂商,由它们任意修改,甚至可以更名(例如Heath-Zenith公司在1982年3月,将它 改为ZDOS,成为第一个非IBM使用的DOS)。 1.2.4 2.0版 在DOS V2.0中,增加了支持双面和单面9扇区格式的软盘、硬盘和在pcjr下使用 磁带的功能。 DOS的服务程序也大大改善了。这个版本还加入了类似UNIX的分层式结 构的文件系统。下面列出了DOS V2.0中的一些主要改进之处: ·文件句柄 ·I/O重定向 ·管道 ·筛选程序(或称为滤符程序) ·假脱机打印 ·磁盘卷标 ·扩充的文件属性 ·系统配置文件 ·程序环境块维护 7页 ·ANSI显示驱动程序 ·程序内存的动态控制 ·支持用户自定义的命令处理程序 ·国际化支持 和V1一样,V2也授权给做了改变的OEM厂商。在这个时候,大多数OEM厂商知 道为了市场因素,要接近或全部和IBM的机器兼容,因此,改变就很小。一些公司像 Tandy公司的2000型号(它是第一个使用MS-DOS V2.0的机器),是到目前为止修改 DOS最多的厂家,在其BIOS中提供双重的向量来和IBM BIOS保持兼容。 在版本2中,版本相同,但来自不同的OEM厂商的不同版本还可以发现一些不同之 处。几乎所有V2版本都存在这种情况。 1.2.5 2.1版 在2.1版中,只增加了对时钟的改变,以便更加适合于IBM的PC杠和便携式PC机 的需要。 MS-DOS的这一版本,如已知的2.11版,现仅在少量机器上出现过,如东芝的 便携式组合设备,就已经将V2.11固化于ROM中。 1.2.6 3.0版 DOS V3.0是为IBM个人计算机(Personal Computer)AT(PC/AT)提供的早期版本。 这个版本增加了支持高密度(1.2M)软盘和附加的硬盘格式,增加了支持网络磁盘功能的 技术基础,下面列出了主要的新特性: .应用程序控制的假脱机打印 .扩展的错误报告 .建议的错误恢复码 .文件的记录锁定支持 尽管IBM和Microsoft版本到今天还有些不同,但V3的公布标志着OEM厂商自由 更改DOS结构的结束。例如,对于IBM,它提供的支持实用程序都作为COM文件,而Mi- crosoft则是以EXE格式来支持,而在众多的编码中,则很少有明显的区别。 然而,对网络操作支持,就非常有必要在DOS结构上,特别是在内部数据格式上执行 严格的统一标准,OEM合同也按照这个要求进行了修改。从这个时候开始,DOS的关键 部分基本上稳定了下来,这使得以前没有支持的开发者,现在有了技术上的支持,开发就 变得容易了。 1.2.7 3.1版 DOS 3.1增加了网络磁盘,包括支持文件共享,并修正了一些错误。这个版本在一段 时间内,已经成为销售商的标准。 1.2.8 3.2版 3.2版增加了支持3.5英寸软盘的功能。它还将格式化控制集成到外围设备驱动程 8页 序中。3.2版是Microsoft以其自己的名字出售给最终用户的第一个版本。 1.2.9 3.3版 在DOS3.3中,增加了两个新的用户命令(ULSFUNC和FASTOPEN)和两个新的 功能,升级了很多其它服务程序,设备支持也覆盖到了IBM PS/2系列。该版本有影响的 地方是,DOS的管理和开发工作,从Microsoft转到了IBM,以解放Microsoft,使之专心致 致地开发iBM的OS/2源程序(作为交易的一部分,IBM把自己的OS/2开发权转让给了 Microsoft)。两个公司都继续公布和支持其特有的产品版本。 1.2.10 4.0版 在DOS 4.0版本中,扩充了很多用户命令,增加了许多功能,并且指出了图形用户外 壳程序。然而,最主要的改变是增加了支持超过32M容量的硬盘驱动器,并且将扩充内存 (expanded memory)驱动程序作为DOS的一个标准部分。(这些特性在那时已被作为附加 的可选部分。) 两个月以后,IBM发布了升级的版本4.0—在磁盘卷标上标识为V4.01—该版 本更正了一些错误,而VER命令仍然标识该版本为4.0,只有通过查看两个隐含文件和 SHARE.EXE文件的日期和时间区分这两个版本。4.01版所标明的日期为08/03/88或 更晚,而4.0版的日期06/17/88。 Microsoft延迟一段时间后,也发布了它自己的4.0版, 其4.0版等效于IBM的4.01版。过了不久,Microsoft又发布了进一步修正其错误的4.01 版本。 1.2.11 5.0版 在DOS5.0版中,增加了支持扩展内存(extended memory)的功能,改进了很多用户 命令,增加了一些新的用户命令,主要的有UNDELETE、UNFORMAT、MIRROR以及鼠 标响应,全屏幕文本编辑器等,增加了在外壳程序中支持的任务切换器API(应用程序接 口)。 DOS核心已重新构造,第一次使得DOS减少了空间。另外,DOS现在可以运行在 ROM中。只有使用SHARE命令才能安全地支持超过32M DOS分区的要求,也已不再是 必要的了。 从DOS 3.3以后,DOS V5.0是第一个真正由Microsoft更改的DOS版本。Microsoft 支持的V4.0版是IBM DOSV4.0逆向工程的结果。 1.2.12 6.0版 DOS 6.0版在1993年3月发布。主要改变在于为操作系统增加了很多实用程序。例 如,新增加了如下几个很有用的实用程序: · Anti- Virus Protection(防病毒保护)这个实用程序可运行在DOS和Windows 下,保护系统免受已知病毒的侵犯。 Anti-Virus也可增加新病毒的有关信息。 · Deleted file recovery(删除文件恢复)这个实用程序可以恢复被误删除的文 件。与第三方产品不同的是,UNDELETE为用户提供了三个层次的安全服务。 9页 · Disk doubling(磁盘压缩)这个实用程序调用DBLSPaCE来压缩磁盘文件, 在使用压缩过的文件时,又对其解压缩。 · File backup(文件备份) 该实用程序是经过改进的Backup,由菜单驱动,该实 用程序可将硬盘数据拷到软盘做备份工作。在DOS和Windows下都可以运行。 ·改进的内存管理 MEMMAKER是通过修改CONFIG.SYS和AUTOEXEC .BAT文件来优化使用内存的实用程序。 另外,其它一些DOS实用程序也做了改进。CONFIG.SYS文件结构也被改成可以有 多个启动序列。例如,可以有一个特殊的配置用于支持使用CD-ROM,另一个配置用于支 持磁带驱动程序。 DOS在每次启动时便会询问用户选择哪一个启动序列。 1.2.13未来展望 对程序员来说,DOS继续发展,将使新的服务和选项成为可能。像Microsoft Windows 和DESQview这样的窗口环境的出现,已经为还在DOS层次编程的程序员提供了新的更 复杂的服务功能。每增加一个新的服务,就可能使更多的机器硬件代码从程序中隐去,同 时又为用户创造了新的功能。这种不断增加的新功能,会导致牺牲程序的运行速度和响应 速度,而造成了太高的代价。但是,随着处理器速度的加快,对低层次进行的编程需求在不 断地减少。应用程序将主要使用DOS的服务和它的类似物。只有系统级的程序员才需要 工作在DOS内部,Windows或DESQView将不必担心去直接访问机器和它的服务。这就 是未来技术发展的趋势。 1.3 DOS的结构 因为本书的目的是深入地探讨DOS和PC系统,因此,应注意到系统的分层功能。图 1.1将有助于你理解这种层次的结构。 图1.1系统层次图 设计整个DOS/PC系统的基本思想是一种“系统套系统”的设计途径。在系统的底 层,是从电子电路开始的。例如,正是带有一定功能和特点的电路(称为计算机)实现了 10页 设备。 BIOS又用严格定义的功能和特性与此电路层组合成一体,形成了一个新的,“计算机 系统”。BIOS层是通过具备了标准属性的设备来描述其特性的。不管使用的是何种显示 器,也不管购买了何种键盘,BIOS都认为它们的响应是相同的。总之,所有BIOS的这些 特性,使得它有能力支持一个编程环境。在这个环境中,人们开发出了DOS。为使DOS和 各种厂家标准的BIOS之间的接口标准化,DOS设计者引入了一个缓冲层,使用者通过它 来调用I/O系统。它经常被认为是BIOS的一部分。然而,由于此I/O系统层是从磁盘装 入的,它是DOS系统的一部分(并且会在需要时进行修改,以满足DOS的要求),技术上, 应将它看作是DOS整体的组成部分,因为它们之间的关系比它与BIOS之间的关系更密 切。 DOS环境仍定义的是一个计算机系统,但它是在一个更高层次上。可以管理文件和 文件系统的语言在这个层次上被引入,语言就像是基于此设备一样。在这个层次,DOS在 标准化的环境中集成了用户所需要操作的特性。例如,不管使用的是Toshiba的还是 Maxtor的磁盘,系统都将同样地对待它们。对在DOS上工作的程序,详细的低层情况就 不重要了。 在下个层次(命令处理器)上,是另一个以与设备无关,但能与设备交互为标志的计算 机系统,在这个层次上,可以将设备和文件按相同的方式处理,尽管DOS是按顺序执行 的,但在命令处理器层,可以将结果直接输出到文件(正常情况下,是输出到屏幕)。在这里 不必考虑各设备速度的差异和各设备之间的不同之处。 再上一层是由应用程序定义的计算机系统。因为这个系统是面向用户而不是面向程 序员的,所以这个接口更加简单。现在的“计算机语言”是由菜单选择和窗口组成的。这一 层,和其它层一样,也是建立在下一层次之上的。 当阅读本书或按个人的爱好,跳过这些层次工作时,要留意跳过部分系统层次的得和 失。因为DOS是建立在BIOS程序之上的,因此程序越过DOS 环境而直接到BIOS,能影 响到DOS工作的方式。例如,你可以在BIOS层用磁盘读和写功能来写一个自己的文件 处理程序。但如果这样做,也许得花整年的时间来做和DOS一样的工作。反之,你也可以 只停留在顶层,但更低的层次却可以让你的程序提高运行速度。这是一个复杂性与速度的 交替过程,如何选择,全在于程序员自己。 1.4 DOS的程序员接口 在高级语言工作的程序员,习惯于工作在预定义的功能上。在BASIC中,所有功能 (PRINT和INPUT)都是在语言中定义的,Pascal同样也定义了可以使用的各种标准功 能函数。C和c++编译器带来了一个标准的库函数集合。对大多数人来说,这些功能便 代表了此语言的功能。事实上,在BASIC、c/c++和Pascal中提供的功能是基于更低层 次的DOS和BIOS功能的。语言的功能以标准的方式被写成对该服务所需的处理过程。 在一些情况下,语言的功能被定义成和国家或国际标准兼容的功能。然而,要完成该功能, 必须将其直接对应于DOS、BIOS或硬件设备。 11页 通常,在高级语言功能层之下的功能领域是受保护的。因为高级语言功能是为很多不 能让“编程方式脱离纸袋”的人们通常使用而设计的。这些功能必须提供错误检测和综合 情况的控制。综合是一个缓慢的过程,因此就不得不牺牲速度。如果花时间学习的话,DOS 和BIOS服务程序可以在任何语言中被直接调用。 软件中断是使用DOS和BIOS服务程序的一种手段。(第11章“中断处理”将讨论中 断。)在前文中,软件中断被作为高级语言的子程序来调用。要设置所有参数并可得到结 果。但是如果没有纯熟的使用高级语言功能的方法,就很可能陷入困境。 如果进入上述的高级语言功能,则得到的不光是它的错误检测,控制能力和标准库的 可靠性,还可以得到的另一个优越之处,是它的可移植性。用标准的Microsoft C或Turbo C所编写的C程序经常只需要经过一些小改动,就可直接用在UNIX系统中。 DOS和 BIOS功能就不行,但是可以建立自己所需的错误检测和控制,而不需要像Microsoft或 Borland公司程序员要考虑的那样,要适合整个市场的要求。 走进DOS和BIOS层,将得到控制的深度和程序的速度,代价(一些很小的额外的编 程量)是很小的。要想达到可能的最高速度,就需要直接存取硬件设备。这样的操作常用 在像屏幕显示器和串行口这样的设备上,而很少或不用在象磁盘这样的设备上。 通常,对一个运行可靠、但速度较慢的程序,可以通过进行在低层次重新编写关键模 块或通过改变程序算法来加快程序的运行。在这本书中,将提供在各个编程层次的工作的 正反两方面的内容。由使用者来决定哪个更合适于自己的应用。但是,按照一般规则,总 是先工作在尽可能高的层次上。当运行程序时,就很容易发现错误。如果进入低层,很多 细微的错误就很难发现。 1.5小 结 IBM兼容系列计算机已经构造好了强大的BIOS和DOS功能。 BIOS向外部世界提 供了低层接口;DOS提供高层次的服务功能来增强计算机程序的能力。和世界上大多数 操作系统一样,每一个成功的DOS版本都为计算机应用建立了一个稳固的基础。 怎样开发程序,使用什么语言,使用BIOS或DOS服务程序等等之类的选择,主要是 由编程的需要来决定的。对所做的编程方式的选择,一定要综合地权衡各种方式的得与 失。根据所考虑的选择方式和采取的各种策略,便能找出最适合于使用者的计算机系统工 作的方式(而不是让它碍手碍脚)。本书的写作宗旨就是基于这样的想法:积累使用者的编 程经验,使它能充分地发挥出计算机的威力。 在第2章里,我们将讨论DOS的结构,更贴近地探究一下这个DOS建立于其上的软 件基础,并看看它与所开发程序之间的关系。我们还将讨论到,作为一个程序员,如何在 DOS环境下,利用各种工具、资源和构件,构造出灵活舒适的软件大厦。