Linux驅(qū)動開發(fā)(一)

Linux驅(qū)動開發(fā)(一)

ID:38190116

大?。?25.50 KB

頁數(shù):6頁

時間:2019-05-24

Linux驅(qū)動開發(fā)(一)_第1頁
Linux驅(qū)動開發(fā)(一)_第2頁
Linux驅(qū)動開發(fā)(一)_第3頁
Linux驅(qū)動開發(fā)(一)_第4頁
Linux驅(qū)動開發(fā)(一)_第5頁
資源描述:

《Linux驅(qū)動開發(fā)(一)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、Linux驅(qū)動開發(fā)(一)引言:學(xué)習(xí)Linux驅(qū)動先從模塊開始,驅(qū)動都是以模塊的形式出現(xiàn)的,所以編寫內(nèi)核模塊是學(xué)習(xí)驅(qū)動的第一步。下面以一個實例來展開模塊的開發(fā)。1.新建一個文件夾,mkdirdriver2.寫一個。C文件,vimhello.c3.加入代碼//這兩個頭文件時開發(fā)模塊必須的兩個頭文件#include#includeMODULE_LICENSE("GPL");//通過GPL來授權(quán),是一個授權(quán)聲明,linux內(nèi)核維護是開源組織維護

2、的,對于你編寫的每一個驅(qū)動都是貢獻于開源組織的,是用來擴展內(nèi)核的,而不是來污染內(nèi)核的,linux內(nèi)核對函數(shù)使用是有要求的,沒有通過授權(quán)的不能使用這些函數(shù)。inthello_init(void)//對于入口函數(shù)沒參數(shù),但有返回值{printk("<0>""hellomodule");//注意:"<0>"與"hellomodule之間要有空格//printf和printk就一個差別,能否設(shè)定級別“<0>”就是設(shè)定級別為最高級別0return;}inthello_exit(void)//出口函數(shù),

3、沒參數(shù),沒返回值{printk("helloexit");}MODULE_AUTHOR(“tocore”);//注明模塊的作者module_init(hello_init);//module_init是一個宏,里面加載的是入口函數(shù)module_exit(hello_exit);//module_exit是一個宏,里面加載的是出口函數(shù)4.以上就是一個模塊文件,寫完后要進行編譯,編譯之前必須要寫Makefile文件才能編譯。Makefile文件如下:ifeq($(KERNEKRELEASE),)

4、//這是內(nèi)核中定義的一個宏,編譯模塊時,如果KERNEKRELEASE為空時,則說明要編譯的模塊不在內(nèi)核中,$表示取變量KERNELDIR:=/usr/src/kernels/2.6.18-92.el5-xen-i686//通過KERNELDIR得到內(nèi)//核地址,中間是tab鍵PWD:=$(shellpwd)//得到當前模塊路徑,default://default下一行為tab鍵$(MAKE)-C$(KERNELDIR)M=$(PWD)modules//最前面為一tab鍵//-C后面跟的內(nèi)核路徑

5、,這句話的意思是調(diào)用make命令時切換當前目錄到KERNELDIR下面,去編譯PWD目錄下的模塊,M的意思是模塊,M=$(PWD)modules,當前目錄下的模塊elseobj-m:=hello.o//目標文件為hello.oendif1.執(zhí)行make命令對模塊進行編譯2.如何加載和卸載模塊到內(nèi)核中利用insmod命令加載,利用rmmod命令卸載具體用法為:insmodhello.ko//加載模塊rmmodhello.ko//卸載模塊查看模塊是否加載成功用命令dmesg,輸出結(jié)果,如圖:3.當模

6、塊已經(jīng)加載后,再重新加載一遍便會出現(xiàn)文件存在的提示,加載之后不能再進行加載。要消除這個提示,除非用rmmod命令將其卸載掉,然后再重新加載,加載完畢后用lsmod命令查看新加載的模塊,一般新加載的模塊都在最上面,如圖:也可以通過查看proc/modules下文件按查看,如圖:4.命令modinfohello.ko可以查看模塊的詳細信息1.加載模塊的目的是為了初始化設(shè)備,有時初始化時需要傳遞參數(shù),下面介紹模塊中如何傳遞參數(shù)??梢酝ㄟ^module_param為模塊定義一個參數(shù),在裝載內(nèi)核模塊時,用戶

7、可以向模塊傳遞參數(shù),參數(shù)類型可以是byte、short、ushort、int、uint、long、ulong、charp、bool、或invbool(布爾的反),在模塊被編譯時會將module_param中聲明的類型與變量定義的類型進行比較,判斷是否一致。module_param(num,int,S_IRUGO

8、S_IWUGO);S_IRUGO表示可讀,S_IWUGO表示可寫。#include#includeMODULE_LICENSE

9、("GPL");intnum=0;//不改動,默認為0,定義參數(shù)module_param(num,int,S_IRUGO

10、S_IWUGO);//利用module_param向模塊傳遞參數(shù)定義參數(shù)//可讀可寫inthello_init(void){printk("<0>""hellomodule,num=%d",num);//打印出數(shù)字return;}Voidhello_exit(void){printk("helloexit");}module_init(hello_init);modu

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。