資源描述:
《第1章Linux內(nèi)核簡介.doc》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在學術(shù)論文-天天文庫。
1、第1章Linux內(nèi)核簡介世界各地都有人在鉆研Linux內(nèi)核,大多是在寫設備驅(qū)動程序。盡管每個驅(qū)動程序都不一樣,而且你還要知道自己設備的特殊性,但是這些設備驅(qū)動程序的許多原則和基本技術(shù)技巧都是一樣的。通過本書,可以學會寫自己的設備驅(qū)動程序,并且可以鉆研內(nèi)核的相關部分。本書涉及到的是設備無關編程技巧,不會將例子跟特殊設備綁定在一起。本章沒有實際編寫代碼。但我要介紹一些關于Linux內(nèi)核的背景概念,這樣到我們稍后開始介紹實際編程時,就很順利了。當你學習編寫驅(qū)動程序的時候,你也會發(fā)現(xiàn)很多關于Linux內(nèi)核的知識,這對理解你機器怎么工作很有幫助,并且還可以知道為什么你的機器沒有希望的那么快,或
2、者為什么不按照你象要它做的那樣做。我們會逐漸介紹一些新概念,先從簡單的驅(qū)動程序開始,每介紹一些新概念都會看到相關例子代碼,這些代碼都不需要特殊硬件。驅(qū)動程序作者的作用作為一個程序員,你可以選擇自己的驅(qū)動程序,在編程所需時間和結(jié)果的靈活性之間做個可以接受的權(quán)衡。盡管說驅(qū)動程序的靈活性看起來有那么點怪,我喜歡這個詞是因為它強調(diào)了設備驅(qū)動程序提供的是機制,而不是策略。機制和策略之間的差別是Unix設計背后最好的點子之一。實際編程中遇到的大多數(shù)問題都可以被劃分成兩個部分:“需要作什么”(機制)和“這個程序怎么用”(策略)。如果這兩個主題是由程序不同部分來承擔的,或者是由不同的程序組合一起承擔
3、的,那么這個軟件包就很容易開發(fā),也很適合特殊需求。舉個例子,Unix的圖形顯示管理在X服務器和窗口管理器之間劃了一道線,X服務器了解硬件并給用戶程序提供唯一的接口,而窗口管理器實現(xiàn)特殊的策略并不需要知道硬件的任何信息。人們可以在不同硬件上使用同樣的窗口管理器,并且不同用戶在同一臺工作站上可以使用不同的設置。另一個例子是TCP/IP的網(wǎng)絡分層結(jié)構(gòu):操作系統(tǒng)提供抽象的套接字操作,是設備無關的,不同服務器主管這個服務。另外,ftpd服務器提供文件傳輸機制,而用戶可以使用任何客戶端程序;命令行的客戶端和圖形化界面的客戶端都存在,并且誰都可以為傳輸文件寫一個新的用戶界面。只要涉及到驅(qū)動程序,就
4、會運用這樣的功能劃分。軟盤驅(qū)動程序是設備無關的——這不僅表現(xiàn)在磁盤是一個連續(xù)讀寫的字節(jié)數(shù)組上。如何使用設備是應用程序要做的事:tar要連續(xù)地寫數(shù)據(jù),而mkfs則為要安裝的設備做準備工作,mcopy依賴于設備上存在的特殊數(shù)據(jù)結(jié)構(gòu)。在寫驅(qū)動程序時,程序員應該特別留心這樣的基本問題:我們要寫內(nèi)核代碼訪問硬件,但由于不同用戶有不同需要,我們不能強迫用戶采用什么樣的特定策略。設備驅(qū)動程序應該僅僅處理硬件,將如何使用硬件的問題留給應用程序。如果在提供獲得硬件能力的同時沒有增加限制,我們就說驅(qū)動程序是靈活的。不過,有時必須要作一些策略決策。可以從不同側(cè)面來看你的驅(qū)動程序:它是位于應用層和實際設備之
5、間的軟件。驅(qū)動程序的程序員可以選擇這個設備應該怎樣實現(xiàn):不同的驅(qū)動程序可以提供不同的能力,甚至相同的設備也可以提供不同能力。實際驅(qū)動程序設計應該是在眾多需求之間的一個平衡。例如,不同程序可以同時使用同一個設備,而驅(qū)動程序的開發(fā)者可以完全自由地決定如何處理同步機制。你可以實現(xiàn)到設備上的內(nèi)存映射,而完成獨立于硬件的具體能力,或者你可以提供給用戶函數(shù)庫,幫助應用程序的程序員在可用原語的基礎上實現(xiàn)新策略,或者諸如此類的方法。一個很重要需要考慮的問題就是,如何在提供給用戶盡可能多的選項,平衡你需要編寫所花費的時間,以及為使錯誤盡可能少而保持代碼簡單之間的平衡。如果即為同步又為異步操作設計驅(qū)動程
6、序,如果允許同時打開多次,并且如果能夠發(fā)掘所有硬件功能,而不用增加軟件層“去簡化事情”——例如將二進制數(shù)據(jù)轉(zhuǎn)換成文本或者策略相關的操作——那就很容易編寫而且很好維護了。達成“策略無關”實際上是軟件設計的共同目標。實際上,大多數(shù)設備驅(qū)動程序是和用戶程序一起發(fā)布的,這些程序可以幫助完成對目標設備的配置和訪問。這些程序可以是從簡單的配置程序到完整的圖形應用。通常還要提供一個客戶端庫文件。本書討論范圍是內(nèi)核,所以我們不考慮策略問題,也不考慮應用程序或支持庫。有時,我們會討論不同策略,以及如何支持這些策略,但我們不會深入到使用一定策略或設備編程需要的細節(jié)問題。不過你應該可以理解,用戶程序是一個
7、軟件包的內(nèi)核,就算策略無關的軟件包也會和配置文件一起發(fā)布,這些文件提供了基本機制上的缺省行為。劃分內(nèi)核在Unix系統(tǒng)中,若干并發(fā)進程會參加不同的任務。每個進程都要求獲得系統(tǒng)資源,可以是計算、內(nèi)存、網(wǎng)絡連接或別的資源。內(nèi)核是一整塊可執(zhí)行代碼,用它來負責處理所有這樣的請求。盡管在不同的內(nèi)核任務之間的區(qū)別不是總能清楚地標識出來,內(nèi)核的作用還是可以被劃分的。如圖1-1所示,劃分為如下這些部分:進程管理內(nèi)核負責創(chuàng)建和終止進程,并且處理它們和外部世界的聯(lián)系(輸入和輸出