(转)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 |
Second 16K |
Third 16K |
Fourth 16K |
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。