#ineludeMODULE_LICENSE(nGPLH);staticinthello_init(void){printk(">
資源描述:

《Linux驅(qū)動程序?qū)嵗酚蓵T上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、1、最簡單的設(shè)備驅(qū)動程序hcllo.c#include#ineludeMODULE_LICENSE(nGPLH);staticinthello_init(void){printk(KERN_ALERT,,Hello,Hello,LinuxDriver!n);return0;}staticvoidhello_exit(void){printk(KERN_ALERTnGoodbye,Hello,LinuxDriver!H);}module_init(hello_init);mod

2、ule_exit(hello_exit);說明:(1)前兩行為所包含的頭文件,位于內(nèi)核源碼的目錄下include文件夾下的。(2)程序中的MODULE_LICENSE(nGPL");用于聲明模塊的許可證。⑶module_init()為注冊加載時執(zhí)行的函數(shù),module_exit()為/注冊卸載時執(zhí)彳亍的函數(shù)。傳遞給這兩個函數(shù)的的參數(shù)為所要進行初始化的函數(shù)的地址(函數(shù)名)。⑷模塊的編譯:使用gcc編譯器,與編譯普通程序不同的是要在參數(shù)-工后指定內(nèi)核源代碼的目錄,2.4的內(nèi)核模塊編譯后將生成.o格式的文件。命令行下的編譯格式如下:gcc-DMOD

3、ULE-DKERNEL-I/usr/src/linux-2.4.20/include-chello.c?其中-DMODULE-D—KERNEL—為兩個宏定義,如果文件中包含這兩個的宏定義,可以在gCC編譯時不用再指定。文件中宏定義的內(nèi)容如下:#ifndef—KERNEL—#define—KERNEL—#endif#ifndefMODULE#defineMODULE#endif(5)模塊的加載與卸載模塊加載:在命令行下執(zhí)行:insmodhello.o?如果成功加載到內(nèi)核將在終端上顯水:Hello,Hello,LinuxDriver!。查看加載的

4、模塊:通過lsmod命令町以杳看內(nèi)核屮已經(jīng)加載的模塊。模塊的卸載:rmmodhello.Oo卸載成功的話將終端顯示:Goodbye,Hello,LinuxDriver!⑹驅(qū)動模塊運行在內(nèi)核空間,運行時不能依賴于任何函數(shù)庫和模塊連接,所以在耳驅(qū)動時所調(diào)用的函數(shù)只能是作為內(nèi)核一部分的函數(shù)。內(nèi)核代碼不能實現(xiàn)浮點書運算。2、-般驅(qū)動程序都會實現(xiàn)一個file_operation結(jié)構(gòu)中的函數(shù)。如test.c程序中所實現(xiàn)的file_operation結(jié)構(gòu)如下:struct,file_operationstest_fops={read:read_test,w

5、rite:writ,open:open_test,release:release_test,};該驅(qū)動程序所實現(xiàn)的功能是在內(nèi)存中開辟-?段空間,write實現(xiàn)了往這段內(nèi)屮寫數(shù)據(jù),read正好相反,是從這段內(nèi)存中讀出數(shù)據(jù)。(1)頭文件和全局變量定義如下:#include#includedinux/fs.h>#includevlinux/mm.h>#inc丄ude<丄inux/errno?h>#include#include#includedinux/mod

6、ule.h>#include#include//設(shè)備號//存放內(nèi)心空間的指針//當(dāng)前內(nèi)存中擁有的數(shù)據(jù)的字節(jié)數(shù)MODULE_LICENSE(f,GPLf,);unsignedinttest_major=254;char*str_test;unsignedintcount_driver;constunsignedintcount_driver_max=255;//容雖的最大值(2)模塊初始化函數(shù)為:staticinttest_init_modu1e(void)intresult;r

7、esult=register_chrdev(test_majorz,,test,,z&test_fops);if(result<0){printk(KERN_INFOntest:can11getmajornuir.bern);returnresult;}printk("registei:okn);if((str_test=(char*)kmalloc(256,GFP_KERNEL))==NULL)//屮請256字節(jié)fl勺內(nèi)存空MJ{printk(nkmallocerrorK);return-1;Elseprintk(,Tkamll

8、ocsuccess!n);count_driver=0;}return0;}完成了兩個工作:一、通過register_chrdev()向系統(tǒng)注冊了一個設(shè)備名為t

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

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

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