专家会诊

Author: 朱曦 Date: 1997-01-01

#2  肖召:广西南宁电力设计院梁思伟来信谈到有关内存管理的问题,他说关于系统配置文件CONFIG.SYS中的DOS=HIGH这一行,有的资料介绍它是将DOS装入1024~1088K之间的高位内存区,但要求先运行HIMEM.SYS,即把DOS=HIGH命令放在DEVICE=HIMEM.SYS命令之后,而又有的资料建议把DOS=HIGH命令写在DEVICE=HIMEM.SYS的前面,说是这样才能避免高位内存被占用,而把DOS装到高位内存区中,到底哪种说法正确?针对这个问题,我们组织有关专家进行了讨论,他们对这个问题的看法如下:
  朱曦:在286以上档次的计算机中,由于CPU直接寻址范围超过了1MB,而且实际内存容量也常有超过1MB的情况,所以对超过1MB以上的内存如何管理和使用就成了问题。为了讨论方便,首先让我们再明确一下有关内存的一些定义。
  习惯上对PC机内的实际内存一般分成以下几个部分:
  0~640KB:一般称为常规内存。
  640~1024KB(1MB):一般称为保留内存或上端内存区UMB(Upper Memory Blocks),上端内存区的底端是显示缓冲区;上端内存的顶端是系统ROM区;上端内存的中间部分常被定义为EMS页面区或上端内存块。
  一般将1MB以上区域的内存称为扩展内存(Extended Memory),而扩展内存中的第一个64K块,即1024~1088KB,又被称为高位内存(High Memory)区或高端内存区,即HMA。当然对于1088KB以上部分,一般都称为扩展内存块(Extended Memory Blocks)了。
#3  郭志忠:扩展内存和扩充内存这两个名词经常把人们搅得糊里糊涂,因为扩展和扩充这两个中文词的意思本来就十分接近,把它们用到专业术语上来区别内存和内存管理方式的定义真让人难以区分,就象要人们去注意区别“向左面走”与“往左面走”有什么不同这类语文问题一样讨厌。
  为了有效地管理和使用扩展内存,人们制定了一些管理规范,目前使用得最多的是扩展内存管理规范XMS(eXtended Memory Specification)和扩充内存管理规范EMS(Expanded Memory Specification)。
  人们常讲的Expanded Memory(扩充内存),并不是实际存在于系统内存中的一块地址空间,而是由扩充内存管理规范形成的工作内存。所以,它与常规内存所不同的是需要由内存管理程序来存取扩充内存。由Lotus/Intel/Microsoft三家公司规定的扩充内存管理规范常被简写为LIM EMS。扩充内存管理规范(EMS)常用的有3.2版和4.0版。DOS中常见的EMM386程序,还有象QEMM这类内存优化管理程序,都是具有将部分内存区域模拟成EMS工作方式的程序。
  何宗琦:由于DOS=HIGH和DEVICE=HIMEM.SYS都是CONFIG.SYS配置文件的命令行,因此也涉及到系统是如何处理CONFIG.SYS这个文件的。
  在系统启动时,完成上电自检后,即由INT 19自举程序把引导记录装入内存,执行引导记录将装入IO.SYS系统文件的Loader模块,然后把控制权交给IO.SYS中的Loader模块,由它完成系统装入和系统初始化工作。
  IO.SYS系统文件由Loader模块、IO1模块、IO2模块和IO3模块组成。其中IO3模块负责处理CONFIG.SYS配置文件。IO3的核心是系统初始化程序SYSINT-Ⅱ。
  SYSINT-Ⅱ的主要作用是转换CONFIG.SYS的文件内容,并识别DOS系统配置命令。转换CONFIG.SYS的文件内容包括:小写字符换成大写字符;系统配置命令名用对应的缩写关键字符取代;识别除DOS和INSTALL外的所有系统配置命令,并丢掉它后面的所有注释字符串……等共八项工作。识别DOS系统配置命令在这里实际上是设定一个标志,以后将根据此标志决定DOS的一部分程序(IO2模块和MSDOS2模块)是安装在基本内存还是HMA中。如果是装入基本内存则可直接装入,否则将识别并处理其它系统配置命令,其中也包括DEVICE=HIMEM.SYS命令,以便建立起HMA。在此之后,可根据DOS安装标志决定是否在HMA中装入IO2和MSDOS2模块。
  因此,转换CONFIG.SYS文件实际上是对该文件的第一次扫描,在扫描中除了作转换工作外还要识别出DOS命令,以设定安装标志。而对HIMEM.SYS的安装处理则是对CONFIG.SYS文件的第二次扫描完成的。如根据标志需要把DOS安装在HMA中,也是在这时才安装,而此时已建立起了HMA,所以不会出现问题。因此在CONFIG.SYS文件中,DOS=HIGH和DEVICE=HIMEM.SYS这两条命令出现的先后顺序并无什么关系,都能使系统正常工作。
#3  朱曦:操作系统中所配的HIMEM程序使得DOS程序可以按照XMS(eXtended Memory Specification)规范来存取扩展内存。只有执行了DEVICE=HIMEMSYS的扩展内存设备驱动程序,才能为DOS在后面的工作中有效地使用扩展内存提供条件。
  系统配置命令中的DOS=UMB是用于告诉MS-DOS保持一个对上端内存(UMB)的连接,而DOS=HIGH用于将DOS的部分内容装入高位内存(HMA)区域中。
  一般情况下,对于80286以上机型,我们可以在配置文件中加入DOS=HIGH,使DOS能够把很多内部表和缓冲区放入1024~1088K之间的高位内存区,但必须事先通过诸如HIMEM.SYS等内存管理程序(其它的程序还有QEMM.SYS等)来管理Extended Memory(扩展内存);但DOS在配置系统文件时,并不是完全按照CONFIG.SYS文件中一行行内容的排列顺序进行加载,而是判断整个CONFIG.SYS文件(包括多重配置)中是否有DOS=UMB项,其次判断是否有DOS=HIGH项,如果二者皆有,则在处理HIMEM.SYS等内存管理程序后将DOS内核放入高位内存区,并维持常规内存与上端内存间的连接;如果只有DOS=HIGH项,则只将DOS内核放入高位内存区,而不维持常规内存与上端内存的连接。由于系统对配置文件CONFIG.SYS的执行方式并不是完全按照顺序的,所以说DOS=HIGH可以放在CONFIG.SYS中的任何位置,而执行效果在一般情况下是相同的。
  郭志忠:其实随着Windows 95等系统的普及,由于这些系统已经具备了良好的内存管理功能,所以现在许多使用这类软件的用户实际上不需要考虑内存的配置和管理问题。即使是一般使用DOS 6.2的用户,由于DOS里已有一个内存优化及管理程序:MEMMAKER,用户只需在装完DOS以后,运行一下这个程序,按照屏幕的提示一步步地做,也能自动把内存管理好。从我主持“专家坐堂”栏目的这两年来看,询问内存管理方面问题的人已经越来越少了。
  我在去年玩游戏时,遇到过几个游戏,非要把CONFIG.SYS中的DEVICE=EMM386.EXE去掉才能运行,而另一些程序又非要有EMM386的支持才能工作,真是让人感到麻烦。不过今年以来,这样的游戏就没有碰见了。看来内存管理方式的统一是很有必要的。随着大容量内存的普及,16MB和32MB的计算机越来越多,人们逐渐减少了对那两三百K上端内存的兴趣,XMS成为内存管理规范的主流。如果以后编的程序都可以放到1MB以上的内存中运行,那么对于那些拥有16MB以上内存的计算机,内存管理的问题就变得比较简单了。