資源描述:
《linux字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Linux字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)付智華(四川大學(xué)計(jì)算機(jī)學(xué)院,四川成都)摘要:本文主要涉及Linux字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)中的預(yù)處理、模塊的初始和終止、設(shè)備驅(qū)動(dòng)程序的裝配和卸載、以及文件操作。通過代碼片斷闡述了各個(gè)部分的設(shè)計(jì)要點(diǎn)。關(guān)鍵詞:設(shè)備驅(qū)動(dòng)程序;模塊中圖分類號(hào):文獻(xiàn)標(biāo)識(shí)碼:ADesignofLinuxCharacterDeviceDriverLUTAONetworkInformationCenterofSouth-westUniversityofScienceandTechnologyAbstract:ThepapermainlydealswithLinuxcharacte
2、rdevicedriverdesignthatincludepretreatment,initializtionandterminationofthemodule,loadandunloadofthedevicedriverandsomefileoperations.Elaboratedvariouspartsofthedesignfeaturesbycodefragment.Keywords:devicedriver;module1.概述Linux系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核的重要組成部分,它與硬件設(shè)備之間建立了標(biāo)準(zhǔn)的抽象接口。通過這個(gè)接口,用戶可以像處理普通文件一
3、樣,對(duì)硬件設(shè)備進(jìn)行打開(open)、關(guān)閉(close)、讀寫(read/write)等操作。通過分析和設(shè)計(jì)設(shè)備驅(qū)動(dòng)程序,可以深入理解Linux系統(tǒng)和進(jìn)行系統(tǒng)開發(fā)。Linux設(shè)備分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。字符設(shè)備是不需要緩沖而直接讀寫的設(shè)備,如串口、鍵盤、鼠標(biāo)等;塊設(shè)備的訪問通常需要緩沖來支持,以數(shù)據(jù)塊為單位來讀寫,如磁盤設(shè)備等;網(wǎng)絡(luò)設(shè)備是通過套接字來訪問的特殊設(shè)備。本文主要討論字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)。2.預(yù)定義和必要的頭文件首先,在包含任何頭文件前,我們需要在預(yù)定義器中定義符號(hào)__KERNEL__。這個(gè)符號(hào)用于選擇使用頭文件的哪一部分。由于libc包含了這些頭文件,應(yīng)
4、用程序最終也會(huì)包含內(nèi)核頭文件,但應(yīng)用程序不需要內(nèi)核原型。于是就用__KERNEL__符號(hào)將那些額外的去掉。將內(nèi)核符號(hào)和宏開放給用戶空間的程序會(huì)造成那個(gè)程序的名字空間污染。另一個(gè)很重要的符號(hào)就是MODULE,必須包含前定義此符號(hào)。除非要把設(shè)備驅(qū)動(dòng)程序編譯到內(nèi)核映象中,MODULE一般是定義了的。由于本文所涉及的驅(qū)動(dòng)程序不是直接連接到內(nèi)核中去的,所以定義了這個(gè)符號(hào)。對(duì)于連接的每一個(gè)不同版本的內(nèi)核,模塊都要相應(yīng)地編譯一次。version.h定義了整數(shù)宏LINUX_VERSION_CODE。這個(gè)宏展開后是內(nèi)核版本的二進(jìn)制表示,利用這個(gè)信息,可以判斷出
5、處理的是哪個(gè)版本的內(nèi)核。當(dāng)用戶利用類結(jié)構(gòu)加載模塊時(shí),在標(biāo)準(zhǔn)輸出設(shè)備和系統(tǒng)日志上會(huì)顯示一個(gè)壞模塊的出錯(cuò)信息。為了消除這條信息,用戶需要為MODULE_LICENSE()宏增加一個(gè)示例,例如MODULE_LICENSE("GPL")。這種2.4內(nèi)核以后的版本才引入的宏,可以將模塊定義為獲得GPLVersion2或更新版本許可的模塊。為了確保模塊是否可以安全地卸載,系統(tǒng)為每個(gè)模塊保留了一個(gè)使用計(jì)數(shù)。由于模塊忙的時(shí)候是不能卸載模塊的,系統(tǒng)需要這些信息。例如你不能在應(yīng)用程序使用某個(gè)設(shè)備時(shí)就去掉它。驅(qū)動(dòng)程序通過宏來維持使用計(jì)數(shù)。下面是示例代碼:#ifndef__KERNEL__#def
6、ine__KERNEL__//按內(nèi)核模塊編譯#endif#ifndefMODULE#defineMODULE//設(shè)備驅(qū)動(dòng)程序模塊編譯#endif//必要的頭文件#include//同kernel.h,最基本的內(nèi)核模塊頭文件#include//同module.h,最基本的內(nèi)核模塊頭文件#include//這里包含了進(jìn)行正確性檢查的宏#include//文件系統(tǒng)所必需的頭文件#include//這里包含了內(nèi)核空間與用戶空間進(jìn)行數(shù)據(jù)交
7、換時(shí)的函數(shù)MODULE_LICENSE("GPL");#defineMOD_INC_USE_COUNT//當(dāng)前模塊計(jì)數(shù)加1#defineMOD_DEC_USE_COUNT//當(dāng)前模塊計(jì)數(shù)減13.模塊初始化和終止驅(qū)動(dòng)程序可以按照兩種方式編譯。一種是編譯進(jìn)kernel,另一種是編譯成模塊(modules),如果編譯進(jìn)內(nèi)核的話,會(huì)增加內(nèi)核的大小,還要改動(dòng)內(nèi)核的源文件,而且不能動(dòng)態(tài)的卸載,不利于調(diào)試,所以推薦使用模塊方式。一個(gè)應(yīng)用程序是從頭到尾完成一個(gè)任務(wù),而模塊則是為了以后處理某些請(qǐng)求而注冊(cè)自己,完成這個(gè)任務(wù)后它的“主”