有关内存的问答

Author: 何宗琦 Date: 1997-01-01

#3  问:1.传统扩展内存和XMS扩展内存有什么不同?
  答:传统扩展内存和XMS扩展内存虽然都是指1MB以上的内存,但是两者的定义和使用方法是不同的。它们是两类不同的内存储器。
  微机在由8086发展到80286后,其地址线由16位扩展到24位,采用80386处理器后,其地址线又扩展到32位。因此其直接寻址范围远远超过1MB的范围。在1MB以上的地址空间安装的物理存储器就是扩展存储器(extended memory)或称为扩展内存。但是,DOS系统只能在实方式下工作。在实方式下,物理地址只能使用20位,寻址范围只有1MB,因此并不能直接使用扩展内存。在应用程序中要使用扩展内存,只能用BIOS的中断调用来实现。利用BIOS INT 15中的87号功能可以使用1MB以上的扩展内存。但是BIOS和INT 15调用本身不够严谨,使得使用扩展内存的各种软件之间经常发生冲突,以至不能正常工作。
  为了解决上述问题,避免冲突,更好地使用扩展内存,1988年由Microsoft、Intel、Lotus和AST四家公司共同制定了一个管理使用扩展内存管理程序,就是众所周知的HIMEM.SYS。只要运行HIMEM.SYS,就把原有的扩展内存纳入XMS的管理之下。这时,如果想使用扩展内存就必须用XMS标准提供的方法来调用。为了区别这两种不同管理方法的扩展内存,就把早先无任何管理软件而只能用BIOS INT15来使用的扩展内存称为传统扩展内存;而把由XMS规范管理的,按XMS提供的调用方法来使用的扩展内存称为XMS扩展内存。
#3  问:2.在内存中可不可以同时存在传统扩展内存和XMS扩展内存?
  答:可以。这在《如何配置内存》一文中已经介绍过了。只在DEVICE=HIMEM.SYS命令后加上参数/INT15=memory size就可以了。参数中的memory size是要求保留的传统扩展内存的大小值,以KB为单位,取值范围是64~65535。一些早期的应用程序需要使用传统扩展内存,如果你需要使用这种应用程序,那么在内存中同时存在传统扩展内存和XMS扩展内存这两种内存是必要的。由于物理存储器的大小是一定的,增加传统扩展内存的容量就势必减少XMS扩展内存的容量。所以,如果你的应用程序不需要传统扩展内存则不必设置它,以避免造成浪费。
#3  问:3.怎么知道内存中传统扩展内存和XMS扩展内存的容量?
  答:可以用MEM命令来查看内存中传统扩展内存和XMS扩展内存的容量。但是,不同版本的DOS显示信息的形式不完全相同。下面以PC-DOS 7.0的MEM命令来举例说明。
  ●不使用HIMEM.SYS命令行。这时没有XMS扩展内存,只有传统扩展内存。用MEM/D命令可以看到:
  Total Extended(XMS)  7,340,320(7,168K)
  Free Extended(XMS)  0(0K)
  Memory accessible using INT 15H  7,340,032(7168K)
  提示信息显示:扩展内存(物理存储器)共有7168K,全部只能为INT 15调用,可以使用的XMS存储器为0K(表示没有XMS扩展内存,只有传统扩展内存)。
  ●使用HIMEM.SYS命令行,不加参数,这时只有XMS扩展内存,没有传统扩展内存。用MEM/D命令可以看到:
  Total Extended(XMS)   7,340,032(7,168K)
  Free Extended(XMS)   5,177,344(5,056K)
  Memory accessible using INT 15h  0(0K)
  提示信息显示:扩展内存(物理存储器)共有7168K,可以使用的XMS存储器为5056K,供INT15调用的为0K(表示没有传统扩展内存)。
  ●使用HIMEM.SYS命令行,加参数/INT15=1024,这时XMS扩展内存和传统扩展内存同时存在,传统扩展内存的大小为1024KB。用MEM/D命令可以看到:
  Total Extended(XMS)  6,356,992(6,208K)
  Free Extended(XMS)  4,194,304(4,096K)
  Memory accessible using INT 15h  1,048,576(1024K)
  提示信息显示:XMS存储器共有6208K,可以使用的还有4096K,可供INT15调用的为1024K(传统扩展内存为1024K)。由于保留了1024K的传统扩展内存,所以XMS扩展内存的尺寸减少为6208K。细心的读者可能已经发现,6208+1024=7332K,大于6168K的扩展内存物理存储器164KB,那么这164KB是从哪里来的呢?这是利用“地址重定位”功能从1MB内的384KB保留物理内存中“挖”来的。因为,这386KB保留物理内存一般并没有全部用作SHADOW RAM(影子内存),可以用“地址重定位”或“地址映射”的方法把剩余的某部分“挖”来使用。