第1章Linux驅(qū)動(dòng)開(kāi)發(fā)概述_第1頁(yè)
第1章Linux驅(qū)動(dòng)開(kāi)發(fā)概述_第2頁(yè)
第1章Linux驅(qū)動(dòng)開(kāi)發(fā)概述_第3頁(yè)
第1章Linux驅(qū)動(dòng)開(kāi)發(fā)概述_第4頁(yè)
第1章Linux驅(qū)動(dòng)開(kāi)發(fā)概述_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1章Linux驅(qū)動(dòng)開(kāi)發(fā)概述第一頁(yè),共23頁(yè)。1.1Linux設(shè)備驅(qū)動(dòng)的基本概念本節(jié)對(duì)中斷相關(guān)概念進(jìn)行了簡(jiǎn)要的分析,并對(duì)中斷進(jìn)行了分類。根據(jù)不同的中斷類型,寫中斷驅(qū)動(dòng)程序的方法也不一樣。下面將主要介紹中斷的基本概念和常見(jiàn)分類。第二頁(yè),共23頁(yè)。1.1.1設(shè)備驅(qū)動(dòng)程序概述設(shè)備驅(qū)動(dòng)程序(DeviceDriver),簡(jiǎn)稱驅(qū)動(dòng)程序(Driver)。它是一個(gè)允許計(jì)算機(jī)軟件(ComputerSoftware)與硬件(Hardware)交互的程序。這種程序建立了一個(gè)硬件與硬件,或硬件與軟件溝通的界面。CPU經(jīng)由主板上的總線(Bus)或其它溝通子系統(tǒng)(Subsystem)與硬件形成連接,這樣的連接使得硬件設(shè)備(Device)之間的數(shù)據(jù)交換成為可能。第三頁(yè),共23頁(yè)。1.1.2設(shè)備驅(qū)動(dòng)程序的作用設(shè)備驅(qū)動(dòng)程序是一種可以使計(jì)算機(jī)和設(shè)備通信的特殊程序,可以說(shuō)相當(dāng)于硬件的接口。操作系統(tǒng)只有通過(guò)這個(gè)接口,才能控制硬件設(shè)備的工作。假如某設(shè)備的驅(qū)動(dòng)程序未能正確安裝,便不能正常工作。正因?yàn)檫@個(gè)原因,驅(qū)動(dòng)程序在系統(tǒng)中的所占的地位十分重要。一般當(dāng)操作系統(tǒng)安裝完畢后,首要的便是安裝硬件設(shè)備的驅(qū)動(dòng)程序。第四頁(yè),共23頁(yè)。1.1.3設(shè)備驅(qū)動(dòng)的分類計(jì)算機(jī)系統(tǒng)的主要硬件由CPU、存儲(chǔ)器和外部設(shè)備組成。驅(qū)動(dòng)程序的對(duì)象一般是存儲(chǔ)器和外部設(shè)備。隨著芯片制造工藝的提高,為了節(jié)約成本,通常將很多原屬于外部設(shè)備的控制器嵌入到CPU內(nèi)部。所以現(xiàn)在驅(qū)動(dòng)程序應(yīng)該支持CPU中的嵌入控制器。Linux將這些設(shè)備分為3大類:字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備。第五頁(yè),共23頁(yè)。1.2Linux操作系統(tǒng)與驅(qū)動(dòng)的關(guān)系Linux操作系統(tǒng)與設(shè)備驅(qū)動(dòng)之間的關(guān)系如圖所示。用戶空間包括應(yīng)用程序和系統(tǒng)調(diào)用兩層。應(yīng)用程序一般依賴于函數(shù)庫(kù),而函數(shù)庫(kù)是由系統(tǒng)調(diào)用來(lái)編寫的,所以應(yīng)用程序間接地依賴于系統(tǒng)調(diào)用。第六頁(yè),共23頁(yè)。1.3Linux驅(qū)動(dòng)程序開(kāi)發(fā)Linux驅(qū)動(dòng)程序的開(kāi)發(fā)與應(yīng)用程序的開(kāi)發(fā)有很大的差別。這些差別導(dǎo)致了編寫Linux設(shè)備驅(qū)動(dòng)程序與編寫應(yīng)用程序有本質(zhì)的區(qū)別,所以對(duì)于應(yīng)用程序的設(shè)計(jì)技巧很難直接應(yīng)用在驅(qū)動(dòng)程序的開(kāi)發(fā)上。本節(jié)將對(duì)Linux驅(qū)動(dòng)程序的開(kāi)發(fā)進(jìn)行簡(jiǎn)要的講解。第七頁(yè),共23頁(yè)。1.3.1用戶態(tài)和內(nèi)核態(tài)Linux操作系統(tǒng)分為用戶態(tài)和內(nèi)核態(tài)。用戶態(tài)處理上層的軟件工作。內(nèi)核態(tài)用來(lái)管理用戶態(tài)的程序,完成用戶態(tài)請(qǐng)求的工作。驅(qū)動(dòng)程序與底層的硬件交互,所以工作在內(nèi)核態(tài)。第八頁(yè),共23頁(yè)。1.3.2模塊機(jī)制模塊是可以在運(yùn)行時(shí)加入內(nèi)核的代碼,這是Linux的一個(gè)很好的特性。這個(gè)特性使內(nèi)核可以很容易的擴(kuò)大或者縮小,一方面擴(kuò)大內(nèi)核可以增加內(nèi)核的功能,另一方面縮小內(nèi)核可以減小內(nèi)核的大小。第九頁(yè),共23頁(yè)。1.3.3編寫設(shè)備驅(qū)動(dòng)程序需要了解的知識(shí)Linux操作系統(tǒng)有三四百萬(wàn)行代碼,其中驅(qū)動(dòng)程序代碼就有四分之三左右。所以對(duì)于驅(qū)動(dòng)開(kāi)發(fā)者來(lái)說(shuō),學(xué)習(xí)和編寫設(shè)備驅(qū)動(dòng)程序都是一個(gè)漫長(zhǎng)的過(guò)程。在這個(gè)過(guò)程中,讀者應(yīng)該掌握如下的一些知識(shí):(1)驅(qū)動(dòng)開(kāi)發(fā)人員應(yīng)該有良好的C語(yǔ)言基礎(chǔ)。(2)驅(qū)動(dòng)開(kāi)發(fā)人員應(yīng)該有良好的硬件基礎(chǔ)。(3)驅(qū)動(dòng)開(kāi)發(fā)人員應(yīng)該對(duì)Linux內(nèi)核源代碼有初步的了解。(4)驅(qū)動(dòng)開(kāi)發(fā)人員應(yīng)該有多任務(wù)程序設(shè)計(jì)的能力。第十頁(yè),共23頁(yè)。1.4編寫設(shè)備驅(qū)動(dòng)程序的注意事項(xiàng)大部分程序員都比較熟悉應(yīng)用程序的編寫,但是對(duì)于驅(qū)動(dòng)程序的編寫可能不是很熟悉。關(guān)于應(yīng)用程序的很多編程經(jīng)驗(yàn)不能直接的應(yīng)用于驅(qū)動(dòng)程序的編寫中來(lái)。下面給出編寫驅(qū)動(dòng)程序的一些注意事項(xiàng),希望引起讀者注意。第十一頁(yè),共23頁(yè)。1.4.1應(yīng)用程序開(kāi)發(fā)與驅(qū)動(dòng)程序開(kāi)發(fā)的差異在Linux上的程序開(kāi)發(fā)一般分為兩種,一種是內(nèi)核及驅(qū)動(dòng)程序開(kāi)發(fā),另一種是應(yīng)用程序開(kāi)發(fā)。這兩種開(kāi)發(fā)種類對(duì)應(yīng)Linux的兩種狀態(tài),分別是內(nèi)核態(tài)和用戶態(tài)。內(nèi)核態(tài)用來(lái)管理用戶態(tài)的程序,完成用戶態(tài)請(qǐng)求的工作;用戶態(tài)處理上層的軟件工作。驅(qū)動(dòng)程序與底層的硬件交互,所以工作在內(nèi)核態(tài)。第十二頁(yè),共23頁(yè)。1.4.2GUNC開(kāi)發(fā)驅(qū)動(dòng)程序GUNC語(yǔ)言最開(kāi)始起源于一個(gè)GUN計(jì)劃,GUN的意思是“GUNisnotUNIX”。GUN計(jì)劃開(kāi)始于1984年,這個(gè)計(jì)劃的目的是開(kāi)發(fā)一個(gè)類似UNIX并且軟件自由的完整操作系統(tǒng)。這個(gè)計(jì)劃一直進(jìn)行,直到Linus開(kāi)發(fā)Linux操作系統(tǒng)時(shí),GNU計(jì)劃已經(jīng)開(kāi)發(fā)出來(lái)了很多高質(zhì)量的自由軟件。其中就包括著名的GCC編譯器,GCC編譯器能夠編譯GUNC語(yǔ)言。Linus考慮到GUN計(jì)劃的自由和免費(fèi),所以選擇了GCC編譯器來(lái)編寫內(nèi)核代碼,之后的很多開(kāi)發(fā)者也使用這個(gè)編譯器,所以直到現(xiàn)在,驅(qū)動(dòng)開(kāi)發(fā)人員也使用GUNC語(yǔ)言來(lái)開(kāi)放驅(qū)動(dòng)程序。第十三頁(yè),共23頁(yè)。1.4.3不能使用C庫(kù)來(lái)開(kāi)發(fā)驅(qū)動(dòng)程序與用戶空間的應(yīng)用程序不同,內(nèi)核不能調(diào)用標(biāo)準(zhǔn)的C函數(shù)庫(kù),主要的原因在于對(duì)于內(nèi)核來(lái)說(shuō)完整的C庫(kù)太大了。一個(gè)編譯的內(nèi)核大小可以是1M左右的字節(jié),而一個(gè)標(biāo)準(zhǔn)的C語(yǔ)言庫(kù)大小可能操作5M字節(jié)。這對(duì)于存儲(chǔ)容量較小的嵌入式設(shè)備來(lái)說(shuō),是不實(shí)用的。缺少標(biāo)志C語(yǔ)言庫(kù),并不是說(shuō)驅(qū)動(dòng)程序就只能做很好的事情了。第十四頁(yè),共23頁(yè)。1.4.4沒(méi)有內(nèi)存保護(hù)機(jī)制當(dāng)一個(gè)用戶應(yīng)用程序由于編程錯(cuò)誤,試圖訪問(wèn)一個(gè)非法的內(nèi)存空間,那么操作系統(tǒng)內(nèi)核會(huì)結(jié)束這個(gè)進(jìn)程,并返回錯(cuò)誤碼。應(yīng)用程序可以在操作系統(tǒng)內(nèi)核的幫助下,恢復(fù)過(guò)來(lái),而且應(yīng)用程序并不會(huì)對(duì)操作系統(tǒng)內(nèi)核有太大的影響。但是如果當(dāng)操作系統(tǒng)內(nèi)核訪問(wèn)了一個(gè)非法的內(nèi)存,那么就有可能蘋的諍說(shuō)拇或者數(shù)據(jù)。這將導(dǎo)致內(nèi)核處于未知的狀態(tài),內(nèi)核會(huì)通過(guò)oops錯(cuò)誤給用戶一些提示,但是這些提示都是不支持,難以分析的。第十五頁(yè),共23頁(yè)。1.4.5小內(nèi)核棧用戶空間的程序可以從棧上分配大量的空間來(lái)存放變量,甚至用棧存放巨大的數(shù)據(jù)結(jié)構(gòu)或者數(shù)組都沒(méi)問(wèn)題。之所以能這樣做是因?yàn)閼?yīng)用程序是非常駐內(nèi)存的,它們可以動(dòng)態(tài)的申請(qǐng)和釋放所有可用的內(nèi)存空間。內(nèi)核要求使用固定常駐的內(nèi)存空間,因此要求盡量少的占用常駐內(nèi)存,而盡量多的留出內(nèi)存提供給用戶程序使用。因此內(nèi)核棧的長(zhǎng)度是固定大小的,不可動(dòng)態(tài)增長(zhǎng)的32位機(jī)的內(nèi)核棧是8KB;64位機(jī)的內(nèi)核棧是16KB。第十六頁(yè),共23頁(yè)。1.4.6重視可移植性對(duì)于用戶空間的應(yīng)用程序來(lái)說(shuō),可移植性一直是一個(gè)重要的問(wèn)題。一般可移植性通過(guò)兩種方式來(lái)實(shí)現(xiàn)。一種方式是定義一套可移植的API,然后對(duì)這套API在個(gè)這兩個(gè)需要移植的平臺(tái)上分別實(shí)現(xiàn)。應(yīng)用程序開(kāi)發(fā)人員,只要使用這套可移植的API,就可以寫出可移植的程序。在嵌入式領(lǐng)域,比較常見(jiàn)的API套件是QT。另一種方式是使用類似JAVA、actionscript等可移植到很多操作系統(tǒng)上的語(yǔ)言。這些語(yǔ)言一般通過(guò)虛擬機(jī)來(lái)執(zhí)行,所以可以移植到很多平臺(tái)上。第十七頁(yè),共23頁(yè)。1.5Linux驅(qū)動(dòng)的發(fā)展趨勢(shì)隨著嵌入式技術(shù)的發(fā)展,使用Linux的嵌入式設(shè)備也越來(lái)越多。同樣地,工業(yè)上對(duì)Linux驅(qū)動(dòng)的開(kāi)發(fā)也越來(lái)越重視。本節(jié)對(duì)Linux驅(qū)動(dòng)的發(fā)展做簡(jiǎn)要的介紹。第十八頁(yè),共23頁(yè)。1.5.1Linux驅(qū)動(dòng)的發(fā)展Linux和嵌入式Linux軟件在過(guò)去幾年里已經(jīng)越來(lái)越普遍的為IT業(yè)、半導(dǎo)體公司、嵌入式系統(tǒng)所認(rèn)可和接受,它已經(jīng)成為一個(gè)可以替代微軟的Windows和眾多傳統(tǒng)的RTOS的重要的操作系統(tǒng)。Linux內(nèi)核和基本組件和工具已經(jīng)是成熟的軟件,面向行業(yè),應(yīng)用和設(shè)備的嵌入式Linux工具軟件和嵌入式Linux操作系統(tǒng)平臺(tái)是未來(lái)發(fā)展的必然趨勢(shì)。符合標(biāo)準(zhǔn),遵循開(kāi)放是大勢(shì)所趨,人心所向,嵌入式Linux也不例外。第十九頁(yè),共23頁(yè)。1.5.2驅(qū)動(dòng)的應(yīng)用計(jì)算機(jī)系統(tǒng)已經(jīng)融入到了各行各業(yè)、各個(gè)領(lǐng)域;計(jì)算機(jī)系統(tǒng)在電子產(chǎn)品中無(wú)處不在,從手機(jī)、游戲機(jī)、冰箱、電視、洗衣機(jī)等小型設(shè)備,到汽車、輪船、火車、飛機(jī)等大型設(shè)備都有它的身影。這些設(shè)備都需要驅(qū)動(dòng)程序來(lái)使之運(yùn)行,可以說(shuō)驅(qū)動(dòng)程序的運(yùn)用前景是非常廣泛的。每一天都有很多驅(qū)動(dòng)程序需要去編寫,所以驅(qū)動(dòng)程序開(kāi)發(fā)人員的前途是無(wú)比光明的。第二十頁(yè),共23頁(yè)。1.5.3相關(guān)學(xué)習(xí)資源學(xué)習(xí)Linux設(shè)備驅(qū)動(dòng)程序,單單只是學(xué)習(xí)理論是不夠的,還需要自動(dòng)動(dòng)手來(lái)寫各種設(shè)備的驅(qū)動(dòng)程序。寫驅(qū)動(dòng)程序不僅需要讀者的軟件知識(shí),還需要讀者的硬件知識(shí)。在這里,推薦一些國(guó)內(nèi)外優(yōu)秀的驅(qū)動(dòng)開(kāi)發(fā)網(wǎng)站,希望讀者的學(xué)習(xí)有所幫助。(1)Linux內(nèi)核之旅網(wǎng)站:(2)知名博客:(3)Linux中國(guó):(4)一個(gè)不錯(cuò)的Linux中文社區(qū):(5)csdn內(nèi)核驅(qū)動(dòng)研究社區(qū):(6)Linux伊甸園:第二十一頁(yè),共23頁(yè)。1.6小結(jié)本章首先對(duì)Linux設(shè)備驅(qū)動(dòng)程序的基本概念進(jìn)行了詳細(xì)的講述;并且講述了設(shè)備驅(qū)動(dòng)程序的作用;接著講述了設(shè)備驅(qū)動(dòng)程序的分類、特點(diǎn)、與操作系統(tǒng)之間的關(guān)系等;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論