




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第5 5章章 構(gòu)建第一個驅(qū)動程序構(gòu)建第一個驅(qū)動程序萬事開頭難,寫驅(qū)動程序也一樣,本章將構(gòu)建第一個萬事開頭難,寫驅(qū)動程序也一樣,本章將構(gòu)建第一個驅(qū)動程序。驅(qū)動程序和模塊的關(guān)系非常密切,所以這里將詳驅(qū)動程序。驅(qū)動程序和模塊的關(guān)系非常密切,所以這里將詳細講解模塊的相關(guān)知識。而模塊編程成敗與否的先決條件是細講解模塊的相關(guān)知識。而模塊編程成敗與否的先決條件是要有統(tǒng)一的內(nèi)核版本,所以這里將講解怎樣升級內(nèi)核版本。要有統(tǒng)一的內(nèi)核版本,所以這里將講解怎樣升級內(nèi)核版本。最后為了提高程序員的編程效率,這里將介紹兩種集成開發(fā)最后為了提高程序員的編程效率,這里將介紹兩種集成開發(fā)環(huán)境。環(huán)境。5.1 5.1 開發(fā)環(huán)境配置
2、之內(nèi)核升級開發(fā)環(huán)境配置之內(nèi)核升級構(gòu)建正確的開發(fā)環(huán)境,對寫驅(qū)動程序非常重要。錯誤構(gòu)建正確的開發(fā)環(huán)境,對寫驅(qū)動程序非常重要。錯誤的開發(fā)環(huán)境,編寫出的驅(qū)動程序不能正確運行。特別是關(guān)于的開發(fā)環(huán)境,編寫出的驅(qū)動程序不能正確運行。特別是關(guān)于內(nèi)核版本的問題,內(nèi)核版本不匹配,會使驅(qū)動程序根本不能內(nèi)核版本的問題,內(nèi)核版本不匹配,會使驅(qū)動程序根本不能在系統(tǒng)中運行,所以需要對內(nèi)核進行升級。本節(jié)我們將對在系統(tǒng)中運行,所以需要對內(nèi)核進行升級。本節(jié)我們將對Fedora Core 9進行內(nèi)核升級,首先將說明為什么要升級內(nèi)核進行內(nèi)核升級,首先將說明為什么要升級內(nèi)核。5.1.1 5.1.1 為什么升級內(nèi)核為什么升級內(nèi)核 內(nèi)核是
3、一個提供硬件抽象層、磁盤及文件系統(tǒng)控制、內(nèi)核是一個提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能的系統(tǒng)軟件。根據(jù)內(nèi)核是否被修改過,可以將多任務(wù)等功能的系統(tǒng)軟件。根據(jù)內(nèi)核是否被修改過,可以將內(nèi)核分為標(biāo)準(zhǔn)內(nèi)核和廠商內(nèi)核兩類。內(nèi)核分為標(biāo)準(zhǔn)內(nèi)核和廠商內(nèi)核兩類。5.1.2 5.1.2 內(nèi)核升級內(nèi)核升級盡管在盡管在Fedora Core 9中可以使用中可以使用“軟件包管理器工具軟件包管理器工具”對內(nèi)核進行升級,但是畢竟是開發(fā)廠商編譯的內(nèi)核有其局對內(nèi)核進行升級,但是畢竟是開發(fā)廠商編譯的內(nèi)核有其局限性。里面添加了很多驅(qū)動開發(fā)系統(tǒng)不需要的模塊,而驅(qū)動限性。里面添加了很多驅(qū)動開發(fā)系統(tǒng)不需要的模塊,而驅(qū)動開發(fā)需要
4、的模塊卻沒有開啟。因此,學(xué)會自己手動編譯升級開發(fā)需要的模塊卻沒有開啟。因此,學(xué)會自己手動編譯升級內(nèi)核也是很必要的。這里,我們將內(nèi)核升級為內(nèi)核也是很必要的。這里,我們將內(nèi)核升級為linux 2.6.29.4。5.1.3 make menconfig5.1.3 make menconfig的注意事項的注意事項在升級內(nèi)核的過程中,第在升級內(nèi)核的過程中,第6步需要非常的注意。第步需要非常的注意。第6步步是對內(nèi)核進行配置,特別是對是對內(nèi)核進行配置,特別是對CPU進行配置。標(biāo)準(zhǔn)內(nèi)核源碼進行配置。標(biāo)準(zhǔn)內(nèi)核源碼對對CPU的默認(rèn)配置是:的默認(rèn)配置是:Pentium-Pro,其是高性能奔騰處理,其是高性能奔騰處理
5、器。在很多情況下,如果使用這個器。在很多情況下,如果使用這個CPU配置編譯內(nèi)核,那么配置編譯內(nèi)核,那么很可能會出現(xiàn)系統(tǒng)引導(dǎo)時無法識別很可能會出現(xiàn)系統(tǒng)引導(dǎo)時無法識別CPU的錯誤。所以建議將的錯誤。所以建議將CPU類型改為目前通用的類型改為目前通用的X586類型。類型。5.2 Hello World5.2 Hello World驅(qū)動程序驅(qū)動程序本節(jié)將帶領(lǐng)讀者編寫第一個驅(qū)動模塊,該驅(qū)動模塊的功能本節(jié)將帶領(lǐng)讀者編寫第一個驅(qū)動模塊,該驅(qū)動模塊的功能是在加載時,輸出是在加載時,輸出“Hello, World”;在卸載時,輸出;在卸載時,輸出“Goodbye, World”。這個驅(qū)動模塊雖然非常簡單,但是也
6、包含。這個驅(qū)動模塊雖然非常簡單,但是也包含了驅(qū)動模塊的重要組成部分。在本節(jié)的開始,將先對模塊的重了驅(qū)動模塊的重要組成部分。在本節(jié)的開始,將先對模塊的重要組成部分進行介紹。要組成部分進行介紹。5.2.1 5.2.1 驅(qū)動模塊的組成驅(qū)動模塊的組成一個驅(qū)動模塊主要有如下部分組成,如圖一個驅(qū)動模塊主要有如下部分組成,如圖5.2所示。圖所示。圖5.2表示的是一個規(guī)范的驅(qū)動模塊應(yīng)該包含的結(jié)構(gòu)。這些結(jié)表示的是一個規(guī)范的驅(qū)動模塊應(yīng)該包含的結(jié)構(gòu)。這些結(jié)構(gòu)在圖中的順序也是在源文件中的順序。不按照這樣的順序構(gòu)在圖中的順序也是在源文件中的順序。不按照這樣的順序來編寫驅(qū)動模塊也不會出錯,只是大多數(shù)開發(fā)人員都喜歡這來編寫
7、驅(qū)動模塊也不會出錯,只是大多數(shù)開發(fā)人員都喜歡這樣的順序規(guī)范。下面對主要的結(jié)構(gòu)部分進行說明。樣的順序規(guī)范。下面對主要的結(jié)構(gòu)部分進行說明。5.2.2 Hello World5.2.2 Hello World模塊模塊任何一本關(guān)于編程的書,幾乎都以任何一本關(guān)于編程的書,幾乎都以“Hello World”開始。開始。現(xiàn)在,來看一下最簡單的一個驅(qū)動模塊。現(xiàn)在,來看一下最簡單的一個驅(qū)動模塊。5.2.3 5.2.3 編譯編譯Hello WorldHello World模塊模塊在對在對Hello World模塊進行編譯時,需要滿足一定的條模塊進行編譯時,需要滿足一定的條件:件:1編譯內(nèi)核模塊的條件編譯內(nèi)核模塊的
8、條件2Makefile文件文件3Makefile文件的執(zhí)行過程文件的執(zhí)行過程4編譯模塊編譯模塊5.2.4 5.2.4 模塊的操作模塊的操作Linux為用戶提供了為用戶提供了modutils工具,用來操作模塊。這個工具,用來操作模塊。這個工具集主要包括工具集主要包括:insmod命令加載模塊。命令加載模塊。rmmod命令卸載模塊。命令卸載模塊。modprobe命令是比較高級的加載和刪除模塊命令,其可命令是比較高級的加載和刪除模塊命令,其可以解決模塊之間的依賴性問題。以解決模塊之間的依賴性問題。lsmod命令列出已經(jīng)加載的模塊和其信息。命令列出已經(jīng)加載的模塊和其信息。modinfo命令命令用于查詢
9、模塊的相關(guān)信息,比如作者,版權(quán)等。用于查詢模塊的相關(guān)信息,比如作者,版權(quán)等。5.2.5 Hello World5.2.5 Hello World模塊加載后文件系統(tǒng)的變化模塊加載后文件系統(tǒng)的變化當(dāng)使用當(dāng)使用insmod hello.ko加載模塊后文件系統(tǒng)會發(fā)生什么加載模塊后文件系統(tǒng)會發(fā)生什么樣的變化呢?文件系統(tǒng)存儲著有關(guān)模塊的屬性信息。程序員樣的變化呢?文件系統(tǒng)存儲著有關(guān)模塊的屬性信息。程序員可以從這些屬性信息中了解目前模塊在系統(tǒng)中的狀態(tài),這些可以從這些屬性信息中了解目前模塊在系統(tǒng)中的狀態(tài),這些狀態(tài)對開發(fā)調(diào)試非常重要。狀態(tài)對開發(fā)調(diào)試非常重要。5.3 5.3 模塊參數(shù)和模塊之間通訊模塊參數(shù)和模塊之
10、間通訊為了增加模塊的靈活性,可以給模塊添加參數(shù)。模塊為了增加模塊的靈活性,可以給模塊添加參數(shù)。模塊參數(shù)可以控制模塊的內(nèi)部邏輯,從而使模塊可以在不同的情參數(shù)可以控制模塊的內(nèi)部邏輯,從而使模塊可以在不同的情況下,完成不同的功能,下面首先對模塊參數(shù)進行介紹。況下,完成不同的功能,下面首先對模塊參數(shù)進行介紹。5.3.1 5.3.1 模塊參數(shù)模塊參數(shù)用戶空間的應(yīng)用程序可以接受用戶的參數(shù),設(shè)備驅(qū)動用戶空間的應(yīng)用程序可以接受用戶的參數(shù),設(shè)備驅(qū)動程序有時候也需要接受參數(shù)。例如一個模塊可以實現(xiàn)兩種相程序有時候也需要接受參數(shù)。例如一個模塊可以實現(xiàn)兩種相似的功能,這時可以傳遞一個參數(shù)到驅(qū)動模塊,以決定其使似的功能,
11、這時可以傳遞一個參數(shù)到驅(qū)動模塊,以決定其使用哪一種功能。參數(shù)需要在加載模塊時指定,例如用哪一種功能。參數(shù)需要在加載模塊時指定,例如inmod xxx.ko param=1。5.3.2 5.3.2 模塊的文件格式模塊的文件格式ELFELF了解模塊以何種格式存儲在硬盤中,對于理解模塊間了解模塊以何種格式存儲在硬盤中,對于理解模塊間怎樣通訊時非常有必要的。怎樣通訊時非常有必要的。5.3.3 5.3.3 模塊之間的通訊模塊之間的通訊模塊是為了完成某種特定任務(wù)而設(shè)計的。其功能比較的單模塊是為了完成某種特定任務(wù)而設(shè)計的。其功能比較的單一,為了豐富系統(tǒng)的功能,所以模塊之間常常進行通信。其之間一,為了豐富系統(tǒng)
12、的功能,所以模塊之間常常進行通信。其之間可以共享變量,數(shù)據(jù)結(jié)構(gòu),也可以調(diào)用對方提供的功能函數(shù)。可以共享變量,數(shù)據(jù)結(jié)構(gòu),也可以調(diào)用對方提供的功能函數(shù)。5.3.4 5.3.4 模塊之間的通訊實例模塊之間的通訊實例本實例通過兩個模塊來介紹模塊之間的通信。模塊本實例通過兩個模塊來介紹模塊之間的通信。模塊add_sub提供了兩個導(dǎo)出函數(shù)提供了兩個導(dǎo)出函數(shù)add_integer()和和sub_integer(),分別完成兩個數(shù)字的加法和減法。模塊分別完成兩個數(shù)字的加法和減法。模塊test用來調(diào)用模塊用來調(diào)用模塊add_sub提供的兩個方法,完成加法或者減法操作。提供的兩個方法,完成加法或者減法操作。1ad
13、d_sub模塊模塊2test模塊模塊3編譯模塊編譯模塊4測試模塊測試模塊5.4 5.4 將模塊加入內(nèi)核將模塊加入內(nèi)核當(dāng)編譯了模塊,如果希望模塊隨系統(tǒng)一起啟動,那么當(dāng)編譯了模塊,如果希望模塊隨系統(tǒng)一起啟動,那么需要將模塊靜態(tài)編譯進內(nèi)核。將模塊靜態(tài)編譯入內(nèi)核,需要需要將模塊靜態(tài)編譯進內(nèi)核。將模塊靜態(tài)編譯入內(nèi)核,需要完成一些必要的步驟。完成一些必要的步驟。5.4.1 5.4.1 向內(nèi)核添加模塊向內(nèi)核添加模塊向向Linux內(nèi)核中添加驅(qū)動模塊,需要完成內(nèi)核中添加驅(qū)動模塊,需要完成4個工作:個工作:(1)編寫驅(qū)動程序文件。)編寫驅(qū)動程序文件。(2)將驅(qū)動程序文件放到)將驅(qū)動程序文件放到Linux內(nèi)核源碼的
14、相應(yīng)目錄中,如果內(nèi)核源碼的相應(yīng)目錄中,如果沒有合適的目錄,可以自己建立一個目錄來存放驅(qū)動程序文件。沒有合適的目錄,可以自己建立一個目錄來存放驅(qū)動程序文件。(3)在目錄的)在目錄的Kconfig文件中添加新驅(qū)動程序?qū)?yīng)的項目編譯文件中添加新驅(qū)動程序?qū)?yīng)的項目編譯選擇。選擇。(4)在目錄的)在目錄的Makefile文件中添加新驅(qū)動程序的編譯語句。文件中添加新驅(qū)動程序的編譯語句。5.4.2 Kconfig5.4.2 Kconfig內(nèi)核源碼樹的目錄下都有兩個文件內(nèi)核源碼樹的目錄下都有兩個文件Kconfig和和Makefile。分。分布到各目錄的布到各目錄的Kconfig文件構(gòu)成了一個分布式的內(nèi)核配置數(shù)
15、據(jù)文件構(gòu)成了一個分布式的內(nèi)核配置數(shù)據(jù)庫,每個庫,每個Kconfig文件分別描述了所屬目錄源文檔相關(guān)的內(nèi)核文件分別描述了所屬目錄源文檔相關(guān)的內(nèi)核配置菜單。在內(nèi)核配置配置菜單。在內(nèi)核配置make menuconfig(或或xconfig等等)時,從時,從Kconfig中讀出菜單,用戶選擇后保存到中讀出菜單,用戶選擇后保存到.config這個內(nèi)核配置文這個內(nèi)核配置文檔中。在內(nèi)核編譯時,主目錄中的檔中。在內(nèi)核編譯時,主目錄中的Makefile調(diào)用這個調(diào)用這個.config文文件,就知道了用戶的選擇。件,就知道了用戶的選擇。5.4.3 Kconfig5.4.3 Kconfig的語法的語法Kconfig語
16、法較為簡單,其語法在語法較為簡單,其語法在Documentation/kbuild/kconfig-language.txt文件中做了介紹。文件中做了介紹。歸納起來歸納起來Kconfig的語法主要包括以下幾個方面:的語法主要包括以下幾個方面:1主要語法總覽主要語法總覽2菜單入口(菜單入口(config)3菜單結(jié)構(gòu)(菜單結(jié)構(gòu)(menu)4選擇菜單(選擇菜單(choice)5注釋菜單(注釋菜單(comment)5.4.4 5.4.4 應(yīng)用實例:在內(nèi)核中新增加應(yīng)用實例:在內(nèi)核中新增加add_subadd_sub模模塊塊下面講解一個綜合實例,假設(shè)我們將要在內(nèi)核中添加下面講解一個綜合實例,假設(shè)我們將要在內(nèi)核中添加一個一個add_sub模塊。考慮模塊。考慮add_sub模塊的功能,決定將該模模塊的功能,決定將該模塊加到內(nèi)核源碼的塊加到內(nèi)核源碼的drivers目錄中。在目錄中。在drivers目錄中增加一個目錄中增加一個add_sub_Kconfig子目錄。子目錄。5.4.5 5.4.5 對對add_subadd_sub模塊進行配置模塊進行配置當(dāng)將當(dāng)將add_sub模塊的源文件加入到內(nèi)核源代碼中后,需模塊的源文件加入到內(nèi)核源代碼中后,需要對其進行配置,才能編譯模塊。要對其進行配置,才能編譯模塊。5.5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)三年班級活動方案
- 法官三八節(jié)活動方案
- 民航攝影大賽活動方案
- 榜樣在身邊系列活動方案
- 模擬課堂教研活動方案
- 樓梯文化墻活動方案
- 武術(shù)課展示活動方案
- 法律文物征集活動方案
- 畢業(yè)詩歌征集活動方案
- 夢想與希望課堂活動方案
- 《安全生產(chǎn)培訓(xùn)機構(gòu)基本條件AQ 8011-2023》知識培訓(xùn)
- 《鍛造技術(shù)培訓(xùn)》課件
- 《冷干機原理及維修》課件
- 中華詩詞之美學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 造口并發(fā)癥造口狹窄
- 蚊蠅蟲鼠害防治管理制度
- DL∕T 1100.1-2018 電力系統(tǒng)的時間同步系統(tǒng) 第1部分:技術(shù)規(guī)范
- 青海大學(xué)《統(tǒng)計學(xué)》2017-2018學(xué)年期末試卷
- 臺球助教勞務(wù)合同范本
- 瀘州老窖“濃香文釀杯”企業(yè)文化知識競賽考試題庫大全-下(多選、填空題)
- 歇后語大全500條
評論
0/150
提交評論