PC内存结构的变迁

Author: Date: 1995-03-31

        众所周知,最初的PC机是围绕INTEL 8086/8088 CPU设计的。其地址总线为20位,因此可以寻址220=1024KB(1MB)的内存地址空间。PC上所用的DOS操作系统由于受8086/8088处理器的限制,也只能寻址1MB的内存空间,而且,当初PC机的设计者们把这1MB的地址空间划分成两部分(见图1):
        ·低640K内存地址,称为常规内存(Conventional Memory),用于程序和数据,包括DOS自身;
        ·其余384K内存地址,称为上位内存区(Upper Memory Area),保留供系统ROM BIOS、视频ROM BIOS和缓冲区,以及各种硬件接口卡使用,因此也称为保留内存(Reserved Memory)。
        这样便形成了DOS只能管理640KB内存的历史格局。
        从图1可知,上位内存区中通常还有一些未用的存储地址,称为UMB(上位内存块Upper Memory Block)。尽管这些地址块未被占用,但不在DOS管理的640KB范围之内,因此在DOS下如无特殊措施仍不能对其加以利用。
        对于早期的PC机,DOS能够管理和使用640KB的内存已是相当大了。但是,随着计算机应用的日益广泛和深入,应用程序越来越大,人们越来越感到DOS内存管理能力的不足。为了在DOS下能使用更大的内存,80年代中期,出现了扩页内存(也称扩充内存)(Expanded Memory)技术(见图2)。
        使用扩页内存,需要在微机的适配器槽上安装扩页内存板,软件需安装扩页内存驱动程序。通常,分配64K的UMB作为页框,扩页内存则以16K为一页;当需要访问扩页内存时,是把所需的页映射到上位内存区里的页框中。用这种技术,可以访问32MB的扩页内存。为了规定扩页内存的硬件(扩页内存板)和软件(扩页内存驱动程序)的技术标准,Lotus、Intel和Microsoft联合制订一扩页内存规范EMS(Expanded Memory Specification),因此扩页内存也称为EMS内存。
        以后,286机的寻址能力达到了16MB(24位地址总线,224B),386/486的寻址能力达到了4GB(32位地位总线,232B),但对于地址在FFFFFH(1MB)以上的内存单元(称为扩展内存Extended Memory),这些处理器必须切换到保护模式(Protected Mode)下才能寻址。而DOS是以实模式(Real Mode)运行的,只使用了其中20位地址总线,其寻址空间仍然只能达到1MB。尽管很多微机配置了多达数兆字节的物理内存,用户却不能直接管理和使用它们。虽然80286以上的机型也可以使用扩页内存,但扩页内存是将安装在适配器槽上的、在处理器寻址范围之外的物理存储器映射到上位内存区的页框中,并未发挥处理器寻址1MB以上内存地址的能力,页面的换进换出效率也比较低,而且只有采用了专门技术的应用软件才能使用它。因此扩页内存并未得到很广泛的使用,广大用户仍然希望能在DOS下使用扩展内存。
        为了使DOS下的用户能够管理和使用扩展内存,Lotus、Intel、Microsoft和AST联合制订了扩展内存规范Extended Memory Specification,简称XMS(因此扩展内存也称为XMS内存)。该规范对内存地址空间的划分如图3所示。
        其中,HMA(高端内存区High Memory Area)是扩展内存中的第一个64MB区域(实际上是64KB少16B)。它的存在比较特殊,在80286以上机器上,通过启动第21条地址线A20,可在实模式下对其进行访问。如前所述,UMB是上位内存区中一些未用的存储地址,XMS规范也对它的分配和管理作了规定。
        DOS 5.0及以上版本皆提供了符合XMS规范的设备驱动程序HIMEM.SYS,用来管理系统和应用程序对扩展内存的访问。通过使用HIMEM.SYS,可把DOS自身放入HMA,从而腾出更多宝贵的常规内存空间供应用程序使用。它还支持把扩展内存用作虚盘,或把扩展内存用作高速缓存,以大大提高运行效率。
        对于80386以上的微机,还可使用DOS(5.0及以上版本)提供的另一个设备驱动程序EMM386.EXE。它的作用有二:
        ·它使DOS能够访问上位内存区,从而使得其他设备驱动程序和内存驻留程序(TSR)能够被装入UMB,应用程序也能够使用UMB;
        ·它可以用扩展内存来仿真扩页内存(见图4),这样,以前开发的需使用扩页内存的应用程序,在没有扩页内存、但有扩展内存的机器上仍然可以运行,而且换页效率大大提高。总之,现在即使在DOS环境下,只要在理解各类内存概念和PC内存结构的基础上,正确利用高版本DOS在内存管理方面提供的支持,充分优化内存是完全可以实现的。