?? 00000011.htm
字號:
<HTML><HEAD> <TITLE>BBS水木清華站∶精華區</TITLE></HEAD><BODY><CENTER><H1>BBS水木清華站∶精華區</H1></CENTER>發信人: axp33a (無聊中...), 信區: Linux <BR>標 題: Linux內核源代碼分析4-1 <BR>發信站: BBS 水木清華站 (Thu Aug 3 11:28:01 2000) WWW-POST <BR> <BR>第4章 系統初始化
<BR>當你想要運行程序時,你需要把程序的文件名敲入shell—或者更為流行的,在如GNOME或 <BR>者KDE等之類桌面環境中點擊相應的圖標,這樣就能將其裝載進內核并運行。但是,首先 <BR>必須有其他的軟件來裝載并運行內核;這通常是諸如LOADLIN或者LILO之類的內核引導程 <BR>序。更進一步說,我們還需要其他的軟件來裝載運行內核引導程序—稱之“內核引導程序 <BR>的引導程序”,而且看起來似乎運行內核引導程序的引導程序也需要內核引導程序的引導 <BR>程序的引導程序,等等,這個過程是無限的。
<BR>這個無限循環的過程必然最終在某個地方終止,這就是硬件。因此,在最低的層次上,啟 <BR>動系統的第一步是從硬件中獲得幫助。該硬件總是運行一些短小的內置程序—軟件,但是 <BR>這些軟件是被固化在只讀存儲器中,存儲在已知地址中。因此,在這種情況下就不需要軟 <BR>件引導程序了—它能夠運行更大更復雜的程序,直到內核自身裝載成功為止。按照這種方 <BR>式,系統自己的引導過程(bootstrap)會引發系統的啟動,當然這只是術語“系統引導 <BR>(booting)”的一個比喻。雖然不同體系結構的引導過程的具體細節差異很大,但是它 <BR>們的原則都基本相同。
<BR>前面的工作都完成以后,內核就已經成功裝載了。隨后內核可以初始化自身以及系統的其 <BR>他部分。
<BR>本章首先將簡單介紹基于x86 PC機的典型自啟動方式,接著回顧一下每一步工作在什么時 <BR>機發生,最后我們還要介紹的是內核的相應部分。
<BR>4.1 引導PC機
<BR>本節簡要介紹x86 PC是如何引導的。本節的目的不是讓你精通PC是怎樣引導的(這超出了 <BR>本書的范圍),而是向你展示特定體系結構一般的引導方式,為下文中的內核初始化進行 <BR>鋪墊。
<BR>首先,機器中的每個CPU都要自行初始化,接著可能要用幾分之一秒的時間來執行自測試 <BR>。在多處理器的系統中,這個過程會更復雜些—但是實際上也并不多。在雙處理器的 <BR>Pentium系統中,一個CPU總是作為主CPU存在,另外一個CPU則是輔CPU。主CPU執行啟動過 <BR>程中的剩余工作,隨后內核才會激活輔CPU。在多處理器的Pentium Pro系統中,CPU必須 <BR>根據Intel定義的算法“搶奪標志”來動態決定由哪個CPU啟動系統。取得標志的CPU啟動 <BR>系統,隨后內核激活其他的CPU。無論是哪種情況,啟動程序的剩余部分只與一個CPU有關 <BR>。這樣,在隨后的一段時間內,我們可以認為該系統中只有一個CPU是可用的,而不考慮 <BR>其他的CPU,或者說這些CPU被暫時隱藏了。另一方面,內核還需要明確地激活所有其他的 <BR>CPU—這一點你可以在本章后續部分看到。
<BR>接下來,CPU從0xfffffff0地址單元中取得指令并執行,這個地址非常接近于32位CPU的最 <BR>后可用的地址。因為大多數PC都沒有4GB的RAM,所以通常在這個地址上并沒有實際內存。 <BR>內存硬件可以虛擬使用它。對那些確實有4GB內存的機器來說,它們也只是僅僅損失了供 <BR>BIOS使用的頂端地址空間末尾的少量內存(實際上BIOS在這里只保留了64K的空間—這種 <BR>損失在4GB的機器中是可以忽略的)。
<BR>該地址單元中存儲的指令是一條跳轉指令,這條指令跳轉到基本輸入輸出系統(BIOS)代 <BR>碼的首部。BIOS內置在主板中,它主要負責控制系統的啟動。請注意CPU實際上并不真正 <BR>關心BIOS是否存在,這樣就使得在諸如用戶定制的嵌入系統之類的非PC體系結構的計算機 <BR>中使用Intel的CPU成為可能。CPU執行在目標地址中發現的任何指令,在這里使用跳轉指 <BR>令轉移到BIOS只是PC體系結構的一部分(實際上,跳轉指令自己是BIOS的一部分,但是這 <BR>不是考慮這個問題的最方便的方法)。
<BR>BIOS使用內置的規則來選擇啟動設備。通常情況下,這些規則是可以改變的,方法是在啟 <BR>動過程開始時按下一個鍵(例如,在我的系統中是Del鍵)并通過一些菜單選項瀏覽選擇 <BR>。但是,通常的過程是BIOS首先試圖從軟盤啟動,如果失敗了,就再試圖從主硬盤上啟動 <BR>。如果又失敗了,就再試圖從CD-ROM上啟動。為了使問題更具體,這里討論的情況假定是 <BR>最普通的,也就是啟動設備是硬盤。
<BR>從這種啟動設備上啟動,BIOS讀取第一個扇區的信息—首512個字節,稱之為主引導記錄 <BR>(MBR)。接下來發生的內容有賴于Linux是怎樣在系統上安裝的。為使討論形象具體,我 <BR>們假定LILO是內核的載入程序。在典型的設置中,BIOS檢測MBR中的關鍵數字(為了確認 <BR>該數據段的確是MBR),并在MBR中檢測引導扇區的位置。這一扇區包含了LILO的開始部分 <BR>,然后BIOS將其裝入內存,開始執行。
<BR>注意我們現在已經實現了從硬件和內置軟件的范圍到實際軟件范圍的轉變,從有形范圍到 <BR>無形范圍,也就是說從你可以接觸的部分到不可接觸的部分。
<BR>下面就是LILO的責任了。它把自己其余的部分裝載進來,在磁盤上找到配置數據,這些數 <BR>據指明從什么地方可以得到內核,啟動時要通過什么選項。LILO接著裝載內核到內存并跳 <BR>轉到內核。
<BR>通常,內核以壓縮形式存儲,只有少量足以完成解壓縮任務的指令,也就是自解壓可執行 <BR>文件,是以非壓縮形式存儲的。因此,內核的下一步工作是自解壓縮內核鏡像。到這里, <BR>內核就已經完成了裝載的過程。
<BR>下面是對所進行步驟的簡要描述:
<BR>1) CPU初始化自身,接著在固定位置執行一條指令。
<BR>2) 這條指令跳轉到BIOS中。
<BR>3) BIOS找到啟動設備并獲取MBR,該MBR指向LILO。
<BR>4) BIOS裝載并把控制權轉交給LILO。
<BR>5) LILO裝載壓縮內核。
<BR>6) 壓縮內核自解壓,并把控制權轉交給解壓的內核。
<BR>正如你所見到的,引導過程每一步都將你帶入更大量更復雜的代碼塊中,一直到最后成功 <BR>地運行了內核為止。
<BR>依賴于你計算層次的方式,CPU成為內核引導程序的引導程序的引導程序的引導程序(CPU <BR>裝載BIOS,BIOS裝載LILO,LILO裝載壓縮內核,壓縮內核裝載解壓內核;但是你可以考慮 <BR>是否這些步驟都滿足引導程序的定義)。
<BR> <BR> <BR>-- <BR>※ 來源:·BBS 水木清華站 smth.org·[FROM: 166.111.196.22] <BR><CENTER><H1>BBS水木清華站∶精華區</H1></CENTER></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -