Linux驅(qū)動(dòng)開(kāi)發(fā)入門與實(shí)戰(zhàn)(第2版):第5章 構(gòu)建第一個(gè)驅(qū)動(dòng)程序_第1頁(yè)
Linux驅(qū)動(dòng)開(kāi)發(fā)入門與實(shí)戰(zhàn)(第2版):第5章 構(gòu)建第一個(gè)驅(qū)動(dòng)程序_第2頁(yè)
Linux驅(qū)動(dòng)開(kāi)發(fā)入門與實(shí)戰(zhàn)(第2版):第5章 構(gòu)建第一個(gè)驅(qū)動(dòng)程序_第3頁(yè)
Linux驅(qū)動(dòng)開(kāi)發(fā)入門與實(shí)戰(zhàn)(第2版):第5章 構(gòu)建第一個(gè)驅(qū)動(dòng)程序_第4頁(yè)
Linux驅(qū)動(dòng)開(kāi)發(fā)入門與實(shí)戰(zhàn)(第2版):第5章 構(gòu)建第一個(gè)驅(qū)動(dòng)程序_第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)介

第5章構(gòu)建第一個(gè)驅(qū)動(dòng)程序萬(wàn)事開(kāi)頭難,寫(xiě)驅(qū)動(dòng)程序也一樣,本章將構(gòu)建第一個(gè)驅(qū)動(dòng)程序。驅(qū)動(dòng)程序和模塊的關(guān)系非常密切,所以這里將詳細(xì)講解模塊的相關(guān)知識(shí)。而模塊編程成敗與否的先決條件是要有統(tǒng)一的內(nèi)核版本,所以這里將講解怎樣升級(jí)內(nèi)核版本。最后為了提高程序員的編程效率,這里將介紹兩種集成開(kāi)發(fā)環(huán)境。5.1開(kāi)發(fā)環(huán)境配置之內(nèi)核升級(jí)構(gòu)建正確的開(kāi)發(fā)環(huán)境,對(duì)寫(xiě)驅(qū)動(dòng)程序非常重要。錯(cuò)誤的開(kāi)發(fā)環(huán)境,編寫(xiě)出的驅(qū)動(dòng)程序不能正確運(yùn)行。特別是關(guān)于內(nèi)核版本的問(wèn)題,內(nèi)核版本不匹配,會(huì)使驅(qū)動(dòng)程序根本不能在系統(tǒng)中運(yùn)行,所以需要對(duì)內(nèi)核進(jìn)行升級(jí)。本節(jié)我們將對(duì)FedoraCore9進(jìn)行內(nèi)核升級(jí),首先將說(shuō)明為什么要升級(jí)內(nèi)核。5.1.1為什么升級(jí)內(nèi)核內(nèi)核是一個(gè)提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能的系統(tǒng)軟件。根據(jù)內(nèi)核是否被修改過(guò),可以將內(nèi)核分為標(biāo)準(zhǔn)內(nèi)核和廠商內(nèi)核兩類。5.1.2內(nèi)核升級(jí)盡管在FedoraCore9中可以使用“軟件包管理器工具”對(duì)內(nèi)核進(jìn)行升級(jí),但是畢竟是開(kāi)發(fā)廠商編譯的內(nèi)核有其局限性。里面添加了很多驅(qū)動(dòng)開(kāi)發(fā)系統(tǒng)不需要的模塊,而驅(qū)動(dòng)開(kāi)發(fā)需要的模塊卻沒(méi)有開(kāi)啟。因此,學(xué)會(huì)自己手動(dòng)編譯升級(jí)內(nèi)核也是很必要的。這里,我們將內(nèi)核升級(jí)為linux2.6.29.4。5.1.3makemenconfig的注意事項(xiàng)在升級(jí)內(nèi)核的過(guò)程中,第6步需要非常的注意。第6步是對(duì)內(nèi)核進(jìn)行配置,特別是對(duì)CPU進(jìn)行配置。標(biāo)準(zhǔn)內(nèi)核源碼對(duì)CPU的默認(rèn)配置是:Pentium-Pro,其是高性能奔騰處理器。在很多情況下,如果使用這個(gè)CPU配置編譯內(nèi)核,那么很可能會(huì)出現(xiàn)系統(tǒng)引導(dǎo)時(shí)無(wú)法識(shí)別CPU的錯(cuò)誤。所以建議將CPU類型改為目前通用的X586類型。5.2HelloWorld驅(qū)動(dòng)程序本節(jié)將帶領(lǐng)讀者編寫(xiě)第一個(gè)驅(qū)動(dòng)模塊,該驅(qū)動(dòng)模塊的功能是在加載時(shí),輸出“Hello,World”;在卸載時(shí),輸出“Goodbye,World”。這個(gè)驅(qū)動(dòng)模塊雖然非常簡(jiǎn)單,但是也包含了驅(qū)動(dòng)模塊的重要組成部分。在本節(jié)的開(kāi)始,將先對(duì)模塊的重要組成部分進(jìn)行介紹。5.2.1驅(qū)動(dòng)模塊的組成一個(gè)驅(qū)動(dòng)模塊主要有如下部分組成,如圖5.2所示。圖5.2表示的是一個(gè)規(guī)范的驅(qū)動(dòng)模塊應(yīng)該包含的結(jié)構(gòu)。這些結(jié)構(gòu)在圖中的順序也是在源文件中的順序。不按照這樣的順序來(lái)編寫(xiě)驅(qū)動(dòng)模塊也不會(huì)出錯(cuò),只是大多數(shù)開(kāi)發(fā)人員都喜歡這樣的順序規(guī)范。下面對(duì)主要的結(jié)構(gòu)部分進(jìn)行說(shuō)明。5.2.2HelloWorld模塊任何一本關(guān)于編程的書(shū),幾乎都以“HelloWorld”開(kāi)始?,F(xiàn)在,來(lái)看一下最簡(jiǎn)單的一個(gè)驅(qū)動(dòng)模塊。5.2.3編譯HelloWorld模塊在對(duì)HelloWorld模塊進(jìn)行編譯時(shí),需要滿足一定的條件:1.編譯內(nèi)核模塊的條件2.Makefile文件3.Makefile文件的執(zhí)行過(guò)程4.編譯模塊5.2.4模塊的操作Linux為用戶提供了modutils工具,用來(lái)操作模塊。這個(gè)工具集主要包括:insmod命令加載模塊。rmmod命令卸載模塊。modprobe命令是比較高級(jí)的加載和刪除模塊命令,其可以解決模塊之間的依賴性問(wèn)題。lsmod命令列出已經(jīng)加載的模塊和其信息。modinfo命令用于查詢模塊的相關(guān)信息,比如作者,版權(quán)等。5.2.5HelloWorld模塊加載后文件系統(tǒng)的變化當(dāng)使用insmod

hello.ko加載模塊后文件系統(tǒng)會(huì)發(fā)生什么樣的變化呢?文件系統(tǒng)存儲(chǔ)著有關(guān)模塊的屬性信息。程序員可以從這些屬性信息中了解目前模塊在系統(tǒng)中的狀態(tài),這些狀態(tài)對(duì)開(kāi)發(fā)調(diào)試非常重要。5.3模塊參數(shù)和模塊之間通訊為了增加模塊的靈活性,可以給模塊添加參數(shù)。模塊參數(shù)可以控制模塊的內(nèi)部邏輯,從而使模塊可以在不同的情況下,完成不同的功能,下面首先對(duì)模塊參數(shù)進(jìn)行介紹。5.3.1模塊參數(shù)用戶空間的應(yīng)用程序可以接受用戶的參數(shù),設(shè)備驅(qū)動(dòng)程序有時(shí)候也需要接受參數(shù)。例如一個(gè)模塊可以實(shí)現(xiàn)兩種相似的功能,這時(shí)可以傳遞一個(gè)參數(shù)到驅(qū)動(dòng)模塊,以決定其使用哪一種功能。參數(shù)需要在加載模塊時(shí)指定,例如inmod

xxx.ko

param=1。5.3.2模塊的文件格式ELF了解模塊以何種格式存儲(chǔ)在硬盤中,對(duì)于理解模塊間怎樣通訊時(shí)非常有必要的。5.3.3模塊之間的通訊模塊是為了完成某種特定任務(wù)而設(shè)計(jì)的。其功能比較的單一,為了豐富系統(tǒng)的功能,所以模塊之間常常進(jìn)行通信。其之間可以共享變量,數(shù)據(jù)結(jié)構(gòu),也可以調(diào)用對(duì)方提供的功能函數(shù)。5.3.4模塊之間的通訊實(shí)例本實(shí)例通過(guò)兩個(gè)模塊來(lái)介紹模塊之間的通信。模塊add_sub提供了兩個(gè)導(dǎo)出函數(shù)add_integer()和sub_integer(),分別完成兩個(gè)數(shù)字的加法和減法。模塊test用來(lái)調(diào)用模塊add_sub提供的兩個(gè)方法,完成加法或者減法操作。1.a(chǎn)dd_sub模塊2.test模塊3.編譯模塊4.測(cè)試模塊5.4將模塊加入內(nèi)核當(dāng)編譯了模塊,如果希望模塊隨系統(tǒng)一起啟動(dòng),那么需要將模塊靜態(tài)編譯進(jìn)內(nèi)核。將模塊靜態(tài)編譯入內(nèi)核,需要完成一些必要的步驟。5.4.1向內(nèi)核添加模塊向Linux內(nèi)核中添加驅(qū)動(dòng)模塊,需要完成4個(gè)工作:(1)編寫(xiě)驅(qū)動(dòng)程序文件。(2)將驅(qū)動(dòng)程序文件放到Linux內(nèi)核源碼的相應(yīng)目錄中,如果沒(méi)有合適的目錄,可以自己建立一個(gè)目錄來(lái)存放驅(qū)動(dòng)程序文件。(3)在目錄的Kconfig文件中添加新驅(qū)動(dòng)程序?qū)?yīng)的項(xiàng)目編譯選擇。(4)在目錄的Makefile文件中添加新驅(qū)動(dòng)程序的編譯語(yǔ)句。5.4.2Kconfig內(nèi)核源碼樹(shù)的目錄下都有兩個(gè)文件Kconfig和Makefile。分布到各目錄的Kconfig文件構(gòu)成了一個(gè)分布式的內(nèi)核配置數(shù)據(jù)庫(kù),每個(gè)Kconfig文件分別描述了所屬目錄源文檔相關(guān)的內(nèi)核配置菜單。在內(nèi)核配置makemenuconfig(或xconfig等)時(shí),從Kconfig中讀出菜單,用戶選擇后保存到.config這個(gè)內(nèi)核配置文檔中。在內(nèi)核編譯時(shí),主目錄中的Makefile調(diào)用這個(gè).config文件,就知道了用戶的選擇。5.4.3Kconfig的語(yǔ)法Kconfig語(yǔ)法較為簡(jiǎn)單,其語(yǔ)法在Documentation/kbuild/kconfig-language.txt文件中做了介紹。歸納起來(lái)Kconfig的語(yǔ)法主要包括以下幾個(gè)方面:1.主要語(yǔ)法總覽2.菜單入口(config)3.菜單結(jié)構(gòu)(menu)4.選擇菜單(choice)5.注釋菜單(comment)5.4.4應(yīng)用實(shí)例:在內(nèi)核中新增加add_sub模塊下面講解一個(gè)綜合實(shí)例,假設(shè)我們將要在內(nèi)核中添加一個(gè)add_sub模塊??紤]add_sub模塊的功能,決定將該模塊加到內(nèi)核源碼的drivers目錄中。在drivers目錄中增加一個(gè)add_sub_Kconfig子目錄。5.4.5對(duì)add_sub模塊進(jìn)行配置當(dāng)將add_sub模塊的源文件加入到內(nèi)核源代碼中后,需要

溫馨提示

  • 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)論