📄 booting-static_memory_layout_1.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0073)http://www.huihoo.com/gnu_linux/own_os/booting-static_memory_layout_1.htm -->
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
lang=EN-US><FONT face="Times New Roman" size=6><SPAN
style="mso-tab-count: 1"><STRONG>1.1 Static Memory
Layout</STRONG></SPAN></FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
lang=EN-US><FONT face="Times New Roman" size=6><SPAN
style="mso-tab-count: 1"><STRONG></STRONG></SPAN></FONT></SPAN><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><FONT
size=3></FONT></SPAN></FONT></SPAN></SPAN> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><FONT size=3>[</FONT><A
href="index.htm"
tppabs="http://pagoda-ooos.51.net/os_book/index.htm"><FONT
size=3>Home</FONT></A><FONT size=3>] [</FONT><A
href="booting.htm"
tppabs="http://pagoda-ooos.51.net/os_book/booting.htm"><FONT
size=3>Top</FONT></A><FONT size=3>] </FONT><FONT size=3> [</FONT><A
href="booting-power_on_2.htm"
tppabs="http://pagoda-ooos.51.net/os_book/booting/booting-power_on_2.htm"><FONT
size=3>Next</FONT></A><FONT size=3>]</FONT></P>
<P><STRONG>
<HR width="100%" SIZE=2>
</STRONG>
<P></P>
<P></P></SPAN></FONT></SPAN>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><STRONG><FONT
face="Times New Roman TUR" size=5>1.1.1 Overview</FONT></STRONG></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR">尽管我们总是以一个数字来说明一台PC机的物理内存数量(比如,我的PC机的内存是256M),但事实上,PC机的物理内存被分为多个不同的区域,尽管几乎每一个PC的用户都不希望是这样。这样的设计是IBM
PC机早期版本的系统资源限制所造成的后遗症。</FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR">与其去责备这种内存组织方法,不如去看一看造成这种结果的历史环境。在1981年,当IBM
PC机被初次发布的时候,1MB是个很大数量的内存。在那个时候最流行的家庭计算机是Apple,但它的内存最大只能访问到64KB,那个时候,一台微型计算机的内存通常只有8KB,并且内存非常昂贵,所以在当时,IBM
PC机的设计者认为1M内存已经是海量内存了。</FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR">后来,由于计算机工业的迅速发展,1M内存已经显得捉襟见肘,而后续系统又必须和早期系统兼容,所以IBM
PC机的内存被分为四个基本区域(有一些区域被进一步细分):</FONT></P>
<UL>
<LI><FONT face="Times New Roman TUR"><STRONG>常规内存(Conventional
Memory):</STRONG>系统内存的第一个640
KB就是著名的常规内存。每一个PC机用户随着时间的推移都更加清楚的知道它,(也更加恨它:)),它是标准DOS程序、DOS驱动程序、常驻内存程序等可用的区域,它们统统都被放置在00000h~9FFFFh之间。
</FONT>
<LI><FONT face="Times New Roman TUR"><STRONG>上位内存区(Upper Memory
Area):</STRONG>系统内存的第一个1M内存顶端的384 KB(1024 KB - 640
KB)就是UMA,它紧随在常规内存之后。也就是说,第一个1M内存被分成640KB常规内存和384KB的UMA。这个区域是系统保留区域,用户程序不能使用它。它一部分被系统设备(CGA、VGA等)使用,另外一部分被用做ROM
shadowing和Drivers。UMA使用内存区域A0000h~FFFFFh。 </FONT>
<LI><FONT face="Times New Roman TUR"><STRONG>高端内存区(High Memory
Area):</STRONG>系统内存第2个1M内存的第一个64 KB区域,被称做HMA。从技术上讲,它属于扩展内存的第一个64
KB,但它和其他扩展内存区域所不同的是,它可以在real
mode下被直接访问,其它的则不然。所以在DOS时代,后期的DOS版本允许用户通过配置将DOS本身放置在HMA,从而让用户可以有更多的常规内存可以使用。HMA占据地址100000h~10FFEFh。
</FONT>
<LI><FONT face="Times New Roman TUR"><STRONG>扩展内存(Extended
Memory):</STRONG>从HMA结束的位置到系统物理内存的最大值之间的区域都属于扩展内存。当一个OS运行在Protected
Mode时,它可以被访问,而在Real Mode下,则无法被访问(除非通过某些Hacker方法)。它的地址范围是10FFF0h~Last address
of system momory(maximum of
4G-1M)。从技术上说,HMA也属于扩展内存,这依赖于你如何看待这个问题。</FONT></LI></UL>
<P align=center><IMG
src="booting-static_memory_layout_1.files/static_memory_layout.jpg"
tppabs="http://pagoda-ooos.51.net/os_book/booting/static-memory-layout/static_memory_layout.jpg"></P>
<HR width="100%" SIZE=2>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"></SPAN> </P><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><STRONG><FONT
face="Times New Roman TUR" size=5>1.1.2 Conventional Memory</FONT></STRONG></P>
<P><FONT face="Times New Roman TUR">系统的第一个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。</FONT></P>
<P><FONT face="Times New Roman TUR">为什么常规内存有640
KB的限制?原因是IBM所做的病态的决定——IBM把那些为系统功能保留的内存空间(UMA)放在常规内存的顶端,而不是将它们放在底部。在过去的20多年里,后续的PC为了保持向后兼容,一直在沿用这种模式,后来新加入的RAM(扩展内存)都从1
MB的位置开始,而与这640 KB
RAM被UMA所分割。如果最初UMA被放置在常规内存的底部,那么后来扩展的内存就可以和常规内存连为一体,那么使用和管理这些RAM就会被简化很多。</FONT></P>
<P><FONT face="Times New Roman TUR">但这640 KB也不是完全归用户程序或OS使用的,比如,起始位置的1
KB被用做BIOS中断向量表,随后的1 KB被用做BIOS数据区,在顶端的位置还有BIOS扩展数据区。这些空间在Real
Mode下必须被保留。而当PC启动阶段,CPU默认处于Real
Mode下,所以OS在Boot阶段如何合理的使用常规内存需要进行良好的规划。</FONT></P>
<P><FONT face="Times New Roman TUR">一旦OS进入Protected Mode,常规内存就变的远没有在Real
Mode下那么重要了,这个时候更大容量的扩展内存可以被使用(如果有的话),并且扩展内存还都是连续的。</FONT></P><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<HR width="100%" noShade SIZE=2>
<P> <STRONG><FONT face="Times New Roman TUR" size=5>1.1.3 Upper Memory
Area</FONT></STRONG></P>
<P><FONT face="Times New Roman TUR">PC机组织内存的方式有些让人感到困惑——欢迎来到最让人困惑的部分:)。在640
KB常规内存之上的384 KB部分被称为Upper Memory
Area或者UMA,这是一个非常繁忙的地带。它非常重要,因为它是许多系统配置问题的根源。</FONT></P>
<P><FONT
face="Times New Roman TUR">UMA让人感到如此困惑的一个原因是它实际上是2个互相交叠的内存。这里存在一段占据物理地址A0000h~FFFFFh的RAM;然而,也有一段不同类型的ROM被影射到这段地址的大部分区间。其中,和ROM有相同地址的部分的RAM被系统隐藏了,它们被BIOS用做ROM
shadowing。没有被隐藏的部分仍然可以被OS和Application使用。</FONT></P>
<P><FONT face="Times New Roman TUR">为什么会造成这种情况?部分原因是为了实用:如果一台PC机有640
KB的常规内存,以及384 KB的UMA,那么你插在主板上的物理内存是连续的——没有一种实用的方法构造一个SIMM(Single In-line Memory
Module,见本节末尾注解)为UMA留出一个384 KB的物理块(当然,从技术上可以做到,但成本比浪费这384 KB
RAM的代价要高的多)。其它的主要原因是:RAM给你提供一种提高性能的选项,比如当你使用UMA存放drivers,或者UMA被用做ROM
shadowing的时候。</FONT></P>
<P><FONT face="Times New Roman TUR">RAM覆盖了整个384
KB区域,而ROM只覆盖了一部分。所以你可以这样考虑UMA中的RAM和ROM:RAM是放在桌子上的一条彩色的纸带,而ROM是一条同样尺寸的白色纸带,白色纸带被剪了一些洞,然后覆盖在彩带上面。那些有洞的部分露出的彩色部分就是可以供OS和应用程序使用的UMA
RAM,剩余的部分就是ROM部分,OS和应用程序不能使用它们。</FONT></P>
<P align=center><IMG src="booting-static_memory_layout_1.files/shadow.jpg"
tppabs="http://pagoda-ooos.51.net/os_book/booting/static-memory-layout/shadow.jpg"></P></SPAN>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center>
<TABLE borderColor=#000000 cellSpacing=2 cellPadding=4 width=539
borderColorLight=#c0c0c0 border=1>
<TBODY>
<TR>
<TD width=60 bgColor=#808080><B>
<P align=center><FONT face="Times New Roman TUR"
size=2>Address</FONT></B></P></TD>
<TD width=105 bgColor=#808080><B>
<P align=center><FONT face="Times New Roman TUR" size=2>First
16K<BR>(x0000h-x3FFFh)</FONT></B></P></TD>
<TD width=103 bgColor=#808080><B>
<P align=center><FONT face="Times New Roman TUR" size=2>Second
16K<BR>(x4000h-x7FFFh)</FONT></B></P></TD>
<TD width=105 bgColor=#808080><B>
<P align=center><FONT face="Times New Roman TUR" size=2>Third
16K<BR>(x8000h-xBFFFh)</FONT></B></P></TD>
<TD width=106 bgColor=#808080><B>
<P align=center><FONT face="Times New Roman TUR" size=2>Fourth
16K<BR>(xC000h-xFFFFh)</FONT></B></P></TD></TR>
<TR>
<TD width=60 bgColor=#c0c0c0><B>
<P align=center><FONT face="Times New Roman TUR" size=2>A0000-
AFFFFh</FONT></B></P></TD>
<TD width=419 colSpan=4>
<P align=center><FONT face="Times New Roman TUR" size=2>VGA Graphics Mode
Video RAM</FONT></P></TD></TR>
<TR>
<TD width=60 bgColor=#c0c0c0><B>
<P align=center><FONT face="Times New Roman TUR" size=2>B0000-
BFFFFh</FONT></B></P></TD>
<TD width=208 colSpan=2>
<P align=center><FONT face="Times New Roman TUR" size=2>VGA Monochrome
Text Mode Video RAM</FONT></P></TD>
<TD width=211 colSpan=2>
<P align=center><FONT face="Times New Roman TUR" size=2>VGA Color Text
Mode Video RAM</FONT></P></TD></TR>
<TR>
<TD width=60 bgColor=#c0c0c0><B>
<P align=center><FONT face="Times New Roman TUR" size=2>C0000-
CFFFFh</FONT></B></P></TD>
<TD width=208 colSpan=2>
<P align=center><FONT face="Times New Roman TUR" size=2>VGA Video BIOS
ROM</FONT></P></TD>
<TD width=105>
<P align=center><FONT face="Times New Roman TUR" size=2>IDE Hard Disk BIOS
ROM</FONT></P></TD>
<TD width=106>
<P align=center><FONT face="Times New Roman TUR" size=2>Optional Adapter
ROM BIOS or RAM UMBs</FONT></P></TD></TR>
<TR>
<TD width=60 bgColor=#c0c0c0><B>
<P align=center><FONT face="Times New Roman TUR" size=2>D0000-
DFFFFh</FONT></B></P></TD>
<TD width=419 colSpan=4>
<P align=center><FONT face="Times New Roman TUR" size=2>Optional Adapter
ROM BIOS or RAM UMBs</FONT></P></TD></TR>
<TR>
<TD width=60 bgColor=#c0c0c0><B>
<P align=center><FONT face="Times New Roman TUR" size=2>E0000h-
EFFFFh</FONT></B></P></TD>
<TD width=419 colSpan=4>
<P align=center><FONT face="Times New Roman TUR" size=2>System BIOS Plug
and Play Extended Information</FONT></P></TD></TR>
<TR>
<TD width=60 bgColor=#c0c0c0><B>
<P align=center><FONT face="Times New Roman TUR" size=2>F0000-
FFFFFh</FONT></B></P></TD>
<TD width=419 colSpan=4>
<P align=center><FONT face="Times New Roman TUR" size=2>System BIOS
ROM</FONT></P></TD></TR></TBODY></TABLE></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><FONT face="Times New Roman TUR" size=2>UMA的布局</FONT></P>
<P align=left><FONT face="Times New Roman TUR">下面是对上面表格中内容的概要介绍:</FONT></P><B>
<UL>
<LI><FONT face="Times New Roman TUR">VGA Graphics Mode Video
RAM:</FONT></B><FONT face="Times New Roman TUR"> 内存A0000h~AFFFFh的64
KB块被系统保留作为VGA图形显示内存。最初的VGA是320x200,256色模式,这种模式需要64,000
bytes。当然现代显卡使用更多的内存。这个RAM区域被系统保留,应用程序被禁止使用它。 </FONT>
<LI><FONT face="Times New Roman TUR"><B>VGA Monochrome Text Mode Video
RAM:</B> 当显卡处于单色文本模式时,会使用这32 KB
RAM。然而,在现代系统中,显卡已经几乎不使用黑白文本模式;即使当需要显示黑白文本的时候,也只会使用彩色文本模式黑白色彩来显示黑白文本而已。在某些环境下,这块内存可以被用做驱动程序,来节省常规内存的空间。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -