?? linuxkernel.htm
字號:
<P ALIGN="JUSTIFY">第一條語句(第一行)將寄存器</FONT><FONT SIZE=3>15</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>指定的地址中的內(nèi)容加載到寄存器</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>中。第二條指令將緊接著的內(nèi)存中的內(nèi)容加載到寄存器</FONT><FONT SIZE=3>17</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>中。第三行比較寄存器</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>和寄存器</FONT><FONT SIZE=3>17</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,如果相等,分支到標號</FONT><FONT SIZE=3>100</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,否則,繼續(xù)執(zhí)行第四行,將寄存器</FONT><FONT SIZE=3>17</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的內(nèi)容存到內(nèi)存中。如果內(nèi)存中的數(shù)據(jù)相同,就不必存儲數(shù)據(jù)。編寫匯編級的程序需要技巧而且十分冗長,容易出錯。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>系統(tǒng)的核心很少的一部分是用匯編語言編寫,而這些部分之所以使用匯編語言只是為了提高效率,并且和具體的微處理器相關。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.1.2 The C Programming Language and Compiler (C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>語言和編譯器</FONT><FONT SIZE=3>)</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">使用匯編語言編寫大型程序十分困難,消耗時間,容易出錯而且生成的程序不能移植,只能束縛在特定的處理器家族。更好的選擇是使用和機器無關的語言,例如</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>允許你用邏輯算法描述程序和要處理的數(shù)據(jù)。被稱為編譯程序(</FONT><FONT SIZE=3>compiler</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>)的特殊程序讀入</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>程序,并將它轉換為匯編語言,進而產(chǎn)生機器相關的代碼。好的編譯器生成的匯編指令可以和好的匯編程序員編寫的程序效率接近。大部分</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>核心是用</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>語言編寫的。以下的</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>片斷:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">if (x != y)</P>
<P ALIGN="JUSTIFY"> x = y;</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">執(zhí)行了和前面示例中匯編代碼完全一樣的操作。如果變量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的內(nèi)容和變量</FONT><FONT SIZE=3>y</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的內(nèi)容不一樣,變量</FONT><FONT SIZE=3>y</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的內(nèi)容被拷貝到變量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>代碼用例程(</FONT><FONT SIZE=3>routine</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>)進行組合,每一個例程執(zhí)行一項任務。例程可以返回</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>所支持的任意的數(shù)值或數(shù)據(jù)類型。大型程序比如</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>核心分別由許多的</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>語言模塊組成,每一個模塊有自己的例程和數(shù)據(jù)結構。這些</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>源代碼模塊共同構成了邏輯功能比如文件系統(tǒng)的處理代碼。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>支持多種類型的變量。一個變量是內(nèi)存中的特定位置,可用符號名引用。上述的</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>片斷中,</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>y</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>引用了內(nèi)存中的位置。程序員不需要關心變量在內(nèi)存中的具體位置,這是連接程序(下述)必須處理的。一些變量包含不同的數(shù)據(jù)例如整數(shù)、浮點數(shù)等和另一些則包含指針。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">指針是包含其它數(shù)據(jù)在內(nèi)存中的地址的變量。假設一個變量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,位于內(nèi)存地址</FONT><FONT SIZE=3>0x80010000</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3> </FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>你可能有一個指針</FONT><FONT SIZE=3>px</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,指向</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3> Px</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>可能位于地址</FONT><FONT SIZE=3>0x80010030</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3>Px</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的值則是變量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的地址,</FONT><FONT SIZE=3>0x80010000</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">C</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>允許你將相關的變量集合成為結構。例如:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Struct {</P>
<P ALIGN="JUSTIFY">Int I;</P>
<P ALIGN="JUSTIFY">Char b;</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">}</FONT><FONT SIZE=3> my_struct;</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">是一個叫做</FONT><FONT SIZE=3>my_struct</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數(shù)據(jù)結構,包括兩個元素:一個整數(shù)(</FONT><FONT SIZE=3>32</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>位)</FONT><FONT SIZE=3>I</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>和一個字符(</FONT><FONT SIZE=3>8</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>位數(shù)據(jù))</FONT><FONT SIZE=3>b</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.1.3 Linkers</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>(連接程序)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">連接程序將幾個目標模塊和庫文件連接在一起成為一個單獨的完整程序。目標模塊是匯編程序或編譯程序的機器碼輸出,它包括機器碼、數(shù)據(jù)和供連接程序使用的連接信息。比如:一個目標模塊可能包括程序的所有數(shù)據(jù)庫功能,而另一個目標模塊則包括處理命令行參數(shù)的函數(shù)。連接程序確定目標模塊之間的引用關系,即確定一個模塊所引用的例程和數(shù)據(jù)在另一個模塊中的實際位置。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>核心是由多個目標模塊連接而成的獨立的大程序。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2 What is an Operating System</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>(什么是操作系統(tǒng)?)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">沒有軟件,計算機只是一堆發(fā)熱的電子元件。如果說硬件是計算機的心臟,則軟件就是它的靈魂。操作系統(tǒng)是允許用戶運行應用程序的一組系統(tǒng)程序。操作系統(tǒng)將系統(tǒng)的硬件抽象,呈現(xiàn)在用戶和應用程序之前的是一個虛擬的機器。是軟件造就了計算機系統(tǒng)的特點。大多數(shù)</FONT><FONT SIZE=3>PC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>可以運行一到多個操作系統(tǒng),而每一個操作系統(tǒng)從外觀和感覺上都大不相同。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>由不同功能的部分構成,這些部分總體組合構成了</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>操作系統(tǒng)。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>最明顯的部分就是</FONT><FONT SIZE=3>Kernel</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>自身,但是如果沒有</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>libraries</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>一樣沒有用處。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">為了了解什么是操作系統(tǒng),看一看在你輸入最簡單的命令時發(fā)生了什么:</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">$ls</P>
<P ALIGN="JUSTIFY">Mail 	c	images	perl</P>
<P ALIGN="JUSTIFY">Docs	tcl</P>
<P ALIGN="JUSTIFY">$</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">這里的</FONT><FONT SIZE=3>$</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>是登錄的</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>輸出的提示符(此例是</FONT><FONT SIZE=3>bash</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>):表示</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>在等候你(用戶)輸入命令。輸入</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>引發(fā)鍵盤驅動程序識別輸入的字符,鍵盤驅動程序將識別的字符傳遞給</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>去處理。</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>先查找同名的可執(zhí)行映象,它找到了</FONT><FONT SIZE=3>/bin/ls, </FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>然后調用核心服務將</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>執(zhí)行程序加載到虛擬內(nèi)存中并開始執(zhí)行。</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>執(zhí)行程序通過執(zhí)行核心的文件子系統(tǒng)的系統(tǒng)調用查找文件。文件系統(tǒng)可能使用緩存的文件系統(tǒng)信息或通過磁盤設備驅動程序從磁盤上讀取文件信息</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>也可能是通過網(wǎng)絡設備驅動程序同遠程主機交換信息而讀取本系統(tǒng)所訪問的遠程文件的詳細信息(文件系統(tǒng)可以通過</FONT><FONT SIZE=3>NFS</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>網(wǎng)絡文件系統(tǒng)遠程安裝)。不管文件信息是如何得到的,</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>都將信息輸出,通過顯示驅動程序顯示在屏幕上。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">以上的過程看起來相當復雜,但是它說明了即使是最簡單的命令也是操作系統(tǒng)各個功能模塊之間共同協(xié)作的結果,只有這樣才能提供給你(用戶)一個完整的系統(tǒng)視圖。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.1 Memory management</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>(內(nèi)存管理)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">如果擁有無限的資源,例如內(nèi)存,那么操作系統(tǒng)所必須做的很多事情可能都是多余的。所有操作系統(tǒng)的一個基本技巧就是讓少量的物理內(nèi)存工作起來好像有相當多的內(nèi)存。這種表面看起來的大內(nèi)存叫做虛擬內(nèi)存,就是當軟件運行的時候讓它相信它擁有很多內(nèi)存。系統(tǒng)將內(nèi)存分為容易處理的頁,在系統(tǒng)運行時將這些頁交換到硬盤上。而應用軟件并不知道,因為操作系統(tǒng)還使用了另一項技術:多進程。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.2 Processes (</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>進程</FONT><FONT SIZE=3>)</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">進程可以看作一個在執(zhí)行的程序,每一個進程都是正在運行的特定的程序的獨立實體。如果你觀察一下你的</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>系統(tǒng),你會發(fā)現(xiàn)有很多進程在運行。例如:在我的系統(tǒng)上輸入</FONT><FONT SIZE=3>ps </FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>顯示了以下進程:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">$ ps</P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -