国产强伦姧在线观看无码,中文字幕99久久亚洲精品,国产精品乱码在线观看,色桃花亚洲天堂视频久久,日韩精品无码观看视频免费

      您現(xiàn)在的位置:智能制造網(wǎng)>技術中心>走進Linux 操作系統(tǒng)

      直播推薦

      更多>

      企業(yè)動態(tài)

      更多>

      推薦展會

      更多>

      走進Linux 操作系統(tǒng)

      2009年06月22日 16:56:11人氣:3220來源:浙江啟揚智能科技有限公司

      統(tǒng)的概念  
          雖然定義總是生硬、乏味、令人費解,但是它畢竟是概括性zui強、zui能體現(xiàn)水平的,所以我們還是要在開始就給出操作系統(tǒng)定義:  操作系統(tǒng)是應用程序的運行環(huán)境?! 蚓侔?!  可能運行環(huán)境這個術語令你如墜云端,它太廣泛、太抽象了。你一定在問運行環(huán)境到底是什么?簡單地講,運行環(huán)境是一種即服務和控制于一體地容器?! ∪绻銢]有理解環(huán)境這個概念,我可以舉個并不貼切的社會實例?! ≡陂_發(fā)區(qū)中可以看到許多企業(yè)孵化池或產業(yè)園,其中入住了各種各樣的企業(yè),孵化池或產業(yè)園的管理機構會統(tǒng)一為其中的企業(yè)辦理各種工商、保險、衛(wèi)生醫(yī)療等手續(xù)、提供后勤、治安等基礎服務,企業(yè)需要某些政務服務時,可以通過管理機構去和政府,處理相關事宜,而不需要親自去處理這些和企業(yè)業(yè)務無關的政務活動,因此可以抽出身來集中精力在業(yè)務上。孵化池和產業(yè)園為企業(yè)提供了統(tǒng)一、普遍地服務和管理,是企業(yè)運作的外在環(huán)境。操作系統(tǒng)從這個意義上來說,類似于產業(yè)園的管理結構,為應用程序——好比企業(yè)——提供基礎服務和管理?! ‘斎?,我們現(xiàn)在并不指望你立刻認識到操作系統(tǒng)深刻內涵,對它的認識需要在不斷地使用和思考中消化和積累,在本期雜志中,我們將從各種角度介紹“運行環(huán)境”這個術語的真實含義,并在今后各期雜志中分階段、分層次的展開學習操作系統(tǒng)的各個領域。相信在不久的將來,你就能和我們一起認清它的廬山真面目了。操作系統(tǒng)產生背景  想要認清一個人,是從小認識他。對技術的理解也是如此,我們必須了解它的產生原因和發(fā)展過程,才能較為全面的認識該技術所解決的問題,認識它在學科發(fā)展中所處的地位。對比技術發(fā)展各個階段的特點,才能認清該技術的優(yōu)劣。同樣,我們想要把握操作系統(tǒng)的特性,還是先把操作系統(tǒng)放在時間軸上看看它的來龍去脈吧!  操作系統(tǒng)并不是計算機出現(xiàn)之初就有的,zui初的計算機科學中并不存在操作系統(tǒng)這個概念,所有任務都直接運行于硬件之上。那時的任務大多集中于科學計算領域,系統(tǒng)硬件實現(xiàn)相對簡單、直接,任務對i/o操作的要求也比較低,將結果記錄到磁帶機之類的簡單設備中足矣。老程序員們大多采用手工或是用打孔機的方式將將二進制數(shù)據(jù)和程序輸入機器內存,然后執(zhí)行計算,zui后,將結果保存到磁帶機上。一旦出現(xiàn)錯誤,機器上的調試燈會將保存在寄存器中的錯誤代碼反映出來,程序員們會據(jù)此去分析錯誤所在?! ?br />     隨著科學計算任務變得越來越復雜,計算機逐漸被應用到了科學計算以外的其它領域。硬件設備比以前更加豐富和復雜了,i/o操作要求大幅提高,程序規(guī)模迅速擴大,需要調試的錯誤更是直線上升,直接操作硬件,對程序員來說變得越發(fā)困難?! ?br />    于是出現(xiàn)了語言、編譯系統(tǒng),幫助程序員簡化開發(fā)工作;出現(xiàn)了操作系統(tǒng),幫助程序員管理和操作硬件設備。程序員們可以將精力集中于開發(fā)需要的任務,煩瑣的如任務裝載、分配/釋放內存、內存尋址、設備驅動、數(shù)據(jù)存儲等等硬件相關操作統(tǒng)統(tǒng)交給操作系統(tǒng)管理——真可以說是生產力的一次解放。  
          時代繼續(xù)發(fā)展,多用戶多任務時代的來臨,使得系統(tǒng)管理更加強調資源共享性。用戶直接操作系統(tǒng)資源顯然有悖于上述精神,因此資源合理分配與保護更為操作系統(tǒng)發(fā)展提供了新的挑戰(zhàn)和機遇,同時奠定了操作系統(tǒng)*的地位,從此,操作系統(tǒng)成為為軟件體系中zui基礎,zui重要的組成部分了。操作系統(tǒng)的任務從操作系統(tǒng)的起源可以看出,操作系統(tǒng)的核心任務是作為硬件和應用程序之間的一個中間層,或者說是應用程序的一個操作平臺,通過它應用程序和系統(tǒng)硬件隔離開,應用程序利用它提供的服務完成硬件相關操作?! ?br />    總而言之,操作系統(tǒng)方便了應用程序運行,保護了系統(tǒng)資源。具體地講,操作系統(tǒng)為用戶帶來了幾個方面的好處:易操作性: 操作系統(tǒng)是用戶和計算機之間的接口,它大大簡化了用戶執(zhí)行任務的復雜程度?! ?br />    作為應用程序的執(zhí)行環(huán)境:它為程序員建立應用程序提供了必要的編輯環(huán)境、編譯環(huán)境和調試工具;為程序的執(zhí)行提供了載入服務和資源分配服務;為數(shù)據(jù)存取提供了i/o訪問服務;為數(shù)據(jù)格式轉化和定位提供了文件操作服務;為程序的安全運行提供了權限控制服務;為程序運行失敗提供了錯誤報告服務等等系統(tǒng)服務,從此,程序員和用戶都不再需要關心那些令人生畏的計算機體系結構細節(jié),可以全心全意地開發(fā)應用程序了?!?nbsp;
          有效性:從另一個角度看待操作系統(tǒng),可以將它認為是一個計算機資源管理系統(tǒng)?! ∮捎谙到y(tǒng)中資源種類各異,用法也大不相同,如果直接由用戶管理這些資源,比如內存分配,時鐘計時,i/o驅動,存儲維護,勢必要求用戶具有豐富的軟硬件知識,深刻把握計算機系統(tǒng)結構,否則資源將難以合理使用,zui終造成系統(tǒng)混亂,甚至崩潰。而且現(xiàn)代的多用戶操作系統(tǒng)更是要求系統(tǒng)資源共享,資源必須合理分配給多用戶、多任務,只有采用一定的調度策略和分配策略,才能保證資源被公平有效的利用。所以,配置資源成了提高性能的關鍵——如同資源配置是提高生產力的關鍵一樣。   
          安全性:安全性是操作系統(tǒng)為我們提供的另一個重要的特點,它為我們提供了多層面的安全保障?! ?br />    首先,操作系統(tǒng)作為系統(tǒng)硬件和用戶的中間平臺,禁止應用程序直接操作硬件,禁止應用程序直接訪問內存,執(zhí)行特權指令。多數(shù)系統(tǒng)都將應用程序運行限制在用戶空間(低特權級),而操作系統(tǒng)則運行于內核空間(高特權級),應用程序只有通過系統(tǒng)調用請求操作系統(tǒng)所提供的接口,才能通過操作系統(tǒng)間接執(zhí)行和硬件相關的操作或是執(zhí)行特權指令。因此保護了系統(tǒng)不被惡意的應用程序破壞或非法操作?! ?br />    其次,多任務多用戶操作系統(tǒng)必須保證,不同任務之間信息不能泄漏,因此需要為任務劃分各自的私有空間和對其進行訪問控制。對不同用戶進行相應的*和認證,可以保護用戶各行其是,互不侵犯。  
          總之,操作系統(tǒng)安全涉及方方面面,健壯的操作系統(tǒng)必須能多方位地保證任務安全執(zhí)行?! ∫讛U展:計算機技術的高速發(fā)展和計算機日益普及,計算機硬件設備不斷推陳出新,這要求操作系統(tǒng)提供的服務也能夠日新月異,因此要求操作系統(tǒng)具有良好的擴展性?! ?br />    由于操作系統(tǒng)對系統(tǒng)資源和服務進行了抽象,屏蔽了底層細節(jié),統(tǒng)一了上層接口,添加設備或服務成了一件輕而易舉的事,需要做的僅僅是,在設備或服務規(guī)定的接口下完成新的實現(xiàn)即刻?! ∈裁词琴Y源?  
          資源概念在操作系統(tǒng)中使用得相當廣泛,內存、磁盤、文件、處理器、時鐘等等軟硬件都可以劃歸到資源范疇。資源的概念其實很好理解,概括來講,系統(tǒng)中的資源指的是系統(tǒng)提供給進程使用的特殊實體,進程通過向操作系統(tǒng)請求獲得這些實體,另外,系統(tǒng)分配這些實體給進程前,進程需要掛起等待。凡是滿足上述條件的實體就屬于資源。操作系統(tǒng)的演化和其它任何事務一樣,操作系統(tǒng)并非一成不變。迄今為止,它已經(jīng)經(jīng)歷了半個多世紀的發(fā)展,已經(jīng)形成了一個龐大的家族。從個人計算機到工作站,從通用系統(tǒng)到系統(tǒng),從嵌入式到虛擬機,可謂形式豐富多樣。我們難以將所有操作系統(tǒng)囊括,只希望提綱挈領地介紹在操作系統(tǒng)發(fā)展進程中具有代表性的幾種系統(tǒng),理清它的演化脈絡。         
          進化歷程 :   zui早的操作系統(tǒng)是簡單的單道批處理系統(tǒng)。它的功能相當簡陋,只能串行執(zhí)行預先組織好的任務組。早先的系統(tǒng)一次只能運行一個任務,每個任務必須先裝入,再等執(zhí)行完后才能裝入下一個任務,重復的裝入浪費了大量的時間。單道批處理系統(tǒng)的出現(xiàn),大大的提高了系統(tǒng)吞吐率。   事情并非總如想象般順利?! ?
          由于數(shù)據(jù)存儲時所消耗的時間——i/o操作時間——相比數(shù)據(jù)處理時間——cpu操作時間——要高出數(shù)倍(往往在20倍以上),所以程序運行到i/o操作期間,cpu總是需要停下來(掛起)等待數(shù)據(jù)傳輸完成,無形中浪費了大量寶貴的時間,任務組中后續(xù)程序的執(zhí)行也因此被延遲了。如何避免數(shù)據(jù)傳輸?shù)却龓淼臅r間浪費呢?能否在進行傳輸期間,解放cpu去執(zhí)行別的任務呢?  為解決這個瓶頸,單道批處理系統(tǒng)進化到了多道批處理系統(tǒng)。  
          所謂多道就實際就是說,處理器(當然現(xiàn)在談到的都屬于單處理器系統(tǒng))可以交錯運行多個程序,某個任務掛起時,運行另一個程序。這樣一來, cpu等待數(shù)據(jù)傳輸造成的時間浪費問題得以解決,系統(tǒng)吞吐率又一次得到了提高。  計算機的發(fā)展使得任務不再僅僅局限于科學計算,越來越多的應用于辦公、生活等日?;顒又???茖W計算中的任務多數(shù)執(zhí)行路徑都是固定不變,預先定義好的,只需要給定輸入,得到結果期間程序執(zhí)行中途不需要外界干預,與之不同,辦公,生活中的許多任務都必須和用戶不斷交互,任務結果隨時都會因為用戶的選擇改變。這時的系統(tǒng)變得更公開、更普遍,往往允許多個用戶可以同時使用。交互模式和共用模式需要任務響應時間盡可能的快(超過20秒的話,人的思維就容易被打斷或變得很不耐煩),這樣才能讓多個用戶都滿意,于是操作系統(tǒng)開始采用分時技術,處理器的運行時間分成數(shù)片,均分或依照一定權重派發(fā)給系統(tǒng)中的用戶使用。這種將處理器虛擬給多用戶共同使用的方法,不但可以滿足快速響應,而且也可以使得所有用戶獲得計算機*是在為自己服務的假象?! ?br />    上面給出了操作系統(tǒng)發(fā)展的主流路線:單道批處理——多道批處理——分時系統(tǒng),除此以外現(xiàn)在還出現(xiàn)了許多分布式操作系統(tǒng),嵌入系統(tǒng),不過總體技術思路都仍然脫離不了多道、分時等概念。操作系統(tǒng)內容  操作系統(tǒng)的演化使得其功能變得愈來愈強大,但結構也越來越復雜。在以方便用戶(包括開發(fā)人員和終端用戶)為宗旨的思想下,操作系統(tǒng)不斷集成新功能,新服務?;貞洀那按蠹沂褂玫膁os系統(tǒng)僅僅只需要一張軟盤,而如今的windows系統(tǒng)或linux系統(tǒng)動輒就需要數(shù)張光盤,可見已經(jīng)從過去的麻雀變成了恐龍——雖然它們都有五臟六腑。  
          雖然變成了恐龍,但是其結構還時相對穩(wěn)定,清晰的。和軟件工程提出的思想一致,操作系統(tǒng)也采取了分層結構,越向上層抽象都越高,越接近用戶;相反越向下層,越靠近硬件,抽象也相對接近硬件。而且高層軟件依靠下層軟件提供的服務,再加上本身提供附加服務為更高層服務??傮w來講呈現(xiàn)倒金子塔形式?! ?br />    下面我們就簡要分析一下操作系統(tǒng)的體系結構,然后再談談操作系統(tǒng)設計時需要主要考慮的問題。操作系統(tǒng)組成   在形形色色的操作系統(tǒng)之中,組成結構不盡相同。因為同樣目的實現(xiàn)的手段可以自由選擇,所以其組成也有很大差異,我們選取zui普遍的操作系統(tǒng)(unix)組成結構,向大家揭示操作系統(tǒng)的體系結構的大致框架。對于各種操作系統(tǒng)之間的具體差異,大家可以以下面講述的結構對比認識。(注意我們這里所說的操作系統(tǒng)屬于宏觀概念,接近于操作系統(tǒng)發(fā)行版,不但包括了內核,還包含了學多系統(tǒng)軟件和基礎應用軟件。)      
          我們用一組簡單的數(shù)學公式來描述操作系統(tǒng)的組成要素:     操作系統(tǒng) = 內核+系統(tǒng)程序     系統(tǒng)程序 = 編譯環(huán)境 + api + aui     編譯環(huán)境 = 編譯程序+連接程序 + 裝載程序     api      = 系統(tǒng)調用 + 語言庫函數(shù)(c,c++,java,etc)     aui     =  shell + 系統(tǒng)服務例程(如x服務器等)+應用程序(瀏覽器,字處理,編輯器)          操作系統(tǒng)zui底層的組件是內核,其上層搭建了許多系統(tǒng)軟件。系統(tǒng)程序包括三個部分。這三個部分分別是:編譯環(huán)境、應用程序接口和用戶接口。編譯環(huán)境包含匯編,c 等低語言編譯程序,連接程序和裝載程序,這些程序負責將文本格式的程序語言轉變?yōu)闄C器能識別和裝載的機器代碼;應用程序接口(api)包含內核提供的系統(tǒng)調用接口和語言庫,系統(tǒng)調用是為了能讓應用程序使用內核服務,語言庫函數(shù)則是為了方便應用程序開發(fā),所以將一些常用的基礎功能預先編譯以供使用,比如對c語言來說常用的c庫有gun c等;用戶接口(aui)包括我們熟悉的shell(關于shell 應該專門寫一個教程)、系統(tǒng)服務程序和常用的應用程序?!    ?br />    這些部分并非所有的操作系統(tǒng)都必須一個不少的包含,不過其中大多數(shù)功能都應該提供,尤其內核,系統(tǒng)調用,shell這些基本組件,它們都屬于操作系統(tǒng)*組件,其它組件是否包含需要根據(jù)具體系統(tǒng)的要求和應用環(huán)境決定,你也可以將其歸為操作系統(tǒng)之外的附加部分?!    ?/p>

          系統(tǒng)程序:系統(tǒng)程序是相對應用程序而言的,應用程序針對終端用戶需求完成功能,而系統(tǒng)程序則是為了簡化應用程序的開發(fā)而存在的,比如數(shù)據(jù)庫系統(tǒng)為了應用程序提供了有效的數(shù)據(jù)傳輸,存儲服務;還有編程語言的執(zhí)行環(huán)境——它由c庫實現(xiàn)——也屬于一種系統(tǒng)程序,它為應用程序開發(fā)提供了諸如i/o操作例程,圖形庫,計算庫等等基礎服務??梢娤到y(tǒng)程序范圍覆蓋很廣,只要面相服務群體不是zui終用戶的軟件都可以劃歸到系統(tǒng)軟件中來。
          內核概念  操作系統(tǒng)zui核心,zui基礎的組件就要屬內核了——內核和操作系統(tǒng)的其它系統(tǒng)軟件或應用程序本質的區(qū)別在于內核運行在高特權級,和硬件直接交互,操作權限幾乎不收任何限制,因此內核程序編寫也要求格外謹慎,必須保證效率和可靠?!   ?br />    特權級別:現(xiàn)代體系結構中往往為了保護操作系統(tǒng)(內核)的數(shù)據(jù)不被應用程序訪問,以免關鍵數(shù)據(jù)泄露或系統(tǒng)被破壞,將系統(tǒng)(硬件機制)劃分為不同的特權級別,敏感數(shù)據(jù)存在高特權級,且還規(guī)定了一些特權指令,其它級別的任務不能訪問敏感數(shù)據(jù)和使用這些特權指令,只有處于特權級別的任務才有權使用。比如ox86體系結構中存在4個特權級別(0,1,2,3)linux操作系統(tǒng)將內核存在0級,其它任務運行在3級。0級被稱為內核空間,3級被稱為用戶空間。內核設計的主要任務內核作為操作系統(tǒng)的核心,運行級別zui高。其它系統(tǒng)程序都必須通過它才可以使用系統(tǒng)資源,獲取系統(tǒng)服務。所以內核使用zui為頻繁,一切系統(tǒng)行為無論巨細都要通過內核參與。因此內核運行效率和正確性對整個系統(tǒng)的運行效率和可靠性至觀重要,如果內核效率稍微下降,那么在應用程序中就必然造成層層放大。   
          內核要求率,所以它必須自系統(tǒng)運行起就要載入內存,并且在運行期間一直駐留在內存中,直到系統(tǒng)關閉。這是內核與其它應用程序或系統(tǒng)程序的另一個顯著區(qū)別。雖然說內存今天已經(jīng)不再是天價了,但是畢竟內存容量有限,所以內核大小不能過大(linux內核只有幾m或十幾m,甚至可以裁減得更?。?,因此內核只應該包含zui基礎和核心的功能,其它附加功能應該盡量提到用戶空間完成。   
          那么到底有那些功能是操作系統(tǒng)使用zui頻繁,zui需要在內核中實現(xiàn)的呢?內核直接架構于硬件資源之上,因此首先要做的就是對硬件的資源管理。因此內核必須負責:內存管理,進程和進程調度(對cpu的管理),文件系統(tǒng)管理,i/o處理等任務?! ?br />    我們的雜志核心就是在解釋內核原理的基礎上,帶領大家學習內核級別的開發(fā),也就是說進行核心開發(fā)。本期僅僅給大家一個概念上的說明,描述內核設計需要完成的主要任務,至于具體內核各部分的詳細討論在后續(xù)期刊中將逐步展開?! ?br />    內核至少需要包含如下幾個模塊。  進程管理:進程是操作系統(tǒng)中的執(zhí)行代碼,是任務在系統(tǒng)內的動態(tài)化身。內核必須負責將任務抽象為進程,而且必須能將進程執(zhí)行,能為進程分配資源,維護進程的執(zhí)行狀態(tài),提供進程間通訊方法。更進一步講,進程管理還必須保證進程運行的可靠性,因此需要提供進程同步,互斥,防死鎖等等服務,另外進程調度也是進程管理中的重要任務?! 却婀芾恚河嬎銠C存儲部件由快到慢、由小到大分為緩存、內存和磁盤。其中zui主要和必須是內存,內存管理包括內存的分配和釋放,以及訪問保護等。另外對使用虛擬內存的系統(tǒng),內存管理還包含虛擬內存管理,磁盤交換管理,內存影射等等。  
          文件系統(tǒng):文件是多數(shù)系統(tǒng)中用戶使用和管理數(shù)據(jù)的主要方式,文件系統(tǒng)需要負責用戶文件訪問,訪問權限控制,文件格式轉換,數(shù)據(jù)傳輸?shù)纫幌盗袉栴}?! ≡O備管理:除了存儲設備外,系統(tǒng)還有大量外設需要操作系統(tǒng)管理,比如時鐘,網(wǎng)卡,鍵盤,磁盤等等,設備管理需要負責驅動這些設備為上層調用服務?! ?br />    i/o管理:操作系統(tǒng)中i/o管理負責處理復雜的i/o操作,其中包括i/o緩沖和磁盤調度等?! ×硗庵袛喙芾硪彩遣僮飨到y(tǒng)內核應該實現(xiàn)的功能?!   ?br />    以上是操作系統(tǒng)內核設計要考慮的主要問題,其中各種模塊彼此相互交錯、相互利用。不過這些模塊的劃分并不是的,在實際系統(tǒng)中可能有不同的組合或更細致地劃分,因此我們不必追究模塊的具體內容,需要關注的是內核究竟需要完成那些功能。  內核模塊大致也有層次之分,我們可以這樣理解層次含義:直接和硬件作用的是硬件抽象層,和用戶更靠近的屬于邏輯抽象層。  所謂硬件抽象層,是指管理硬件設備的模塊,比如存儲管理、設備管理這些模塊將硬件功能抽象為內核數(shù)據(jù)結構和接口函數(shù),以供上層使用。比如磁盤設備驅動,需要將磁盤設備功能抽象為打開open,寫入(write),讀取(read)等接口函數(shù);內存管理需要將內存抽象為頁、段等結構體。然后分配、合并、釋放等工作都是通過操作這些抽象得來的結構體,再由這些結構影射到內存的物理實體上去的完成實際操作的?! ?br />    所謂邏輯抽象層zui主要的目的是為了貼近用戶需求,zui重要的邏輯抽象模塊就是文件系統(tǒng),文件系統(tǒng)的存在*是從用戶角度出發(fā)設計的,因為用戶zui能接受以用文件形式包裝的信息,所以文件系統(tǒng)屬于邏輯上的抽象,因為物理設備中沒有對應文件的實體?! ?br />    對于進程管理來說,其中進程執(zhí)行和調度要和處理器打交道,應該說屬于硬件抽象層,但其中進程狀態(tài)維護,進程通訊等更接近用戶使用,因此可以歸結到邏輯抽象層?! ×硗鈏/o管理和中斷管理些模塊,在內核中屬于為其它模塊服務的借用力量,它們主要被文件系統(tǒng)或設備管理模塊使用,但總之是面向硬件的,所以也可以將其歸為硬件邏輯層。                                                                           linux操作系統(tǒng)  在眾多商業(yè)操作系統(tǒng)和免費操作系統(tǒng)中,linux占有獨到地位,它不但功能強大,接近于工業(yè)強度,而且結構設計幽雅,具有良好的擴展性和移植性,接口定義規(guī)范,基本和unix系統(tǒng)兼容。更為重要的優(yōu)勢在于linux操作系統(tǒng)是的開源軟件,它的產生揭開了開元運動的新紀元,對自由軟件發(fā)展起到了前所為有的推動作用?! inux開放性,也就是它不拘一格的拿來主義精神,吸引了無數(shù)軟件愛好者熱情的投入到其開發(fā)中去,因此linux是當今發(fā)展zui快,范圍zui廣的開元軟件之一。它是社區(qū)中大家zui樂意討論和參與的項目,也正是這種開源精神使linux成為操作系統(tǒng)愛好者的良師益友,它在教育意義上的貢獻是的。從這節(jié)起我們將進入linux世界去探索操作系統(tǒng)軟件的嚴謹,去感受linux的可愛。linux操作系統(tǒng)的起源      linux的*個版本誕生于1991年,它的作者就是現(xiàn)在大名鼎鼎linus torvalds,這個芬蘭小伙子據(jù)說zui初是在做一個作業(yè)調度系統(tǒng)的學校家庭作業(yè),后來他突發(fā)靈感開始著手將系統(tǒng)改造為一個實用的操作系統(tǒng),他在開發(fā)初期借助了當時zui負盛名的教育類操作系統(tǒng)minx的一些思想和成果,但他的雄心是要將自己這個系統(tǒng)變的比minx更實用、更強健,因此他決定把自己的系統(tǒng)代碼公布于眾,并且歡迎任何支援者來修改和擴充linux系統(tǒng)——這正是我們現(xiàn)在耳聞祥熟的gun協(xié)議的權益——linux選擇了當時在世界上zui受推崇的un ix系統(tǒng)接口標準:posix.1來作為自己的內核系統(tǒng)調用接口,從此linux成為了unix風格操作系統(tǒng)家族中的新貴,而且是一個代碼*公開的操作系統(tǒng)。     linux的生命力來自于它的開源思想,自linus公開linux代碼一來,世界各地的軟件工程師和愛好這不斷積極地對linux系統(tǒng)今進行修改和加強,先后將其版本從0.1 提高到2.0 、2.2、2.4到如今的2.6,同時linux也被從初期的x86平臺移植到了powerpc、sparc、mips、68k等幾乎市面上能找到的所有體系結構上。更另人激動的是,拜開源運動之新風,數(shù)不勝數(shù)的應用軟件出現(xiàn)在linux系統(tǒng)之上,這樣大大加強了linux系統(tǒng)的實用能力。     linux作為開源軟件中的桂冠,越來越受到歡迎,毫無疑問地成為人氣zui旺,zui活躍的gun項目,圍繞linux的社區(qū)雨后春筍般的出現(xiàn),這一切都預示著linux將在教育領域,在工業(yè)領域在政治領域將得的成功。linux 操作系統(tǒng)的技術特點   linux系統(tǒng)吸收了unix操作系統(tǒng)的精華思想——“簡單就是美”,因此它采用了緊縮內核結構,只在內核中實現(xiàn)那些必要的功能,盡量保持內核精悍短小。至于那些豐富多彩的附加功能統(tǒng)統(tǒng)交給用戶空間的庫函數(shù)或其它系統(tǒng)軟件或應用軟件完成。  有時大家將直接將linux內核和 linux操作系統(tǒng)化等號,這也沒錯的。而我們上文提到的操作操作系統(tǒng)多數(shù)情況不僅僅只內核而且還只內核之上的系統(tǒng)程序,可以說是廣義的操作系統(tǒng)概念,希望大家區(qū)別?! 榱四苁芤嬗趗nix系統(tǒng)的影響力,linux采用了unix的系統(tǒng)調用接口標準poxis.1,保證了和unix系統(tǒng)的有限兼容,從而抓住了很大一部分unix技術人員?! ×硗鈒inux起源于小型計、通用算機,并非針對大型和計算機設計,因此結構復雜性和規(guī)范性都比較適中?! ∵€有就是目前多數(shù)linux操作系統(tǒng)版本都是以服務器為出發(fā)點,因此網(wǎng)絡功能和系管理能力突出,多數(shù)應用也是專為網(wǎng)絡管理服務的,對于個人用戶所關注的桌面應用和嵌入應用關注的實時性支持尚且有限(今年linux發(fā)展的一個重要議題就是針對桌面和嵌入開發(fā)相應的內核版本)。  linux 內核的特點   linux是一種是實用性很強的現(xiàn)代操作系統(tǒng),開發(fā)它的中堅力量是軟件工程師,因此多以實用性和效率為出發(fā)點,很多地方還考慮了工業(yè)規(guī)范和兼容性等因素,因此不同于教學性操作系統(tǒng)追求理論上的性,linux系統(tǒng)內核zui注重的問題是實用和效率。  下面我們簡要歸納一下linux內核的特色?! ?,linux內核被設計成單巨內核(monolithic?)結構(相對微內核而言,微內核是一種功能更貼近硬件的核心軟件,它一般僅僅包括初等內存管理、同步原語、程間通訊機制、i/o操作和中斷管理,這樣做有利于擴展性和移植性。但是微內核與諸如文件管理、設備驅動、虛擬內存管理、進程管理等其它上層模塊之間需要有較高的通訊開銷,所以目前多集中在理論教學領域,對工業(yè)應用效率難以保證。),因此效率高,緊湊性強。    第二, 2.6版本前l(fā)inux內核是單線程結構——所謂但線程結構是說同一時間只有一個執(zhí)行線程(內核中的執(zhí)行程序)允許在內核中運行,不會被調度程序打斷運行其它任務,這種內核被成為非搶占的,它的好處在于內核中沒有并發(fā)任務(單處理器而言),因此避免了許多復雜的同步問題,但其不利影響是非搶占特性延遲了系統(tǒng)響應速度,新任務必須等待當前任務在內核執(zhí)行退出才能獲得運行機會。工業(yè)控制領域需要高響應速度,因此2.6版本后由于robert love等人的貢獻,將搶占技術引入了linux內核,使得其變?yōu)閮群藫屨枷到y(tǒng),當然付出的代價是同步操作進一步復雜化了?!   〉谌瑸榱吮WC能方便地支持新設備、新功能,又不會無限擴大內核規(guī)模,linux系統(tǒng)對設備驅動或新文件系統(tǒng)等采用了模塊化方式,用戶在需要時可以現(xiàn)場動態(tài)加載,使用完畢可以動態(tài)卸載。同時對內核,用戶也可以定制,選擇適合自己的功能,將不需要的部分剔除出內核。這兩種技術都保證了內核的緊湊性和擴展性。    第四,linux內核純粹是一種被動調用服務對象,所謂被動是因為它為用戶服務的*方式是用戶通過系統(tǒng)調用來請求在內核空間運行某個函數(shù)。內核本身是一種函數(shù)和數(shù)據(jù)結構的集合,不存在運行的內核進程為用戶服務(雖然linux的確存在一種被稱為內核線程的進程,但它并不是用來服務于用戶的,僅僅作為系統(tǒng)自身的服務目的)。    第五, linux內核的采用虛擬內存技術使得內存空間虛擬擴展到了4gb之多,其中0-3g屬于用戶空間,稱為用戶段,3g-4g屬于用戶空間,稱為內核段。這樣使得用戶編寫程序可以使用遠遠大于實際內存的存儲空間?!   〉诹?linux的文件系統(tǒng)zui大特點是實現(xiàn)了一種抽象文件模型——vfs(虛擬文件系統(tǒng)),該文件系統(tǒng)屬于unix風格。使用虛擬文件系統(tǒng)屏蔽了各種不同文件系統(tǒng)的內在差別,使得用戶可以使用同樣的方式訪問各種不同格式的文件系統(tǒng),可以毫無區(qū)別地在不同介質不同格式的文件系統(tǒng)之間使用vfs提供的統(tǒng)一接口交換數(shù)據(jù)。這種抽象為linux帶來了無限活力?! 〉谄?, linux提供了一套很有效的延遲執(zhí)行機制——下半部分,軟中斷,tasklet和2.6新引入的工作列隊等,這些技術保證了系統(tǒng)可以針對任務的輕重緩急,更細粒度的選擇執(zhí)行時機。保證了系統(tǒng)運行時盡量在安全時間(不關中斷)?!   inux除了以上提到的特色外,還有許多其它突出特點,我們將在以后各期的介紹中有序地介紹。如果對上述特色有疑問的話,請別著急,后面的學習將為你解答?! inux 操作系統(tǒng)內核結構  linux內核雖然實現(xiàn)和unix系統(tǒng)有很大不同,但是其結構還基本保持和unix雷同,其中功能也和我們前面提到的操作系統(tǒng)內核要求大體一致?! ≌堃娤聢D    下面我們簡要說明一下個模塊之間的。    用戶空間的任何程序如果需要使用內核提供的服務,都必須經(jīng)過系統(tǒng)調用,因此系統(tǒng)調用層和內核中大多數(shù)模塊都留有接口,它們或是用來控制系統(tǒng)服務屬性(如sys_fnctl設置文件操作屬性;sys_nice設置進程時間片),或是從內核提取數(shù)據(jù)(如sys_time獲得由時間中斷維護的系統(tǒng)計時),或請求內核分配資源(brk擴展進程堆內存)?! ∥募到y(tǒng)包含vfs和各種實際文件系統(tǒng)。vfs為實際文件系統(tǒng)抽象了統(tǒng)一接口,而實際文件系統(tǒng)提供自身具體實例操作方法。另外在linux中和unix一樣設備被巧妙的歸屬為特殊文件,受文件系統(tǒng)抽象和管理,因此其操作方式和文件系統(tǒng)一致。文件系統(tǒng)將對設備的操作遞交給實際的設備驅動處理?! inux中設備管理將設備被區(qū)分為塊設備——可以隨機訪問,如磁盤——和字符設備——只能順序訪問,如鍵盤。字符設備結構簡單,文件系統(tǒng)可將請求直接提交給字符設備驅動處理,但是對于塊設備,由于頻繁的隨機訪問需要反復進行磁盤尋址操作,這樣會對系統(tǒng)載核的帶來沉重負擔,因此內核對塊設備的請求必須加以整合,比如對請求排隊、合并、然后有選擇地派發(fā)給物理設備;另外讀取設備時還需要在內存中進行緩沖磁盤塊。因此在請求被提交給塊設備前必須經(jīng)過i/o層處理進行預處理,在磁盤塊被讀取后必須由i/o層進行塊緩沖處理?! ≈袛喙芾硐到y(tǒng)負責為設備服務,它相比輪詢等方式節(jié)約了cpu周期,另外時鐘中斷還要負責更新系統(tǒng)時間,觸發(fā)進程調度。  內存是系統(tǒng)中的核心資源之一,是數(shù)據(jù)存儲和傳遞的必被條件,因此管理系統(tǒng)不但系統(tǒng)調用需要使用,而且?guī)缀跸到y(tǒng)中所有模塊都多多少少地需要使用內存管理系統(tǒng)的函數(shù)。文件系統(tǒng)、i/o系統(tǒng)用來緩沖數(shù)據(jù)都需要分配內存,進程管理中的進程數(shù)據(jù)存儲,地址影射都需要內存,堆的增長也需要動態(tài)請求內存;還有就是進程通訊中的一個有效方法就是利用共享內存來實現(xiàn)的。  進程管理除了和內存管理和進程通訊有關外,也和文件系統(tǒng)有重要關聯(lián),因為進程資源中文件毫無疑問屬于zui重要的部分之一,因此進程管理系統(tǒng)也必須和文件系統(tǒng)交互?! ∑渲袀€個模塊不是孤立的,而是萬千,對于其中奧秘,希望讀者仔細咀嚼。

                                                                          linux 操作系統(tǒng)的文件構成     內核雖說是linux操作系統(tǒng)的精華所在,是其它程序賴以運行的基礎,但是如果一個實用的操作系統(tǒng)僅僅只有內核,而在其上沒有豐富、強大的系統(tǒng)程序和應用程序供用戶使用,就好比大廈建好了,也通了電,但卻沒有電梯、和辦公設備,用戶仍然無法入住使用。因此linux操作系統(tǒng)的發(fā)行版除了帶有內核以外,還帶有大量的系統(tǒng)程序和應用程序,比如紅帽子系統(tǒng)的發(fā)行版本句需要2-3張光盤,其中絕大部分是應用程序。     要想深入學習linux內核,首先需要能熟練使用linux操作系統(tǒng),了解整個系統(tǒng)文件構成——正所謂,刨丁解牛,始見無非全牛者——由外至內的學習linux,再從內向外推敲;從感性深入理性,再由理性返回感性,才會獲得zui深刻的認識。內核的眾多特點zui終還是要反映到用戶應用上的,所以先熟悉應用無疑會對內核學習有很大裨益。而且學習內核結構的一個重要目的就是推動我們更有效的使用linux操作系統(tǒng),無論是從系統(tǒng)管理角度來說或是從程序開發(fā)角度上說,掌握內核級別的系統(tǒng)調用、資源分配、中斷控制或進程調度等技術都是不凡的價值,可以幫助你有效開發(fā)和駕馭系統(tǒng)。     這節(jié)我們先在這里簡要介紹一下linux系統(tǒng)的文件構成,將linux操作系統(tǒng)的外在全貌展現(xiàn)給大家。我們在系統(tǒng)啟動后,進入系統(tǒng)所能觀察到的就是一系列目錄(使用ls或dir),認識這些目錄構成是學習使用linux系統(tǒng)的*步,下面我們就羅列出主要目錄并簡要描述各自內容。linux系統(tǒng)根目錄/下包含包含:bin:該目錄存放zui常用的基本命令,比如拷貝命令cp、編輯命令vi、刪除命令rm等。boot:該目錄包含了系統(tǒng)啟動需要的配置文件、內核(vmliuxz)和系統(tǒng)鏡像(initrd….img)等。dev:該目錄下存放的是linux中使用或未使用的外部設備文件(fd代表軟盤,hd代表硬盤等),使用這些設備文件可以用操作文件的方式操作設備。     etc:該目錄下包含了所有系統(tǒng)服務和系統(tǒng)管理使用的配置文件;比如系統(tǒng)日志服務的配置文件syslog.conf,系統(tǒng)用戶密碼文件passwd等     home:該目錄下包含了除系統(tǒng)管理員外的所有用戶的主目錄,用戶主目錄一般以用戶登陸帳號命名。     lib:該目錄下包含了系統(tǒng)使用的動態(tài)連接庫(*.so)和內核模塊(在modules下)。     host+found:該目錄包含了磁盤掃描檢測到的文件碎片,如果你非法關機,那么下次啟動時系統(tǒng)會進行磁盤掃描,將損壞的碎片存到該目錄下。     mnt:該目錄下包含用戶動態(tài)掛載的文件系統(tǒng)。如果要使用光盤,u盤都一般應該將它們安裝到該目錄下的特定位置。     proc:該目錄屬于內存影射的一個虛擬目錄,其中包含了許多系統(tǒng)現(xiàn)場數(shù)據(jù),比如進程序數(shù),中斷情況,cpu信息等等,它其中的信息都是動態(tài)生成的,不在磁盤中存儲。     root:該目錄是系統(tǒng)管理員(root用戶)的主目錄。     sbin:該目錄下包含系統(tǒng)管理員使用的系統(tǒng)管理命令,比如防火墻設置命令iptable,系統(tǒng)停機命令halt等   tmp:該目錄下包含一些臨時文件?!  sr:該目錄下一般來說包含系統(tǒng)發(fā)布時自帶的程序(但具體放什么東西,并沒有明確的要求),其中zui值得說明的有三個子目錄     /usr/src :linux內核源代碼就存在這個目錄     /usr/man :linux中命令的幫助文件     /usr/local : 新安裝的應用軟件一般默認在該目錄下   var:該目錄中存放著在不斷擴充著的信息,比如日志文件。     以上就是linux文件系統(tǒng)的原始構成,熟悉它們是應用linux操作系統(tǒng)的前提,希望大家親自打開各目錄看看。搭建linux試驗系統(tǒng)實例  進入后續(xù)章節(jié)討論的內核前,我們先與讀者一同從頭構架一個試驗操作系統(tǒng)。這樣既有助大家熟悉linux操作系統(tǒng)的組成結構,也會在構建過程中學習介紹一些linux命令和使用技巧,加深理解linux操作系統(tǒng)的運作方式?! 嶒炏到y(tǒng)將在保證實用價值的基礎上,盡量小巧。希望大家通過親手構建系統(tǒng)的過程中,能消除對linux的恐懼感,更希望讀者自己能使用裁減的系統(tǒng),給自己帶來成就感和學習熱情。*的基礎知識   對于*次接觸linux的朋友,僅僅看下面的內容顯然不能指望學會linux的操作方法和系統(tǒng)行為,建議你去找本系統(tǒng)一點的linux系統(tǒng)教程慢慢咀嚼吧。對于像系統(tǒng)管理員這種大牛,跳過下面內容吧,再高的就去看看新浪體育新聞什么的,別在這瞎轉了:)。  搭建系統(tǒng)過程中將離不開敲擊各種各樣的命令,離不開執(zhí)行大大小小的shell腳本。而zui整個過程中重要的是理解系統(tǒng)的運行思路,一切活動的指導思想都要圍繞系統(tǒng)運行的步伐,要“順從“系統(tǒng)運行自己和系統(tǒng)運行服務這一指導思想。所以基礎知識也從這幾個角度展開。 不過我們蜻蜓點水,不做深究。  基本命令我們首先介紹一組搭建linux系統(tǒng)需要使用的基本的命令。當?shù)顷懙絣inux系統(tǒng)上后,出現(xiàn)在我們面前的是一個shell?提示符(# 或 $等),該提示符號告訴我們系統(tǒng)已經(jīng)準備接受命令了,你可以用鍵盤輸入命令行來操作系統(tǒng)了,你輸入的命令將在屏幕上顯示出來,并議回車鍵表述命令輸入結束、發(fā)送命令給系統(tǒng)的標志                                                                                          shell和shell編程                                                                                                   shell是什么?  在你登陸到系統(tǒng)后,系統(tǒng)首先運行的是一個特別的應用程序,它顯示一個提示符號表明系統(tǒng)已經(jīng)準備好開始接受你的命令了,當你鍵入你要執(zhí)行的命令后,該應用程序將命令提交給linux系統(tǒng)去處理,然后等處理完畢再把結果返回給你,這之后她又將回到提示狀態(tài),去等待你下次輸入命令。這個特殊的“接待”程序就被稱為shell,其作用相當是一個內核與用戶交流的界面,她周而復始地向內核解釋用戶命令,因此shell又被稱稱為命令解釋器。  shell作為一種應用程序并非只有*一種,目前流行的shell有sh / bash /ksh /tcsh/csh等等,他們其實也就始一個應用程序,你可以使用命令whereis ksh/sh/bash來查看其存在于系統(tǒng)中的具體位置?! ∮信d趣得話,你可以通過命令 echo $shell來觀察系統(tǒng)默認的shell屬于那一種。你也可以在登陸后(使用ctrl+d可以重新登陸)使用chsh來改變選擇使用的shell程序,或干脆直接在默認shell上執(zhí)行新的shell程序——只要鍵入新shell名字并回車即可,如果想推出新shell,就再執(zhí)行exit程序?! 「鞣Nshell程序各有特點,功能也有強又弱,但是相同點都需要能夠執(zhí)行程序或命令;能夠處理程序或命令的輸入輸出;能夠執(zhí)行shell腳本。(shell 能執(zhí)行三種不同概念的文件:1命令指shell程序自己內置的基本命令——如 cd 命令,管道 | 命令 >重定向命令——和以二進制文件形式存在的系統(tǒng)命令——如ls cp等。2  程序指用戶安裝和編譯身成的二進制文件;3腳本指包含邏輯關系的程序和命令序列)  shell執(zhí)行文件需要必要的環(huán)境,這些環(huán)境包含文件搜索路徑,當前目錄,用戶主目錄,默認編輯器等等(你可以從man shell種獲得這些信息)。這些信息屬于環(huán)境變量,可以通過env觀察當前系統(tǒng)默認的環(huán)境變量,改變這些變量可以通過:變量=設置(如 path= /opt)命令方式和修改存在于用戶目錄下的相關配置文件(如對bash來說配置文件愛你為~/.bashrc,~/.bash_profile)shell編程   shell編程簡單地講就始講命令序列化后執(zhí)行,而不用被編譯成二進制可執(zhí)行文件。這類似于dos下地bat批處理文件。使用shell程序的意義在于,有些任務無法通過現(xiàn)有的命令完成,必須使用一組命令協(xié)作才能完成,而且各種命令之間不是簡單的羅列而是按照設定的邏輯關系有機結合。由此可見shell程序需要能夠控制各種命令的執(zhí)行流,能夠讀寫臨時數(shù)據(jù),因此,shell程序存在自己控制語句和變量,而且對其使用也由相關語法?! hell程序,也可以成為shell腳本,以普通的linux文本文件形式存在??梢允怯胿i等文本編輯器生成,再將其屬性改為可執(zhí)行即可運行?! ”热?touch test 生成文件test       chmod u+x test 修改屬性       ./test  保險其間可以再腳本頭先使用#!符號來強制當前shell運行其后的制定shell文件來執(zhí)行該腳本?! ‘斎籹hell編程覺非上面說的那樣簡單,想要真正學習shell編程并能使用它可不那么容易。有興趣的朋友可以參看有關資料了解shell編程?! ∠到y(tǒng)服務安裝過linux的朋友一定熟悉安裝過程種系統(tǒng)會提示你選擇何種服務,或安裝完畢使用setup命令也可看到一個配置界面其中包含系統(tǒng)服務配置。系統(tǒng)服務包含一系列形形色色的服務,很多服務選項我們*,或者僅僅聽說過罷了。著很正常,因為服務太多太雜了,很少有人能全部搞清楚這些服務是干什么的。我們這里也不追究所有服務的詳細作用,僅僅從系統(tǒng)運行角度介紹一下這些服務的使用方法。(想知道系統(tǒng)到底有那些服務,試試setup命令吧。)  系統(tǒng)服務程序和普通應用程序或系統(tǒng)命令本質是相同的,都是一些二進制文件。但其運行方式卻有一些自身特點。系統(tǒng)服務多數(shù)情況下都處于后臺運行,因此運行結果一般不再屏幕顯示(往往被重新定向到/dev/null中),但是為了安全目的或分析目的,大多記錄都要求保存到相關日志中;另外系統(tǒng)服務程序運行時多需要進行一定配置,比如ftp服務器有用戶訪問權限配置,工作目錄配置,因此需要從配置文件取數(shù)據(jù)初始化服務程序。zui后就時服務程序很多時隨系統(tǒng)啟動就開始運行,而不需要用戶自己啟動?! ∮捎谶@些特點系統(tǒng)服務程序的啟動或停止一般都存在相應的shell腳本文件管理,利用這些腳本可以控制服務程序的配置,啟動,日志記錄以及關閉服務和清理臨時文件操作。這樣相比用戶手動操作要方便安全得多?! inux系統(tǒng)中的服務程序運行腳本(啟動或關閉)都存放在目錄/etc/rc.d/init.d下——linux系統(tǒng)的文件組織層次遵循fhs規(guī)范,包括腳本位置——比如我們啟動/停止網(wǎng)絡所用的network 等腳本。這些腳本都具有相同的使用方法運行:服務腳本 {start|stop|restart|reload|status}。如果你需要手動啟動或停止某項服務,鍵入/etc/rc.d/init.d/服務腳本名 start|stop 即可,除此方法外也可以利用命令 service服務腳本名 start|stop,它們執(zhí)行作用相同?! ∠到y(tǒng)服務程序多數(shù)情況下隨系統(tǒng)啟動開始運行,系統(tǒng)關閉停止運行,這也正是你開機或關機時為什么能在屏幕上看到一系列的服務啟動[ok] 或服務停止[stop]的原因。那么系統(tǒng)如何啟動和關閉這些服務呢?  談到這里很有必要說一下linux系統(tǒng)運行級別這個問題。所謂運行級別更通俗的講就是系統(tǒng)的行為,每種運行級別都對應一組該級別應用程序。    我們可以使用命令init(后問會說明它) 級別來切換系統(tǒng)的運行級別。一般服務器系統(tǒng)使用級別3,如果需要圖形界面使用5,對于單用戶或嵌入系統(tǒng)使用運行級1即可?! ∑渲屑墑e0和6可以使用來安全停止系統(tǒng),它們會將除根目錄以外的文件系統(tǒng)卸載,并且以只讀方式重新安裝根文件系統(tǒng),這樣一來防止了破壞文件系統(tǒng)。  言歸正傳,回到系統(tǒng)服務程序。我們應該能猜到不同的運行級別也對應了不同的系統(tǒng)服務集合。比如運行級別5至少就需要比級別3多啟動x服務器和xfs(字體服務器)等。你可以利用命令chkconfig –list來觀察每個運行級別下的各種系統(tǒng)服務是否允許。顯然級別5開啟的服務zui多,下來是級別3 ??傊?,功能越強要求服務越多?! ?下面的啟動部分回告訴大家,系統(tǒng)根文件安裝后,首先尋找init程序并運行它,該程序的任務就是從配置文件確定系統(tǒng)的運行級,并且根據(jù)級別啟動相應的服務程序。具體的過程如下  init程序從inittab中獲得系統(tǒng)運行級別x ,后會依次運行/etc/rc.d/rcx.d/中以大寫s開頭的shell腳本來啟動對應的服務。                                                                          linux系統(tǒng)啟動的標準流程      對于系統(tǒng)裝載過程我們暫時不做介紹,我們假設內核已經(jīng)被載入內存并且已經(jīng)完成了異常表、中斷表、調度程序、時鐘、控制臺、內存等初始化,zui后進行進程管理器的初始化,從此內核可以開始使用真正的進程了。     初始化完成后,內核創(chuàng)建*個進程(初始進程),該進程作為系統(tǒng)的第0號進程,在進程描述符表中由task[0]或init_task表示。該進程進而再創(chuàng)建了一個進程去執(zhí)行init()函數(shù)進行第二階段的初始化操作,而初始進程(init_task)本身則去執(zhí)行idle循環(huán),可見初始進程在內核初始化后*的作用就是去使用空閑的cpu時間。     第二階段的初始化工作要比前一階段輕松一點,因為現(xiàn)在是由一個真正進程完成它們的,而前一階段都是由“硬件進程”手工去做的。該階段,這個由ini_task創(chuàng)建的新進程需要初始化總線、網(wǎng)絡并啟動系統(tǒng)中的各種系統(tǒng)內核后臺線程,然后再初始化外設、設置文件格式,在這之后,它要為進入系統(tǒng)做zui后的準備——初始化文件系統(tǒng),安裝根文件,打開/dev/console設備,重定向stdin、stdout和stderr到控制臺,然后搜索文件系統(tǒng)中的init程序,并使用 execve()系統(tǒng)調用加載執(zhí)行init程序。系統(tǒng)自此進入了用戶態(tài)。     init程序接著將依照initab配置文件中的選項依次執(zhí)行:     1 確定運行級別(1-6)     2 運行rc.sysinit腳本中的的系統(tǒng)服務,如激活交換分區(qū),檢查磁盤,加載硬件模塊等     3 運行規(guī)定級別下的服務:/etc/rc.d/rc*.d/下的s打頭的服務,如網(wǎng)絡服務s*network。     4 在串口上運行getty程序,getty打開終端線,并設置模式,然后運行l(wèi)ogin程序。如果用戶帳號和密碼正確(需要通過/etc/passwd驗證),則進入用戶的工作目錄,并按照其工作目錄中的設置執(zhí)行相應的shell。     到這里用戶才可以真正實用操作系統(tǒng)了。   idle進程是個奇怪的進程,它是在沒有別的任務使用cpu時是才使用cpu的,它的存在價值據(jù)說可以延長cpu壽命。     內核后臺線程是種執(zhí)行在內核態(tài)的進程,它們和用戶進程一樣受調度程序調度,系統(tǒng)利用它們周期性(不一定固定周期)地執(zhí)行一些自身管理方面的“家務事”。主要的幾種內核線程為:bdflush——清理被寫過的內存緩沖區(qū);kup-date——按時將內存緩沖區(qū)中的信息更新到磁盤中; kswapd——將內存頁交換到磁盤;keventd——關系系統(tǒng)事件;ksoftirq——執(zhí)行軟件中斷。                                                                                    搭建實驗系統(tǒng)  很抱歉搭建一個linux操作系統(tǒng)到目前為止還沒有一個很標準的流程或規(guī)范,不過大體流程都大通小異,無非是首先編譯內核——將內核源代碼編譯成一個可執(zhí)行的鏡像文件,當然編譯內核時可能會帶有一些模塊也需要同期進行編譯和安裝(是否有模塊取決于你的具體選擇)?! ∮辛司幾g后的內核,接著就需要創(chuàng)建一個根文件系統(tǒng),在其中又需要創(chuàng)建必要的目錄。至于其中使用的軟件和庫函數(shù)你可以選擇下載源代碼包,然后交叉編譯,再進行安裝。或者我們偷個懶,從一個發(fā)布的完整系統(tǒng)里直接拷貝需要的軟件和庫,同時將必要的設備文件、配置文件和服務腳本也拷貝過來,你這時所要做得僅僅是去修改一些相關的配置文件就可以擁有一個自己的文件系統(tǒng)了?! 群伺c文件系統(tǒng)都有了,就可以說一切具備只欠東風,你所需要做得只剩下將內核和文件系統(tǒng)綁定到一起,讓系統(tǒng)被引導載入內核,內核載入后可以找到根文件系統(tǒng),并執(zhí)行其中的初始化程序。你可別以為這個收尾動作能輕松搞定,往往初學者都在這里要栽跟頭?! ≡趺茨茉趜ui小的代價學習搭建系統(tǒng)呢?想想看可不是每個網(wǎng)友都能找個空硬盤或者磁盤(看看你的機器,也許連軟驅都沒)來做新系統(tǒng)的,為了保護原有系統(tǒng),即便開一個新分區(qū)都不能鼓勵。所以的方法就是用內存模擬一個磁盤,將創(chuàng)建的根文件系統(tǒng)放在其中,系統(tǒng)引導后,就登陸到內存模擬的磁盤上運行。這時你*跳出了你的物理硬盤。這種方法有時在嵌入系統(tǒng)中會被使用,或希望斷電后數(shù)據(jù)被抹掉的安全系統(tǒng)中使用?! ∠旅嫖覀兙鸵煌鰝€這樣的試驗系統(tǒng),你付出的*代價是消耗些時間和無數(shù)次擊健。編譯內核    *步要做的工作就是挑選一個合適版本的內核源代碼包,然后編譯它。不要以為編譯內核很神秘,其實它和編譯普通程序差不多,內核源代碼其實就是“一大堆”程序,編譯它就等于分別編譯個個程序然后在將它們鏈接成一個單一的可執(zhí)行鏡像文件。這個鏡像就是你在/boot目錄下看到的vmlinuz-*(如果你細心的話,一定能發(fā)現(xiàn)在該目錄下還有一個叫vmlinux的文件。其實這兩個文件是一回事,但前面那個是經(jīng)過壓縮的)   正如*部分所說,linux內核具有很強的伸縮性,在內核里面許多功能是可選擇的,如果需要就可以被編譯到內核,不過內核會因此變的肥胖。一種可替代的方式是將某些功能編譯成模塊放在文件系統(tǒng)內,等你真正需要它時,再由被載入到內核,這樣就內核就可以輕裝上陣了,啟動起來也快許多?! ‰m然是個試驗系統(tǒng),但還是盡力讓它功能做強點吧。所以在編譯前,配置內核選項時,除了支持zui基本的ext2文件系統(tǒng),pci接口,自動裝在模塊等功能外,再將ext3,jfs,即插即用,網(wǎng)絡,scsi,usb等比較常用的功能加入。再一個就是為了能實現(xiàn)我們的虛擬內存中建立根文件系統(tǒng),內核還需要支持ramdisk 和initrd。內核網(wǎng)絡設備選項里包含大量網(wǎng)卡驅動程序,你必須知道自己網(wǎng)卡內型才能正確選擇,一般情況都將網(wǎng)卡驅動編譯未模塊,在系統(tǒng)啟動后載入。我們試驗系統(tǒng)運行在vmware下,而vmware虛擬網(wǎng)卡驅動為pcnet32,因此這個模塊被包含進來了。編譯步驟   先去下載一個內核源代買不用我在多說了吧。如果你實在是個衣來伸手的家伙,好吧告訴你,到上蕩一個想要版本的內核源代碼。如果是gz結尾的壓縮源文件,就使用tar xvzf linux-2.4.18.tar.gz解開,如果是gz2結尾的,就使用tar xvjf linux-2.4.18.tar.bz2解開?! 群税姹揪幪柨墒怯悬c講究的,簡單的說,偶數(shù)為穩(wěn)定版本,奇數(shù)為開發(fā)版本,所以我們用2.4.18版,一是因為它屬于穩(wěn)定版,再一個就使我機器里以前下載過它,不想再換了:)?! ∪缓筮M入存放解開后的內核原代碼的目錄(標準系統(tǒng)默認情況下在目錄/usr/src/linux下存放該系統(tǒng)的內核源代碼),執(zhí)行命令make menuconfig進行內核功能配置,選擇需要的功能以模塊形式編譯或直接編譯到內核。配置信息默認情況下記錄在隱含文件.config中,你也可以選擇將其記錄到自定義文件中,比如可以把信息記錄在minisys.config中。在以后配置內核時可以方便地導入的配置文件。  make menucofig提供給你一個文本圖形界面的配置菜單,其中列出了內核所能提供的全部功能,如果你在選項前選則*號,那么該選項被編譯到內核中,如果選m則被編譯為模塊,對于你不清楚的選項可以使用?查看其解釋。除了用make meunconfig外你有復古情節(jié)的話,可以試試使用make config,它完成同樣的功能,不過你得有足夠得耐心去忍受刷平一樣得命令行選擇 。如果你在x環(huán)境下(桌面環(huán)境)不妨可以使用make xconfig配置,它相比前兩種方法得好處就試比較容易看清楚,對眼神不好得網(wǎng)友建議使用它。保存內核配置后,就執(zhí)行        make dep  /*確保所有的相依關系,例如 include files 都沒問題.除非你的電腦真的很慢,否則它不會花太久時間的*/       make clean ?/*清除核心編譯的所有目的檔以及其它東西.在重建一個核心之前不要忘記這個步驟*/make bzimage 或zimage/*編譯內核——bz和z格式內核之間zui大的差別是對于內核體積大小的限制。zimage內核需要放在實模式1mb的內存之內,其體積受到了限制。而bzimage的內核沒有1mb內存限制*/  記住內核編譯完了,還必須再編譯模塊, 即使您在配置內核時沒有使用任何模塊,也不要跳過此步驟,在編譯完 bzimage 后立刻編譯并安裝模塊是個好習慣。而且,如果您真的沒有模塊需要編譯,這個步驟也非??炀徒Y束了。        make modules; /*編譯內核模塊,凡是配置內核時標記為m功能都將被編譯未模塊*/make modules_install。/*這將導致模塊被編譯而且被安裝到 /usr/lib/<內核版本號> 目錄下。不過如果你想改變內核鏡像或模塊的所在目錄,都可以通過修改內核源碼中的makefile文件來達到,比如修改install_mod_path來改變模塊安裝目錄*/       等黃蜂一樣的字符風暴再屏幕上停止后,你現(xiàn)在擁有了新內核了。它藏在內核源碼目錄下arch/i386/boot下叫bzimage或zimage。新內核隨帶的模塊被安裝到了lib下的modules目錄中。組建文件系統(tǒng)  組建根文件系統(tǒng)說白了更簡單,一來格式化文件系統(tǒng)的宿主設備,二來就是拷貝需要的文件。簡單明了吧!我們先來一同拷貝文件吧,等考完了再談宿主設備的問題,別忘了我們可都是完空手套百狼呀?。ǔ丝截愇募?,更標準的方法是下栽各種工具包,在本地交叉編譯,在進行安裝,不過為了省事,我們采用拷貝標準系統(tǒng)文件的方法來構造文件系統(tǒng),不但方便而且異曲同工。但前提是新系統(tǒng)體系結構——處理器——和我們原料系統(tǒng)一致,如果你想在0x86系統(tǒng)上編譯運行在arm機上的文件系統(tǒng),那么是去下載源代碼包重新交叉編譯吧)                                                                                      文件系統(tǒng)基本要求        linux文件系統(tǒng)的結構上文已經(jīng)給出,我們這里著手搭建一個精簡的文件系統(tǒng),它包含zui基本的目錄以及文件,配置文件也盡量修改簡潔明了。下面列出文件系統(tǒng)必須包含的內容。       文件系統(tǒng)zui小需要包含/dev 、/proc、/bin 、/sbin 、etc 、/lib 、/usr 、/tmp 等目錄       需要一組基本命令       支持上述命令的運行庫函數(shù),其中也包括編譯內核產成的模塊       必須的設備文件       一些必要的配置文件我們要做地就是按部就班地生成和拷貝以上內容,*地要就就是你要夠心細。創(chuàng)建根文件系統(tǒng)內容   我們先來建立一個將包含根文件系統(tǒng)內容的新目錄“rootfs”(mkdir /rootfs),然后開始在其中生成(拷貝)根文件系統(tǒng)需要地所有目錄和文件。    *步當然是在rootfs目錄下建立根目錄下地必要地子目錄啦,用一行命令就可完成mkdir dev,proc,bin,etc,lib,usr,tmp,sbin ?! 〉诙娇截惸阈枰拿?。比如你需要 ls 命令,你先確定它在系統(tǒng)中的位置whereis ls (發(fā)現(xiàn)在/bin/ls目錄下),然后將該命令拷貝到你工作目錄下相同的目錄結構下 cp /bin/ls /workdir/bin/ls,但是僅僅拷貝命令文件還不夠,還必須考被該命令所用到的動態(tài)共享庫文件。如何發(fā)現(xiàn)命令用到了那些動態(tài)共享庫呢?很簡單,利用ldd /bin/ls 可以察看命令使用的共享庫,顯示在輸出右列的就是被用到的共享庫文件(名字中有so)?!”热缭谖业南到y(tǒng)上,該操作輸出為: libtermcap.so.2 => /lib/libtermcap.so.2 (0x4001f000) libacl.so.1 => /lib/libacl.so.1 (0x40023000) libc.so.6 => /lib/libc.so.6 (0x40029000) libattr.so.1 => /lib/libattr.so.1 (0x40149000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)  我們要做的是將命令要用到的庫文件按照它的目錄結構拷貝到我們工作目錄下的/lib或/lib/i386。(用戶所用到的命令多集中在/bin和/sbin下,另外一些腳本會用到一些出現(xiàn)在/usr/bin和/usr/sbin下的文件,如果你要使用這些腳本,不用說這些命令和它們要用的庫都不能少)。但是這些文件并非我們實際想要的,它門只是實際庫文件的一個符號鏈接,系統(tǒng)只所以要使用符號鏈接,是為了便于庫文件升級換代時不影響使用它的應用程序。因此我們單單拷貝符號鏈接是沒有意義,同時也必須將符號鏈接指向的實際庫文件一同拷貝到workdir/lib錄下面去。  /lib目錄下還有一個重要目錄就是modules目錄,它里面包含了內核編譯產生模塊,對于不同版本的模塊存放在以版本號命名的文件中。要們可別忘了拷貝這個目錄到我們的新系統(tǒng)中?! ≡谠紩r期/lib下的這些庫就足夠用了,但現(xiàn)在的linux系統(tǒng)對安全多了許多要求,尤其是系統(tǒng)從安全性考慮,增加了許多驗證手段,因此往往你還必須具有和安全驗證相關的庫。這些庫不會在命令中直接使用,但卻間接地要被系統(tǒng)的安全框架利用到,多數(shù)都是由配置文件中說明如何關聯(lián),安全框架通過查看配置文件,選擇調用具體地驗證庫(這些配置文件后問會提及)。安全框架方面話題,我們不多說,有興趣的可以查查 pam 和 nss等的用法。在這里我們不管它三七二十一將在/lib/security/下和pam相關地庫和/lib下nss相關地所有l(wèi)ibnss*庫都考到我們地/lib下的/security下和/lib下。雖然很笨,但確省事。     linux系統(tǒng)將那些會被多數(shù)應用程序頻繁使用的庫函數(shù),多數(shù)都不會以靜態(tài)的方式編譯連接到應用程序中,而是采取動態(tài)庫的方式,集中存儲管理。這樣如果多各程序都用到某個共享庫,那么該庫文件只被調入內存一次,駐留在內存一個拷貝,因此利用共享庫大大節(jié)約了空間,縮減了執(zhí)行文件提及。當然天下沒有免費的午餐,雖然共享庫相比靜態(tài)庫靈活,但卻學要而外的路徑搜索,而且調入時間也更耗時  鏈接文件是unix風格操作系統(tǒng)提供的一個特色之一,其中具體又可分為軟鏈接和硬鏈接。軟鏈接又稱為符號鏈接,其實就該文件*的內容就是包含實際額外文件系統(tǒng)的路徑。硬鏈接則是和被鏈接文件共享索引節(jié)點的(索引節(jié)點概念如果還不清楚,那么自己去找找吧)。因此符號鏈接怕得是實際文件被刪除和轉移,那么符號鏈接仍然存在但不再有效了;相反硬鏈接刪除源文件直會使索引節(jié)點記數(shù)減少,不會破壞硬鏈接文件的。       第三步建立設備文件,這點很重要但卻不費事。由于linux繼承了unix將設備抽象成特殊文件來使用和管理,所以要想使用系統(tǒng)的外設,比如軟硬盤,時鐘,系統(tǒng)終端,甚至內存也可以作以為其制作相應的文件來訪問。因此我們要建立系統(tǒng)可能用到的所有設備對應的設備文件。至于你具體需要哪些設備文件不能一概而論,你可以打開/dev/目錄看看保準里面文件多地讓你炫目。不過也別怕多數(shù)都是些廢物,就我們要建立的實驗系統(tǒng)來說用道的設備文件就:console 控制臺設備,tty* 是由控制臺管理的虛擬(我們用ctrl-[1-7]切換的就是這個設備),sda1 scsi接口設備 (因為我的linux是運行在vware虛擬機上,而vmware虛擬機使用的存儲設備是虛擬的scsi硬盤,所以需要這個文件。它的用法和使用標準ide硬盤沒什么兩樣),ram 內存虛擬盤設備(以后我們的系統(tǒng)就運行在內存虛擬盤中),null 空設備(是一個非常有用的字符設備文件,送入這個設備的所有東西都被忽略。如果將任何程序的輸出結果重定向到/dev/null,則看不到任何輸出信息),zero 零設備 (讀取這個設備,只會得到空的內容,所以有時為了獲得高壓縮率,需要對某空間用全零添充往往就會用到它)initrd 這是一個特殊的字符設備,它被用來從用戶空間向系統(tǒng)內核發(fā)送切換運行級別的信息,屬于一個虛擬字符設備(比如你向改變運行級別的init 1-6命令,都試通過該設備傳達到內核的),關于虛擬字符設備作為用戶向內核發(fā)命令的利器作用你可看看這個文章?! ∶鞔_了你需要那些設備文件,可以依次利用mknod命令建立需要的設備文件。建立過程中需要的參數(shù)。你可以通過ls – la /dev/設備名 命令來查看以下設備屬于塊設備還是子符號設備,察看主從設備號獲得。如果你覺得煩,就用拷貝命令直接從標準系統(tǒng)地/dev/目錄下拷貝這些文件吧,不過要配合參數(shù)-r否則,你靠過來的可使文件的整個內容而不僅僅是設備文件了。如果那樣可就如同把自己往自己衣服口袋里塞,你是永遠賽不進去的?! inux系統(tǒng)將設備分為塊設備和字符設備,塊設備可以隨機訪問(b),字符設備只能按順序訪問c。另外一個設備控制器可以控制多個設備,所以有主設備號和從設備號之分。主設備號對應驅動,從設備號用來區(qū)分具體設備。       第四步需要建立系統(tǒng)運行需要的配置文件或腳本了。我們還是從簡出發(fā),拷貝標準系統(tǒng)的有用文件,然后針對需要進行修修改改。我們試驗系統(tǒng)將以多任務多用戶環(huán)境使用,因此需要登陸密碼,也有分組能力,所以需要passwd和group文件,如果系統(tǒng)使用shadow功能隱藏密碼,那么還需要文件shadow。登陸首先執(zhí)行init文件,它可需要不少配置文件呀。*的便是inittab文件,該文件規(guī)定了許多系統(tǒng)運行的基本功能(具體內容參見)。下一步init先執(zhí)行rc.sysinit腳本來初始化系統(tǒng),其中會使用到fstab配置文件,它包含了系統(tǒng)啟動后掛載的文件系統(tǒng)和目錄,對于我們試驗系統(tǒng)來說只有兩項一個是將/dev/ram作為根文件系統(tǒng)安裝到/下,另一個是將proc文件系統(tǒng)安裝到/proc目錄下。init執(zhí)行完rc.sysinit后依照inittab中定義的運行級別進入對應的/etc/rc.d/執(zhí)行其中s開頭的服務運行腳本。不羅嗦了,細節(jié)內容別問我了,去看man init吧。你要做的就是把/etc/下initab,rc.sysinit和rc.d目錄的所有東西拷貝到你對應系統(tǒng)里。我們實驗系統(tǒng)運行級別為3,只啟動網(wǎng)絡服務服務,因此可以把除了s*network外的s腳本都刪除。(當然你也可以改變系統(tǒng)默認的啟動流程,讓它執(zhí)行你自己的初始化腳本,這點只需要載inittab中修改 “sysinit:xxx“中的腳本名稱)。執(zhí)行了上述初始化和服務后,系統(tǒng)zui后運行rc.local文件,這里你可以放一些你希望開機執(zhí)行的命令,我們這里放一句“ ok you are welcome !!!”為你進入系統(tǒng)前的問候。  另外要知道登陸是login往往要使用pam驗證模塊認證用戶,所以pam的配置文件也拷貝到新系統(tǒng)。很多系統(tǒng)還會用到nss(名稱服務開關,這個服務來幫助客戶機器或應用程序獲得網(wǎng)絡信息,可從本地或從網(wǎng)絡某處取得——從dns或nis等。諸如getxbyy()等函數(shù)都往往會用到這種服務,用戶登陸時login很可能就要使用,這取決于你libc的版本),所以/etc/nsswitch.conf需要拷貝,至于如何使用去看man nsswitch.conf吧。剩下你還要靠被terminfo/termcap文件,它們對設置term終端環(huán)境變量有用。拷貝modules.conf,它包含了有關模塊信息,我們實驗系統(tǒng)中的modules.conf中僅僅給pcnet32.o 起了個別名而已。說的我口渴,不說了有什么疑問自己去找資料吧。    差不多完了,對了別忘了吧/root/目錄下的那些.開頭的用于bash配置的隱藏文件也考到新系統(tǒng)的如root下,這些都是bash的環(huán)境參數(shù)等東西?! 〗Y束動作。ldconfig –r workdir/rootfs(試驗文件系統(tǒng)目錄) 建立庫文件路徑緩存 ,從此命令再使用動態(tài)連接庫時就不必目錄了,因為它們的路徑都被緩存了。(ldconfig 要用動態(tài)庫配置文件ld.so.conf,試驗系統(tǒng)中置空它好了)                                                    安裝根文件系統(tǒng)——內核和root文件系統(tǒng)綁定  別混淆,剛剛我們做的是文件系統(tǒng)應該包含的文件。具體文件系統(tǒng)現(xiàn)在才開始做。上面說了需要在系統(tǒng)未來的宿主盤上制作文件系統(tǒng)——進行格式化。如果你手頭沒有實際設備,linux提供給你另外兩種變通方法 : ramdisk和loop設備(回環(huán)設備) 。利用loop設備可以將文件虛擬成一個文件系統(tǒng)進行安裝,而ramdisk則是將內存模擬一個塊設備用來存放數(shù)據(jù)。       使用ramdisk或loop設備相比直接使用物理磁盤操作要快一些,也相對安全,不會損壞物理設備。因此在需要創(chuàng)建文件系統(tǒng)的情況下,很多時候都會使用上面兩種虛擬技術創(chuàng)建文件系統(tǒng),然后在將文件系統(tǒng)轉移到物理設備中。       我們采取ramdisk作為文件系統(tǒng)的宿主,在上面制作文件系統(tǒng),然后拷貝我們前面創(chuàng)建的文件系統(tǒng)內容到其上去。然后觀察ramdisk的大小后 (可不是其中文件內容的大小,因為其中還包含文件系統(tǒng)本身格式的一些信息),將整個文件系統(tǒng)統(tǒng)轉移到某個文件中去(利用dd命令,由于 dd 命令允許二進制方式讀寫,所以特別適合在原始物理設備上進行輸入/輸出,制作整個文件系統(tǒng)的鏡像),該文件被稱為文件系統(tǒng)鏡像。雖然linux對文件后綴沒有要求,但這里我們還是習慣以img命名它。    具體做法大該如此:         dd if=/dev/zero of=/dev/ram bs=1k count=20000          mke2fs –m0 /dev/ram 20000          mount /dev/ram /mnt/          cp –av /rootfs/*  /mnt/ram          運行df ,注意1k-blocks一欄中/dev/ram的數(shù)值,假定為ramsize          umount /dev/ram           dd if=/dev/ram of=ramlinux.img bs=1k count=ramsize           gzip –9v ramlinux.img     *步是給 /dev/ram設備清出20m的全零空間,然后格式化/dev/ram設備,頁就是將格式信心寫入/dev/ram中。       接下來,安裝/dev/ram設備到/mnt目錄下,再把你創(chuàng)建的文件系統(tǒng)內容全部考進來。完成了這步,你才可以說真正有了一個文件系統(tǒng)(文件系統(tǒng)格式信息+文件系統(tǒng)內容)        然后解載設備后,把設備內容(包含文件系統(tǒng)格式和內容)統(tǒng)統(tǒng)轉移到名為ramlinux.img的鏡像文件中,  zui后壓縮鏡像文件(壓縮后名字為ramlinux.img.gz),開始使用/dev/zero清零/ram設備地目的就是為了提高壓縮率,因為壓縮算法利用統(tǒng)計規(guī)律替換字符,所以統(tǒng)一為零會大大提高gzip的壓縮率的。  一般標準系統(tǒng)中ramdisk默認大小為4098字節(jié),你不能建立超過該大小的ram盤。但我們搭建的系統(tǒng)大小超過了4096字節(jié),所以必須擴大ramdisk的大小。zui簡單的方法是在lilo啟動時給ramdisk大小,實現(xiàn)系統(tǒng)中大概用到20m大空間,所以在lilo.conf中應該加入“append = “ramdisk_size=20000”這一行,系統(tǒng)啟動時就會自動更改ramdisk默認大小了。    系統(tǒng)引導引導過程簡述pc打開電源后,先執(zhí)行rom中bios中的代碼,該程序負責將啟動設備(軟盤、硬盤、光盤)的*個扇區(qū)(0扇區(qū))*個磁到道的數(shù)據(jù)載入內存。接著bios執(zhí)行該扇區(qū)中的代碼(將內核從啟動設備中逐步導入到內存)。所以扇區(qū)中要么直接存放操作系統(tǒng)內核,要么存放啟動裝載程序,比如lilo等,由啟動裝載程序負責找到內核,裝載內核到系統(tǒng),然后執(zhí)行內核。   內核被載入內存后的動作上面已經(jīng)初步介紹了,我們這里要強調的是內核初始化以后緊接著就需要安裝根文件系統(tǒng),那么根文件系統(tǒng)的位置如何確定?(ramdisk size?)  我們必須在創(chuàng)建過程中驅動設備,利用命令  rdev filename devicename 設置或在內核原代碼目錄下的 makefile中修改相關參數(shù),然后編譯,因為該信息是備記錄在內核中的?! 〕烁募O備外還需要指出根文件系統(tǒng)在宿主設備上的位置,這還需要利用rdev 來實現(xiàn)。該信息也被記錄在內核中。(rdev命令很豐富,回憶我們前面談到的改變ram盤大小的任務都可以通過rdev來修改)  可能很多朋友奇怪自己根本沒用過這個命令,這么多年還不照樣把系統(tǒng)生級了無數(shù)次。的確我們不大使用該命令,因為我們有更酷的工具lilo(當然grub好像現(xiàn)在更流行了),在lilo.conf中的配置如root=* 這些選項其實就是告訴lilo將上述信息寫道內核中。  確定了根文件系統(tǒng)位置,將其安裝到根目錄下,然后找到其中init程序,開始執(zhí)行系統(tǒng)初始化工作。安裝啟動鏡像  大家多數(shù)都應該對?lilo.conf下的intrd=initrd.img.*有印象吧。你知道initrd.img是干嘛用的嗎?   這個文件實際上就是個文件系統(tǒng)鏡像,有興趣的話你可以將它登陸到/mnt下,去看看,它毫無疑問是個微縮的文件系統(tǒng)(該文件使用gzip壓縮的,所以先要解壓才能安裝它。(mv initrd.img initrd.img.gz;gunzip initrd.img.gz;mount –o loop initrd.img /mnt)。這個文件里的各目錄和我們文件系統(tǒng)是*一樣的,但是由于initrd.img是在系統(tǒng)啟動后在ram盤里運行的所以它只包含系統(tǒng)啟動時需要的zui小命令和庫的集合。使用這個萎縮文件系統(tǒng)的目的通常是為了系統(tǒng)啟動是尚未安裝根文件系統(tǒng)前,用來運行系統(tǒng)以便利用insmod命令裝入安裝根文件系統(tǒng)需要的模塊——比如ext3.o,buslogic.o等(如果根設備是scsi或根文件系統(tǒng)是ext3等,而內核并為將這些功能編譯進去,只能以模塊方式載入),所以在initrd.img中的lib下會包含需要再入的模塊。系統(tǒng)啟動后運行intrd.img中的linuxrc腳本來執(zhí)行模塊載入后將根文件系統(tǒng)切換到實際文件系統(tǒng)中(使用pivot_root命令)?! τ谖覀儗嶒炏到y(tǒng)來說,因為已經(jīng)將scsi和ext3等模塊直接編譯進了內核,所以不必通過initrd.img的途徑來進行先期模塊載入。因此正常情況下initrd.img是不需要的。但是要知道我們制作的根文件系統(tǒng)鏡像是放在源標準系統(tǒng)根文件系統(tǒng)下的。所以要使得系統(tǒng)拍托實際物理設備,進入ram盤工作運行,就需要利用intrd.img鏡像文件系統(tǒng)在啟動期間將物理盤上根文件系統(tǒng)鏡像載入ram盤中,然后進入執(zhí)行。這個工作我們利用linuxrc腳本來實現(xiàn),具體地講就是mount源根文件系統(tǒng),將試驗文件系統(tǒng)鏡像解壓傳送到/dev/ram中,然后umount 源根文件系統(tǒng)。從此系統(tǒng)進入我們的實驗文件系統(tǒng)開始運行。  initrd.img也是屬于文件系統(tǒng)鏡像,它的制作方法和制作根文件系統(tǒng)大通小異。先拷貝需要文件,在編輯腳本(linuxrc),然后制作文件系統(tǒng)鏡像。詳細過程不再羅索了。  別著急,還有關鍵一步那就是修改lilo .conf 為實驗系統(tǒng)配置啟動選項?! oot =實驗系統(tǒng)內核  label = ramlinux  initrd = 剛做的initrd鏡像  root = /dev/ram  append = “ramdisk_size = 20000”  zui后,執(zhí)行l(wèi)ilo –r /rootfs ?! k !  有關內核引導請見附件。下載搭建腳本和實驗系統(tǒng)系統(tǒng)  雖然搭建系統(tǒng)技術簡單,但是過程很繁瑣,搞不好會丟三拉四,錯誤百出。為了節(jié)約大家的體力,我們編寫了幾個小腳本幫助搭建系統(tǒng)。利用這幾個腳本大家可以輕松地自動建立實驗系統(tǒng)?! ∥覀兊闹谱髂_本可分為下面幾個部分:  mkrootfs.sh——?收集制作root文件系統(tǒng)所需的所有材料到目錄?! kinitrdfs.sh——收集制作initrd鏡像所需的所有材料到目錄?! etup.sh——制作root文件系統(tǒng)鏡像和initrd鏡像,改寫lilo配置文件添加ramlinux啟動選項?! ∵B同腳本一同提供給你的還有myboot,myetc 和myroot目錄。boot里含有編譯好的內核(注意內核是與系統(tǒng)硬件相關的,我的機器是奔三處理器,如果你系統(tǒng)和我不同,那你還是自己在本機上編譯試驗系統(tǒng)內核吧!不過可以使用我們提供的內核配置文件minsys.config來選擇內核功能,編譯完成把內核考貝到myboot下就可以了——或修改mkimage.sh腳本,在zui后面的地方修改lilo.conf部分,將”boot=×××”中的xxx用你自己編譯的內核代替)、模塊和內核配置文件minisys.config。etc下包含了供試驗系統(tǒng)使用的、已經(jīng)修改好的配置文件和服務腳本。boot下是兩個bash的配置文件--全部腳本和必要配置文件打包為work.tar.gz。   此外,我們也將按上述方法裁減出來的root文件系統(tǒng)(rootfs.tar.gz)和root文件系統(tǒng)鏡像ramlinux.img.gz放在網(wǎng)上以供下載,同時也把initrd的內容(initrdfs.tar.gz)和鏡像(initrd.img.gz)放在網(wǎng)上?! ∪绻阋砑踊騽h除文件系統(tǒng)中的某些文件,應該展開roofs.tar.gz,然后在rootfs里面修改,不要把文件系統(tǒng)鏡像文件(img文件)以loop方式安裝后進行修改,因為我們曾經(jīng)用zero設備填充過文件系統(tǒng),所以如果新添加或刪除某些內容,可能會破壞里面的一些數(shù)據(jù)對齊,系統(tǒng)反映給你的就可能會有類似于“bus error”等一類莫名奇妙的錯誤?! ∪绻惆匆蠼忾_了rootfs.tar.gz和initrdfs.tar.gz,那么執(zhí)行setup.sh既可生成對應的鏡像文件ramlinux.img.gz和initrd.img.gz,并會在lilo中添加好對應于試驗系統(tǒng)的選項。step by step——享受你的操作系統(tǒng)吧  從啟動菜單中選擇ramlinux開始運行吧!等等,要輸入管理員密碼?是的,我們是從原有的系統(tǒng)中裁減的,所以密碼自然會繼承下來。(如果你用的是我做好的系統(tǒng),那么用戶名自然是root,密碼 threeyear)      看見了嗎,親手打造的操作系統(tǒng)已經(jīng)快步向你走來,有成就感嗎?享受你的杰作吧!

                                                   附件——linux系統(tǒng)啟動的標準流程   系統(tǒng)的啟動是指從計算機加電到顯示用戶登陸提示的整個過程。我們將在這里對整個流程以及關系到的一 些內容做討論。過程主要可以分為兩個階段:載入內核和準備運行環(huán)境,我們分別進行討論。本部分的 討論只基于i386硬 件架構,但大部分內容是有共通性的。 

                                                   圖一 啟動過程 綜述         載入內核(將內核載入內存,并將控制權傳遞給它)         計算機加電到boot loader開始工作,硬件含量 遠大于軟件含量,所以這里暫不提及,如果實在有關心的朋友,請先別著急,我們將在下期里討論它。  這一階段是 boot loader 的主戰(zhàn)場。它必須將可執(zhí)行的內核映像和內核啟動所需的額外數(shù)據(jù)信息從存儲介質上載入內存,這并不是 件簡單的工作,因為除了從硬盤載入,可能還會需要從網(wǎng)絡引導服務器這樣的外部介質上載入。各種紛繁蕪雜的文件系統(tǒng)類型也給載入帶來了巨大的挑戰(zhàn)?! oot loader 可能還需要改變cpu的運行特權級別,然后就可以讓內核投 入運行了?! 〕酥?,boot loader 還要完成一些其它功能,比如從bios中獲取系統(tǒng)信息,或者從啟動時的命令行參數(shù)中提取信息等。有的 boot loader 還要扮演引導選擇工具的角色,方便用戶選擇不同的操作系 統(tǒng)。       boot loader的職責:       判斷到底要載入什么,這可以要求用戶進行選擇      載入內核和它可能需要用到的相關數(shù)據(jù),比如initrd或者其它參數(shù)      為內核準備好運行環(huán)境,比如,讓cpu進入特權模式      讓內核投入運行                                                                       boot loader的 歷史變遷:  早期的linux只支持軟盤引導扇區(qū)和 shoelace 兩種 boot loader。 shoelace 是從minix繼承下來的、對文件系統(tǒng)相關的 boot loader。它只支持 minix 文件系統(tǒng)。當時linux只使用 minix 一種文件 系統(tǒng),所以這樣做并沒什么問題??墒牵?minix 文件系統(tǒng)存在不能保存創(chuàng)建、修改和訪問時間信息;文件名長度限制在14個字節(jié)等問題。隨著linux的發(fā)展,這些與傳統(tǒng)unix文件系統(tǒng)大相徑庭的缺陷越來越讓人 難以忍受,它已經(jīng)不適合作為linux的主要文件系統(tǒng)了。  為了支持其它文件系統(tǒng)的實現(xiàn),linux引入了vfs(虛擬文件系統(tǒng))。這個舉措很快就引起了熱烈的反響,一大批新的文件系統(tǒng)實現(xiàn)出現(xiàn)了。其中一個 minix 文件系統(tǒng)的變體,擴展文件系統(tǒng) xiafs (根據(jù)它的作者命名)突破了 minix 文件系統(tǒng)的文件名長度限制,將此長度一舉提高到全部30個字符。當時文件系統(tǒng)之間的競爭著實激 烈,很難看出誰會勝出,甚至搞不清楚會不會有一個zui終的“贏家”。       盡管不確定性很大,但是有一點卻是清楚的:不管zui后哪種文 件系統(tǒng)會受到青睞,但是除了 minix 作為根文件系統(tǒng),誰也不能從硬盤上啟動,因為 shoelace 只支持minix文件系統(tǒng)。lilo應運而生了。由于支持多種文件系統(tǒng)(當時內核支持的主流文件系統(tǒng)已經(jīng)有 minix ,擴展文件系統(tǒng) ext , xiafs 。還有人在移植 bsd 的 ffs ,根本看不出來什么時候是個盡頭)在實現(xiàn)和維護上難度太大,而 boot loader 也不 應該成為人們試驗新的文件系統(tǒng)的絆腳石,所以lilo采取了和文件系統(tǒng)無關的設計。  這種設計經(jīng)受住了時間的考驗,被證明是非常成功的。即使在今天,lilo仍舊可以從內核支持的絕大部分文件 系統(tǒng)的硬盤上啟動。但是,由于ext2歷經(jīng)這么長的時間一直沒有大的演變,成為了事實上的標準,所以跟文件系統(tǒng)相關的boot loader又漸漸流行了起來。盡管ext2已經(jīng)能滿足大部分人的日常需要,但 是文件系統(tǒng)的設計者們還是在研制以日志機制為特征的新的文件系統(tǒng),并且已經(jīng)取得了相當大的進展??紤]到當前又有可能出現(xiàn)多種文件系統(tǒng)的實現(xiàn)同時并存的情 況,因此對與文件系統(tǒng)無關的boot loader的需求可能會再次變得強勁。初始化基本的操作環(huán)境  一旦內核開始運行,它會初始化內部的數(shù)據(jù)結構,檢測硬件,并且激活相應的驅動程序,為應用軟件的準 備運行環(huán)境。其間包含一個重要操作——應用軟件的運行環(huán)境必須要有一個文件系統(tǒng),所以內核必須首先裝載root文件系統(tǒng)。由于我們的目的是介紹基 本流程,所以相關的硬件初始化細節(jié)就不再討論,相關內容在下一期雜志中會有詳細介紹。         硬件初始化完成后,內核著手創(chuàng)建*個進程——初始進程。說是創(chuàng)建, 其實也不盡然,該進程其實是整個硬件上電初始化過程的延續(xù),只不過執(zhí)行到這里,進程的邏輯已經(jīng)完備,所以我們就按照進程的創(chuàng)建方式給它進行了“規(guī)格化” ——我們把這個初始進程也叫做“硬件進程”,它會占據(jù)進程描述符表的*個位置,所以可以用task[0]?或init_task表示。該進程進而會再創(chuàng)建一 個新進程去執(zhí)行init()函數(shù),其實,這個新進程才是系統(tǒng)*個實際有用的進程,它會負責接著執(zhí)行下一個階段的初始化操作; 而初始進程(init_task)自己則會開始執(zhí)行idle循環(huán),也就是說,內核初始化完成之后,初始進程*的任務就是在沒有任何其它進程需要執(zhí)行的時候, 消耗空閑的cpu時 間(因此初始進程也被稱為idle進程)。  下一階段的初始化工作要比前一階段輕松一點,因為現(xiàn)在是由一個真正進程接手負責完成它們了,而前一 階段都是由“硬件進程”手工去做的。在此階段,這個由init_task創(chuàng)建的新進程需要初始化總線、網(wǎng)絡并啟動系統(tǒng)中的各種系統(tǒng)內核后臺線程,然后再初始化外設、設置文 件格式,在這之后,它要為進入系統(tǒng)做zui后的準備——初始化文件系統(tǒng),安裝root文件系統(tǒng),打開/dev/console設備,重定向stdin、stdout和stderr到控制臺,然后 搜索文件系統(tǒng)中的init程序,并使用 execve()系統(tǒng)調 用加載執(zhí)行init程 序。系統(tǒng)自此進入了用戶態(tài)。裝載root文件系統(tǒng)  為了裝載文件系統(tǒng),內核需要:1知道root文件系統(tǒng)位于那個存儲介質上;2有訪問該種介質的驅動程序。zui常見的情況是root是ext2文件系統(tǒng),位于ide硬盤上。這種情況下需要的操作很簡單:將設備號作為參數(shù)給內核就可以了,ide的設備驅動程序通常都會編譯進內核 的?! ∪绻麅群藳]有相關介質的驅動程序,問題就會變得更為復雜。而這種情況并不罕見,比如linux的安裝盤使用的“通用”內核一般都會碰到。如果內核把所有支持的硬件的設備驅動程序都包含進來,就會變成一個龐然 大物;而且一些驅動程序在檢測硬件的時候會影響其它設備?! ∵@個問題可以通過initrd機制解決,它允 許在裝載實際的root文件系統(tǒng)之前先使用ram文件系統(tǒng)。除了上述兩個原因,引入initrd還可以解決內核 的動態(tài)合成問題。(詳見參考資料一。)  不過我們應該注意到,init在整個啟動過程中并不是從來就有的,它可以說是一個插件,為了解決以上問題,而被加入啟動過程,象圖一所示,linux系統(tǒng)在啟動時也可以不選擇它。為什么要引入initrd?  linux啟動過程中肯定要載入內核鏡像,在此過程中有些要素必須考慮:  首先,內核鏡像不能太大。由于受到各種硬件和兼容性的限制,linux的內核鏡像不能太大,但是這并不 容易做到。linux內核的核心部分本身就不小了;而且還必須加入會使用到的驅動程序。  其次,要支持盡可能多的硬件設備。我們在啟動過程中有一件重要工作:掛載root文件系統(tǒng),因為進一步的數(shù)據(jù)和應用 軟件都在其上,所以我們的內核必須能夠訪問root文件系統(tǒng)。對于一般用戶,如果他們使用ide硬盤上的ext2文件分區(qū)作為root文件系統(tǒng),不會有什么問題。因為不管是ide硬盤還是ext2文件系統(tǒng),它們的驅動肯定會包含在內核鏡像自身里面。但是,確實存在一些特殊情況:比如說我們希望 發(fā)行l(wèi)inux系 統(tǒng)的安裝光盤,那么對光盤的驅動,就不一定包含在內核里面了。(有人可能要奇怪了,咦,光盤中的內核鏡像不都已經(jīng)讀進來了嗎,怎么內核還訪問不了光盤呢? 注意,讀入內核鏡像的是 boot loader ,內核并不具備 boot loader 的功能。)如果沒有光盤的驅動,我們又怎么把光盤里的軟件包安裝到用戶的 計算機里呢?把驅動程序預先編譯到內核里?聽起來還不錯,可是如果我們除了光盤還有一些其它的安裝介質,那么所有這些驅動就會讓內核鏡像龐大不堪?! 《?,還有更嚴重的問題,各種不同的驅動程序很有可能會發(fā)生沖突,特別是以前isa設備占市場主導地位的時候,這種沖突 簡直難以避免?! ∧菚r的解決辦法是發(fā)行商提供預先編譯好的支持各種設備的不同內核,把每個內核放進一張軟盤,隨發(fā)行 包一起交給用戶,用戶自己選擇裝有合適內核的軟盤進行引導。或者給用戶提供制作引導盤的工具,讓用戶在安裝前制作自己的啟動盤。當然,哪一種辦法都不能讓 人滿意?! ?的希望在于使用模塊化機制。在內核啟動的時候調用相應的模塊加載驅動程序,然后訪問root文件系統(tǒng)。無論是通過內核對設備做 進一步的分析還是直接從用戶那里得到配置信息,先配置再加載模塊的辦法,都能有效地避免沖突的發(fā)生。  除了在安裝的時候需要在掛載root文件系統(tǒng)之前調用相應的模塊之外,在完成安裝的系統(tǒng)上,我們可能仍然需要在掛載root文件系統(tǒng)之前調用一些模塊。這主要 是為給計算機進行配置——一般都要針對不同的計算機進行內核配置?! ±硐肭闆r下,用戶按照自己的實際情況配置編譯文件,重新編譯內核,一步步完成這種工作。但是沒有幾個用戶喜歡這種冗長并且極易出現(xiàn)錯誤的工作。而且編譯和生成內核需要相應的 工具,可是大部分用戶不需要這些工具?! ≡诎惭b的過程中可以直接編譯一個整體式的內核,但這并不能很好的解決問題:首先,所有的編譯工具還 需要,其次,編譯過程中出現(xiàn)差錯導致無法完成任務的概率太大了。所以,我們仍然要使用模塊機制:模塊機制很可靠,出了錯誤也只不過不加載對應的模塊而已,不會使整個任務失敗。而載入模塊,象前 面說的,也是在掛載root文件系統(tǒng)之前就要得到模塊的。  基于以上理由,linux引入了initrd機制。initrd做什么  initrd允許系統(tǒng)在啟動 的時候載入一個ram盤,這個ram盤可以被當作一個root文件系統(tǒng),程序可以在其上運行。(有兩重含義,*,程序在上面;第二,程序的文件系統(tǒng)環(huán)境也在上 面。)在此之后,可以從別的設備上掛載一個新的root文件系統(tǒng),先前的root文件系統(tǒng)(initrd)就會被移動到 一個目錄上去,zui終被卸載掉。  為什么要使用ram盤呢?首先,使用ram盤能方便的支持以后可能發(fā)生的變化;另外,也是為了保持 boot loader 工作盡可能的簡 單。在系統(tǒng)引導時,除了內核鏡像之外,boot loader把所有相關的信息作為一個文件讀入內存,內核在啟動中將該文件作為一段連續(xù)的內存塊看待。也就是把 它當作ram盤來 使用了。正因為如此,這種機制被稱作“初始 ram 盤 (initial ram disk)”,縮 寫成 initrd?! nitrd主要用來把系統(tǒng) 的啟動劃分為兩個階段:初始啟動的內核只需保留zui精簡的驅動程序zui小集,此后,在啟動必須加載附加的模塊時,從initrd中加載。        initrd進行的操作  使用initrd的時候,典型的 系統(tǒng)啟動的流程變?yōu)椋篵oot loader讀入內核鏡像以及initrd文件內核將initrd文件轉成“普通”的ram盤,并且釋放掉initrd文件占用的內 存。initrd被當作root文件系統(tǒng),以可讀可寫(read-write)方式安裝。/linuxrc被執(zhí)行 (它可以是任何可執(zhí)行文件,包括腳本在內;它以uid0身份執(zhí)行,基本上能完成所有init程序可以做的工作)linuxrc安裝“實際” 的root文件系 統(tǒng)linuxrc通過pivot_root系統(tǒng)調用將root文件系統(tǒng)放置在root目錄下。常用的啟動流 程(比如調用/sbin/init)開始執(zhí)行。卸載initrd文件系統(tǒng)?! ∽⒁猓@是一個典型流程。其實initrd機制可以通過兩 種方式使用:要么就是作為一個普通的root文件系統(tǒng)使用,這樣的話第5、第6兩個步驟可以被略過,直接執(zhí)行/sbin/init(我 們的試驗系統(tǒng)就是利用這種方法);要么作為一個過渡環(huán)境使用,通過它內核可以繼續(xù)裝載“實際”的root文件系統(tǒng)。

      全年征稿/資訊合作 聯(lián)系郵箱:1271141964@qq.com

      免責聲明

      • 凡本網(wǎng)注明"來源:智能制造網(wǎng)"的所有作品,版權均屬于智能制造網(wǎng),轉載請必須注明智能制造網(wǎng),http://towegas.com。違反者本網(wǎng)將追究相關法律責任。
      • 企業(yè)發(fā)布的公司新聞、技術文章、資料下載等內容,如涉及侵權、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔責任,本網(wǎng)有權刪除內容并追溯責任。
      • 本網(wǎng)轉載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品來源,并自負版權等法律責任。
      • 如涉及作品內容、版權等問題,請在作品發(fā)表之日起一周內與本網(wǎng)聯(lián)系,否則視為放棄相關權利。

      <
      更多 >

      工控網(wǎng)機器人儀器儀表物聯(lián)網(wǎng)3D打印工業(yè)軟件金屬加工機械包裝機械印刷機械農業(yè)機械食品加工設備制藥設備倉儲物流環(huán)保設備造紙機械工程機械紡織機械化工設備電子加工設備水泥設備海洋水利裝備礦冶設備新能源設備服裝機械印染機械制鞋機械玻璃機械陶瓷設備橡塑設備船舶設備電子元器件電氣設備


      我要投稿
      • 投稿請發(fā)送郵件至:(郵件標題請備注“投稿”)1271141964.qq.com
      • 聯(lián)系電話0571-89719789
      工業(yè)4.0時代智能制造領域“互聯(lián)網(wǎng)+”服務平臺
      智能制造網(wǎng)APP

      功能豐富 實時交流

      智能制造網(wǎng)小程序

      訂閱獲取更多服務

      微信公眾號

      關注我們

      抖音

      智能制造網(wǎng)

      抖音號:gkzhan

      打開抖音 搜索頁掃一掃

      視頻號

      智能制造網(wǎng)

      公眾號:智能制造網(wǎng)

      打開微信掃碼關注視頻號

      快手

      智能制造網(wǎng)

      快手ID:gkzhan2006

      打開快手 掃一掃關注
      意見反饋
      關閉
      企業(yè)未開通此功能
      詳詢客服 : 0571-87858618