?? emm-principle_1.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0058)http://www.huihoo.com/gnu_linux/own_os/emm-principle_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>
<DIV class=Section1 style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT
face="Times New Roman" size=6><SPAN style="mso-tab-count: 1"><STRONG>2.1
Principle</STRONG></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT
face="Times New Roman" size=6><SPAN style="mso-tab-count: 1"><FONT
size=3></FONT></SPAN></FONT></SPAN> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT
face="Times New Roman" size=6><SPAN style="mso-tab-count: 1"><FONT
size=3>[</FONT><A
href="index.htm"><FONT
size=3>Home</FONT></A><FONT size=3>] [</FONT><A
href="driver.htm"><FONT
size=3>Top</FONT></A><FONT size=3>] </FONT><FONT size=3>[</FONT><FONT
size=3><A href="emm-ia32_2.htm"
tppabs="http://pagoda-ooos.51.net/os_book/emm/emm-ia32_2.htm">Next</A></FONT><FONT
size=3>]</FONT></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></P><STRONG>
<HR width="100%" SIZE=2>
</STRONG>
<P></P>
<P></P></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR"><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><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"><STRONG><FONT size=5>1. Linear Space
& Physical
Space</FONT></STRONG></FONT></SPAN></SPAN></SPAN></FONT></SPAN></P></DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">在硬件工程師和普通用戶看來,內存就是插在或固化在主板上的內存條,它們有一定的容量——比如64
MB。但在應用程序員眼中,并不過度關心插在主板上的內存容量,而是他們可以使用的內存空間——他們可以開發一個需要占用1
GB內存的程序,并讓其在OS平臺上運行,哪怕這臺運行主機上只有128
MB的物理內存條。而對于OS開發者而言,則是介于二者之間,他們既需要知道物理內存的細節,也需要提供一套機制,為應用程序員提供另一個內存空間,這個內存空間的大小可以和實際的物理內存大小之間沒有任何關系。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">我們將主板上的物理內存條所提供的內存空間定義為物理內存空間;將應用程序員看到的內存空間定義為線性空間。物理內存空間大小在不同的主機上可以是不一樣的,隨著主板上所插的物理內存條的容量不同而不同;但為應用程序員提供的線性空間卻是固定的,不會隨物理內存的變化而變化,這樣才能保證應用程序的可移植性。盡管物理內存的大小可以影響應用程序運行的性能,并且很多情況下對物理內存的大小有一個最低要求,但這些因素只是為了讓一個OS可以正常的運行。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">線性空間的大小在32-bit平臺上為4
GB的固定大小,對于每個進程都是這樣(一個應用可以是多進程的,在OS眼中,是以進程為單位的)。也就是說線性空間不是進程共享的,而是進程隔離的,每個進程都有相同大小的4
GB線性空間。一個進程對于某一個內存地址的訪問,與其它進程對于同一內存地址的訪問絕不沖突。比如,一個進程讀取線性空間地址1234ABCDh可以讀出整數8,而另外一個進程讀取線性空間地址1234ABCDh可以讀出整數20,這取決于進程自身的邏輯。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">在任意一個時刻,在一個CPU上只有一個進程在運行。所以對于此CPU來講,在這一時刻,整個系統只存在一個線性空間,這個線性空間是面向此進程的。當進程發生切換的時候,線性空間也隨著切換。所以結論就是每個進程都有自己的線性空間,只有此進程運行的時候,其線性空間才被運行它的CPU所知。在其它時刻,其線性空間對于CPU來說,是不可知的。所以盡管每個進程都可以有4
GB的線性空間,但在CPU眼中,只有一個線性空間的存在。線性空間的變化,隨著進程切換而變化。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">盡管線性空間的大小和物理內存的大小之間沒有任何關系,但使用線性空間的應用程序最終還是要運行在物理內存中。應用所給出的任何線性地址最終必須被轉化為物理地址,才能夠真正的訪問物理內存。所以,線性內存空間必須被映射到物理內存空間中,這個映射關系需要通過使用硬件體系結構所規定的數據結構來建立。我們不妨先稱其為映射表。一個映射表的內容就是某個線性內存空間和物理內存空間之間的映射關系。OS
Kernel一旦告訴某個CPU一個映射表的位置,那么這個CPU需要去訪問一個線性空間地址時,就根據這張映射表的內容,將這個線性空間地址轉化為物理空間地址,并將此物理地址送到地址線,畢竟地址線只知道物理地址。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">所以,我們很容易得出一個結論,如果我們給出不同的映射表,那么CPU將某一線性空間地址轉化的物理地址也會不同。所以我們為每一個進程都建立一張映射表,將每個進程的線性空間根據自己的需要映射到物理空間上。既然某一時刻在某一CPU上只能有一個應用在運行,那么當任務發生切換的時候,將映射表也更換為響應的映射表就可以實現每個進程都有自己的線性空間而互不影響。所以,在任意時刻,對于一個CPU來說,也只需要有一張映射表,以實現當前進程的線性空間到物理空間的轉化。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"><STRONG><FONT
face="Times New Roman" size=5>
<HR width="100%" SIZE=2>
</FONT>
<P></P>
<P><FONT face="Times New Roman" size=5></FONT></P><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
lang=EN-US><STRONG><FONT face="Times New Roman" size=5>2. OS Kernel Space &
Process Space</FONT></STRONG></SPAN></SPAN></SPAN></SPAN></P></STRONG></DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"><STRONG></STRONG> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">由于OS
Kernel在任意時刻都必須存在于內存中,而進程卻可以切換,所以在任意時刻,內存中都存在兩部分,OS
Kernel和用戶進程。而在任意時刻,對于一個CPU來說只存在一個線性空間,所以這個線性空間必須被分成兩部分,一部分供OS
Kernel使用,另一部分供用戶進程使用。既然OS Kernel在任何時候都占用線性空間中的一部分,那么對于所有進程的線性空間而言,它們為OS
Kernel所留出的線性空間可以是完全相同的,也就是說,它們各自的映射表中,也分為兩部分,一部分是進程私有映射部分,對于OS
Kernel映射部分的內容則完全相同。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">從這個意義上來說,我們可以認為,對于所有的進程而言,它們共享OS
Kernel所占用的線性空間部分,而每個進程又各自有自己私有的線性空間部分。假如,我們將任意一個4 GB線性空間分割為1 GB的OS Kernel空間部分和3
GB的進程空間部分,那么所有進程的4 GB線性空間中1 GB的OS Kernel空間是共享的,而剩余的3
GB進程空間部分則是各個進程私有的。Linux就是這么做的,而Windows NT則是讓OS Kernel和進程各使用2 GB線性空間。</DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"><STRONG><FONT
face="Times New Roman" size=5>
<HR width="100%" SIZE=2>
</FONT></STRONG>
<P></P>
<P><FONT face="Times New Roman" size=5><STRONG></STRONG></FONT></P><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><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><STRONG>3. Segment Mapping &
Page Mapping</STRONG></FONT></SPAN></SPAN></SPAN></SPAN></P></DIV>
<DIV class=Section1
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt"> </DIV>
<DIV class=Section1 style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -