1.1 Static Memory Layout

 

[Home]  [Top]   [Next]


1.1.1 Overview

 

尽管我们总是以一个数字来说明一台PC机的物理内存数量(比如,我的PC机的内存是256M),但事实上,PC机的物理内存被分为多个不同的区域,尽管几乎每一个PC的用户都不希望是这样。这样的设计是IBM PC机早期版本的系统资源限制所造成的后遗症。

 

与其去责备这种内存组织方法,不如去看一看造成这种结果的历史环境。在1981年,当IBM PC机被初次发布的时候,1MB是个很大数量的内存。在那个时候最流行的家庭计算机是Apple,但它的内存最大只能访问到64KB,那个时候,一台微型计算机的内存通常只有8KB,并且内存非常昂贵,所以在当时,IBM PC机的设计者认为1M内存已经是海量内存了。

 

后来,由于计算机工业的迅速发展,1M内存已经显得捉襟见肘,而后续系统又必须和早期系统兼容,所以IBM PC机的内存被分为四个基本区域(有一些区域被进一步细分):


 

1.1.2 Conventional Memory

系统的第一个640 KB内存被称做Conventional Memory(常规内存)。之所以被这么叫,是由于在8086时代,这是仅有的可以被OS以及Application使用的RAM。而到了80286以及后续Intel 80x86时代,其它的RAM都只能在Protected Mode下被访问,而这块RAM却能够在Real Mode下被访问 (HMA是个例外,但那不是Intel设计的本意,事实上那是一个BUG)。所以,对于今天的PC来说,尽管有更多的RAM可供使用,但这640 KB常规内存在许多情况下仍然是最重要的,因为使用它们不需要任何的软件支持,也不需要进入Protected Mode受其复杂的机制的影响。常规内存占据物理地址00000h~9FFFFh。

为什么常规内存有640 KB的限制?原因是IBM所做的病态的决定——IBM把那些为系统功能保留的内存空间(UMA)放在常规内存的顶端,而不是将它们放在底部。在过去的20多年里,后续的PC为了保持向后兼容,一直在沿用这种模式,后来新加入的RAM(扩展内存)都从1 MB的位置开始,而与这640 KB RAM被UMA所分割。如果最初UMA被放置在常规内存的底部,那么后来扩展的内存就可以和常规内存连为一体,那么使用和管理这些RAM就会被简化很多。

但这640 KB也不是完全归用户程序或OS使用的,比如,起始位置的1 KB被用做BIOS中断向量表,随后的1 KB被用做BIOS数据区,在顶端的位置还有BIOS扩展数据区。这些空间在Real Mode下必须被保留。而当PC启动阶段,CPU默认处于Real Mode下,所以OS在Boot阶段如何合理的使用常规内存需要进行良好的规划。

一旦OS进入Protected Mode,常规内存就变的远没有在Real Mode下那么重要了,这个时候更大容量的扩展内存可以被使用(如果有的话),并且扩展内存还都是连续的。


 1.1.3 Upper Memory Area

PC机组织内存的方式有些让人感到困惑——欢迎来到最让人困惑的部分:)。在640 KB常规内存之上的384 KB部分被称为Upper Memory Area或者UMA,这是一个非常繁忙的地带。它非常重要,因为它是许多系统配置问题的根源。

UMA让人感到如此困惑的一个原因是它实际上是2个互相交叠的内存。这里存在一段占据物理地址A0000h~FFFFFh的RAM;然而,也有一段不同类型的ROM被影射到这段地址的大部分区间。其中,和ROM有相同地址的部分的RAM被系统隐藏了,它们被BIOS用做ROM shadowing。没有被隐藏的部分仍然可以被OS和Application使用。

为什么会造成这种情况?部分原因是为了实用:如果一台PC机有640 KB的常规内存,以及384 KB的UMA,那么你插在主板上的物理内存是连续的——没有一种实用的方法构造一个SIMM(Single In-line Memory Module,见本节末尾注解)为UMA留出一个384 KB的物理块(当然,从技术上可以做到,但成本比浪费这384 KB RAM的代价要高的多)。其它的主要原因是:RAM给你提供一种提高性能的选项,比如当你使用UMA存放drivers,或者UMA被用做ROM shadowing的时候。

RAM覆盖了整个384 KB区域,而ROM只覆盖了一部分。所以你可以这样考虑UMA中的RAM和ROM:RAM是放在桌子上的一条彩色的纸带,而ROM是一条同样尺寸的白色纸带,白色纸带被剪了一些洞,然后覆盖在彩带上面。那些有洞的部分露出的彩色部分就是可以供OS和应用程序使用的UMA RAM,剩余的部分就是ROM部分,OS和应用程序不能使用它们。

Address

First 16K
(x0000h-x3FFFh)

Second 16K
(x4000h-x7FFFh)

Third 16K
(x8000h-xBFFFh)

Fourth 16K
(xC000h-xFFFFh)

A0000- AFFFFh

VGA Graphics Mode Video RAM

B0000- BFFFFh

VGA Monochrome Text Mode Video RAM

VGA Color Text Mode Video RAM

C0000- CFFFFh

VGA Video BIOS ROM

IDE Hard Disk BIOS ROM

Optional Adapter ROM BIOS or RAM UMBs

D0000- DFFFFh

Optional Adapter ROM BIOS or RAM UMBs

E0000h- EFFFFh

System BIOS Plug and Play Extended Information

F0000- FFFFFh

System BIOS ROM

UMA的布局

下面是对上面表格中内容的概要介绍:

 

以下表格中列出了除Video RAM之外的UMA内存布局:

 Address  Width  Content Description
 C000:0  -  EGA/VGA BIOS ROM (thru C7FF)
 C400:0  -  Video adapter ROM space
 C600:0  256bytes  PGA communication area
 C800:0  16K  Hard disk adapter BIOS ROM
 C800:5  -  XT Hard disk ROM format, AH=Drive, AL=Interleave
 D000:0  32K  Cluster adapter BIOS ROM
 D800:0  -  PCjr conventional software cartridge address
 E000:0  64K  Expansion ROM space (hardwired on AT+)
 -  128K  PS/2 System ROM (thru F000)
 F000:0  -  System monitor ROM
 -  -  PCjr: software cartridge override address
 F400:0  -  System expansion ROMs
 F600:0  -  IBM ROM BASIC (AT)
 F800:0  -  PCjr software cartridge override address
 FC00:0  -  BIOS ROM
 FF00:0  -  System ROM
 FFA6:E  -  ROM graphics character table
 FFFF:0  -  ROM bootstrap code
 FFFF:5  8 bytes     ROM date (not applicable for all clones)
 FFFF:E  byte  ROM machine id

 

 

在绝大多数PC中,UMA中包含一个384 KB的RAM内存。如果UMA区域中的任何地址被ROM使用,那么这个地址后面的RAM就被系统隐藏了。然而,这并不意味着这些被隐藏的RAM被浪费了。

对于这些被用做System ROM和Video ROM的ROM来说,它的一个问题就是它比RAM的访问速度要慢。ROM的访问时间一般为120到200纳秒,而RAM的访问时间一般为50到70纳秒;更何况,系统RAM一次访问32-bit,而ROM是16-bit。结果就是,相对于访问系统内存,访问BIOS代码是非常慢的。

所以,我肯定你已经知道我要说什么了:既然在ROM的后面隐藏着RAM,我们可以将ROM中的内容影射到RAM中以提高性能。事实上,绝大多数系统也是这么做的,这被叫做ROM Shadowing。你可以通过一组BIOS参数来控制哪些ROM区域被影射到RAM中。

当一个内存区域的shadowing被通过配置BIOS参数打开的话,如果PC机被加电,则在机器启动的过程中,BIOS会将ROM中的内容拷贝到相应的RAM中,然后将这段RAM设为写保护,然后禁止使用ROM。这个时候,这些RAM就看起来象ROM一样了。只不过性能要高于真正的ROM。


  

1.1.4 High Memory Area

高端内存区High Memory Area (缩写为HMA),是扩展内存(Extended Memory)起始位置的65,520 bytes(64 KB - 16 bytes)。从技术上说,它是地址为100000h~10FFEFh的内存。它很特别,因为它是扩展内存中唯一可以在Real Mode下可以被直接访问的一部分。在正常的情况下,CPU根本无法在Real Mode下直接访问扩展内存,如果要访问,则必须进入保护模式,或者使用特殊的驱动程序。

请不要把它和上位内存区(Upper Memory Area)混肴,它们是完全不同的区域。

由于早年奇怪的设计决策,或者因为当时的不寻常的环境背景,造成了今天PC机上存在许多怪异的硬件和软件设计。HMA或许是所有这些怪异的设计之中最奇怪的设计之一。尽管前面我们一直在说HMA可以在Real Mode下可以被直接访问,但事实上,它能够被访问与否取决于一个被称做A20 Gate的家伙是否被打开。如果A20 Gate是被禁止的,HMA则无法被访问;只有A20 Gate是被打开的,HMA才可以被访问。(关于A20 Gate请参考1.4 A20 Gate

HMA的一个用途是,由于DOS是运行在Real Mode下的,所以当后来640 KB常规内存开始使用紧张的时候,DOS就通过一个特殊的驱动程序HIMEM.SYS将自己放在HMA中,以腾出更多的常规内存供应用程序使用。HIMEM.SYS所做的就是将A20 Gate打开。

由于A20 Gate的打开与否,决定的HMA是否可以在Real Mode下被访问,所以HMA的另外一个用途就是用来测试A20 Gate是否已经被打开。

其实,从我们前面的介绍中就已经明白,其实HMA仅仅在Real Mode下才有其特殊性,这也是其被单独拿出来被叫做HMA的意义,在Protected Mode下,HMA和其它的扩展内存没有什么性质上的不同,所以在Protected Mode下谈论HMA是没有意义的。


 

1.1.5 Extended Memory

1 MB以上的所有物理内存都被称做Extended Memory (扩展内存)。它们之所以被叫做扩展内存是因为这些内存是早期8086 1 MB内存限制的扩展。

除了最初的65,520 bytes,在Real Mode下,扩展内存是不能被直接访问的。如果要访问全部的扩展内存,必须进入Protected Mode。

80286提供了24-bit的地址线,在PM下可以访问15 MB的扩展内存,80386极其后续系列提供了32-bit的地址线,在PM下可以访问高达4 GB-1 MB的扩展内存。这为以后的OS设计以及应用程序提供了足够的空间。


SIMM(Single In-line Memory Module), a small circuit board that can hold a group of memory chips. Typically, SIMMs hold up 8 (on Macintoshes) or 9 (on PCs) RAM chips. On PCs, the ninth chip is often used for parity error checking. Unlike memory chips, SIMMs are measured in bytes rather than bits. SIMMs are easier to install than individual memory chips.  The bus from a SIMM to the actual memory chips is 32 bits wide. A newer technology, called dual in-line memory module (DIMM), provides a 64-bit bus. For modern Pentium microprocessors that have a 64-bit bus, you must use either DIMMs or pairs of SIMMs.