(转)Static MemoryLayout_shadow memory

转载地址:http://www.cnblogs.com/kuwoyidai/archive/2010/10/15/1870455.html

常规内存(Conventional Memory):系统内存的第一个640 KB就是著名的常规内存。每一个PC机用户随着时间的推移都更加清楚的知道它,(也更加恨它:)),它是标准DOS程序、DOS驱动程序、常驻内存程序等可用的区域,它们统统都被放置在00000h~9FFFFh之间。

上位内存区(Upper Memory Area):系统内存的第一个1M内存顶端的384 KB(1024 KB - 640 KB)就是UMA,它紧随在常规内存之后。也就是说,第一个1M内存被分成640KB常规内存和384KB的UMA。这个区域是系统保留区域,用户程序不能使用它。它一部分被系统设备(CGA、VGA等)使用,另外一部分被用做ROM shadowing和Drivers。UMA使用内存区域A0000h~FFFFFh。 
高端内存区(High Memory Area):系统内存第2个1M内存的第一个64 KB区域,被称做HMA。从技术上讲,它属于扩展内存的第一个64 KB,但它和其他扩展内存区域所不同的是,它可以在real mode下被直接访问,其它的则不然。所以在DOS时代,后期的DOS版本允许用户通过配置将DOS本身放置在HMA,从而让用户可以有更多的常规内存可以使用。HMA占据地址100000h~10FFEFh。 
扩展内存(Extended Memory):从HMA结束的位置到系统物理内存的最大值之间的区域都属于扩展内存。当一个OS运行在Protected Mode时,它可以被访问,而在Real Mode下,则无法被访问(除非通过某些Hacker方法)。它的地址范围是10FFF0h~Last address of system momory(maximum of 4G-1M)。从技术上说,HMA也属于扩展内存,这依赖于你如何看待这个问题。

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的布局

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

VGA Graphics Mode Video RAM: 内存A0000h~AFFFFh的64 KB块被系统保留作为VGA图形显示内存。最初的VGA是320x200,256色模式,这种模式需要64,000 bytes。当然现代显卡使用更多的内存。这个RAM区域被系统保留,应用程序被禁止使用它。 
VGA Monochrome Text Mode Video RAM: 当显卡处于单色文本模式时,会使用这32 KB RAM。然而,在现代系统中,显卡已经几乎不使用黑白文本模式;即使当需要显示黑白文本的时候,也只会使用彩色文本模式黑白色彩来显示黑白文本而已。在某些环境下,这块内存可以被用做驱动程序,来节省常规内存的空间。 
VGA Color Text Mode Video RAM: 当显卡处于彩色文本模式时,会使用这32 KB RAM。这个RAM区域被系统保留,应用程序被禁止使用它。 
VGA Video BIOS ROM: C0000~C7FFFh是Video BIOS ROM的内存位置。Video BIOS ROM中包含着被Video Card使用的代码。注意这块ROM里存放的是BIOS INT 10H所使用的服务代码,而不是被Video Card显示的数据,如果是显示数据,就应该被放置在RAM中。 
IDE Hard Disk BIOS ROM: C8000h 是存放控制IDE Hard Disk的BIOS的默认位置。在系统被启动的阶段,这块BIOS代码将会被调用。 
Optional Adapter ROM BIOS or RAM UMBs: CC000h ~ DFFFFh 之间的内存块可以被PC厂商随意使用。这块内存可以被Hardware Adapters用来存放ROM代码(例如,一些网卡,或者SCSI host adapters)。 也可以被用做进行Loading Drivers的上位内存块RAM。这块内存通常是空的,除非你使用了那些刚才被提及的特殊硬件。 
System BIOS Plug and Play Extended Information: E0000h ~ EFFFFh 之间的内存被Plug and Play BIOSes用来存放它的Extended System Configuration Data (ESCD)。 
System BIOS ROM: UMA的最后64K区域被用来存放system BIOS代码。 

以下表格中列出了除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 1byte   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中(应该是先copy到0-640k,然后在北桥芯片里调整PAM register使其地址线对应到相应的RAM,在解压到这段RAM),然后将这段RAM设为写保护,然后禁止使用ROM。这个时候,这些RAM就看起来象ROM一样了。只不过性能要高于真正的ROM。

原文地址:https://www.cnblogs.com/god_like_donkey/p/2162057.html