当你发现自己遇到内存危机的情况,需要在DOS程序中使用超过640KB的内存时,你可以用几种办法来获得更多的可用内存。一种办法是使用磁盘交换技术(disk swappin’g),即把内存中不需要的数据元素(变量、数组、结构等)写到磁盘上,并把它们原来占用的内存空间释放掉(使用free()函数),从而使程序获得更多的可用内存。当需要使用被交换到磁盘上的数据时,你可以把其它不需要的数据交换到磁盘上,然后把要用的数据从磁盘上读到内存中。遗憾的是,这种办法要求编写大量的代码,而且实现起来比较麻烦。
另一种获得超过640KB可用内存的办法是使用其它内存资源一EMS(扩充内存)或XMS(扩展内存)。EMS和XMS指的是分配640KB区域以上的内存的两种方法,下文将分别对其进行介绍。
EMS指的是扩充内存规范(Expand Memory Specification),它是由Lotus,Intel和Microsoft共同制定的,用来在IBM兼容机上访问1MB以上的内存区域。目前该规范有两种版本在被使用:LIM3.2和LIM4.O。LIM4.O是新的版本,它克服了LIM3.2的一些局限性。在装入扩充内存管理程序(例如DOS中的EMM386.EXE)后,你就可以使用扩充内存了。你的程序可以向扩充内存管理程序发出要求使用扩充内存的请求,扩充内存管理程序将使用一种叫做成组交换(bank switching)的技术,把位于IMB以上区域中的内存暂时移到640KB和1MB之间的上位内存中的一个空闲区中。成组交换技术包括这样一些内容:接受应用程序的内存分配请求,并通过每次分配16KB上位内存的方式来映射并管理1MB以上区域中的内存。
扩展内存在装入扩展内存管理程序(例如DOS中的HIMEM.SYS)后才会起作用。你的程序可以向扩展内存管理程序发出要求使用扩展内存块(EMB)的请求。在申请扩展内存时,不需要使用“成组交换技术”,你的程序只需向扩展内存管理程序发一个函数调用来申请一块位于1MB以上区域中的内存。不幸的是,在DOS下位于1MB以上存储区内的代码无法被执行,因此你无法执行在扩展内存中的代码。同样,你也不能直接寻址存在扩展内存中的数据,所以,许多程序员喜欢在常规内存(640KB以下)中建立一个“缓冲区”,从而为常规内存和扩展内存提供一个交换空间。
扩充内存所使用的技术比较旧,并且有些过时了。当基于DOS的带有扩充内存的计算机刚出现时,扩充内存的使用极为普遍。使用扩充内存技术比使用扩展内存技术要慢一些。实际上,通过在config.sys文件的EMM386.EXE设置项中加入NOEMS标志,今天的许多PC机配置都已完全取消了扩充内存。大多数现代程序已经放弃了旧的扩充内存技术,而使用了新的扩展内存技术。
如果你的程序要在高于1MB的区域内寻址,你应该使用扩展内存而不是扩充内存。与使用扩充内存时相比,在使用扩展内存时,你的程序将获得更高的稳定性和执行速度。
实现扩展内存和扩充内存的具体步骤已超出了本书的范围。如果要解释如何用这些技术来访问内存,恐怕就要再写一章了。EMS(扩充内存规范)和XMS(扩展内存规范)文档可以直接从Mcrosoft公司获得,也可以从CompuServe这样的网络服务器上卸载下来,这些文档详细地介绍了EMS和XMS的应用编程接口(API)以及每一项技术的具体用法。