⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emm-principle_1.htm

📁 编写自己的操作系统
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!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>&nbsp;</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>]&nbsp; [</FONT><A 
href="driver.htm"><FONT 
size=3>Top</FONT></A><FONT size=3>]&nbsp; </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 
&amp; 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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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 &amp; 
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>&nbsp;</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">&nbsp;</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 &amp; 
Page Mapping</STRONG></FONT></SPAN></SPAN></SPAN></SPAN></P></DIV>
<DIV class=Section1 
style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">&nbsp;</DIV>
<DIV class=Section1 style="LAYOUT-GRID-CHAR: none; LAYOUT-GRID-LINE: 15.6pt">

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -