資源描述:
《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