版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Linux字符設(shè)備驅(qū)動實例1看了Linux設(shè)備驅(qū)動程序的前兒章,我結(jié)合這篇教程中給出的一個2.4版內(nèi)核的字符驅(qū)動,口己編寫了一個2.6版內(nèi)核的驅(qū)動程序,并且加上了詳細(xì)的注釋。這個程序很簡單,但是對初學(xué)者把握2.6版內(nèi)核的字符驅(qū)動的脈絡(luò)應(yīng)該有一定的幫助,也可以算作我對Linux設(shè)備驅(qū)動程序前幾章學(xué)習(xí)的一個小結(jié)。/#globalvarc#include/模塊所需的大量符號和函數(shù)左義#include/指宦初始化和淸楚函數(shù)#include/文件系統(tǒng)相關(guān)的函數(shù)和頭文件#include/cdev結(jié)構(gòu)的頭文件#include/在內(nèi)核和用戶空間中移動數(shù)據(jù)的函數(shù)MODULE_LICENSE(nGPL11);/指
2、定代碼使用的許可證/文件操作函數(shù)的聲明intgiobelvdr_open(structinode*,structfile*);intgiostructinode*,structfile*);ssize_tglobalvar_read(structfile*,char*,size_t9loff_tssize_tglobalvar_write(structfile*tconstchar*,size_t,lofft*);intdev_major=50;/指定主設(shè)備號intdev_minor=0;/指定次設(shè)備號structfile_operationsglobalvar_fops=/將文件操作與分配的
3、設(shè)備號相連owner:THIS_MODULEZ/指向擁有該模塊結(jié)構(gòu)的指針open:giobdlv*_open,release:gioread:gio,write:globalvar_write,structgiobdlvcr_dev/用來表示我們定義設(shè)備的結(jié)構(gòu)intglobal_var;/這個變量代表要操作的設(shè)備structcdevcdev;/內(nèi)核中表示字符設(shè)備的結(jié)構(gòu);structgiobdlvcr_dev*my_dev;/設(shè)備結(jié)構(gòu)的指針staticvoidexitgiobdlvdr_exit(void)/退出模塊時的操作dev_tdevno=MKDEV(dev_majortdev_minor
4、);/dev_t是用來表示設(shè)備編號的結(jié)構(gòu)cdev_del(&my_dev-cdev);/從系統(tǒng)中移除一個字符設(shè)kfree(my_dev);/注銷已注冊的驅(qū)動程序/釋放口定義的設(shè)備結(jié)構(gòu)unregister_chrdev_region(devno,1);printk(nglobalvarunregistersuccessn);staticintinitglobalvar_init(void)/初始化模塊的操作intret,err;dev_tdevno=MKDEV(dev_majorfdev_minor);/動態(tài)分配設(shè)備號,次設(shè)備號已經(jīng)指定ret=alloc_chrdev_region(&devno
5、fdev_minorz1,nglobalvar);/保存動態(tài)分配的主設(shè)備號dev_major=MAJOR(devno);/根據(jù)期望值分配設(shè)備號/ret=register_chrdev_region(devnoz1,nglobalvarn);if(retglobel_vdr=O;0/設(shè)備變雖:初始化為cdev_init(&my_dev-cdevz&giobdlvcr_fops);/初始化設(shè)備中的cdev結(jié)構(gòu)my_dev-cdevowner=THIS_MODULE;所有者字段err=cdev_add(&my_dev-cdevtdevno,1);ev結(jié)構(gòu)的信息if(erri_cdevzstructg
6、iobdlvdr_dev,cdev);/將file結(jié)構(gòu)中的private_data字段指向已分配的設(shè)備結(jié)構(gòu)filp-private_data=dev;return0;/關(guān)閉設(shè)備文件系統(tǒng)調(diào)用對應(yīng)的操作intgiostructinode*inode,structfile*filp)return0;/讀設(shè)備文件系統(tǒng)調(diào)用對應(yīng)的操作ssize_tglobalvar_read(structfile*filprchar*buf,size_tlen,loff_t*off)/獲取指向已分配數(shù)據(jù)的指針structglobalvar_dev*dev=filp-private_data;/將設(shè)備變量值復(fù)制到用戶空間i
7、f(copy_to_user(buf,&dev-global_var,sizeof(int)return-EFAULT;returnsizeof(int);/返回讀取數(shù)據(jù)的大小/寫設(shè)備文件系統(tǒng)調(diào)用對應(yīng)的操作ssize_tglobalvar_write(structfile*filp,constcharuf,size_tle/獲取指向已分配數(shù)據(jù)的指針structglobalvar_dev*dev=filp-private_data;/從用戶空間復(fù)制數(shù)據(jù)到內(nèi)核中的設(shè)備變量if(copy_from_user(&dev-globel_var,buftsizeof(int)return-EFAULT;r
8、eturnsizeof(int);/返回寫數(shù)據(jù)的大小module_init(globalvar_init);/模塊被裝載H寸調(diào)用globalvar_initmodule_exit(globalvar_exit);/模塊被卸載H寸調(diào)用globalvar_exit/按如下內(nèi)容編寫一個Makefile文件,然后輸入make就可以開始口動編譯了。編譯之后得到了一個名為globalvar.ko的模塊文件,這就是我們需要的設(shè)備驅(qū)動文件。/#Makefileifneq($(KERNELRELEASE)z)obj-m:=globalvaroelse-r)/buildKERNELDIR?=/lib/module
9、s/$(shellunamePWD:=$(shellpwd)all:$(MAKE)-C$(KERNELDIR)M=$(PWD)modulesclean:$(MAKE)-C$(KERNELDIR)M=$(PWD)cleanendif接下來運行如下代碼,將驅(qū)動加入內(nèi)核。insmodglobalvarko此時可以用dmesg或lsmod命令檢査一下模塊加載是否成功。如果沒有問題,就可以使用mknod構(gòu)造一個設(shè)備文件:mknod/dev/globalvarc最肓,按照下面內(nèi)容編寫一個簡單的測試文件并用gcc編譯。/#testc#include#include#include#includemain()intfd,num;/可讀寫方fd=open(u/dev/globalvarn.O_RDWR,S_IRUSR|S_IWUSR);式打開設(shè)備文件/讀取設(shè)備read(fdz&num,sizeof(int);變雖:printf(nTheglobalvaris%dnn,num);printf(uPleaseinputthenumwrittenglobalvarnn);scanf(M%dn,&num)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 防水工程設(shè)計變更協(xié)議
- 學(xué)生犯錯字保證書信譽
- 物資購買合同范本示例
- 教堂配件供需合同
- 網(wǎng)絡(luò)直播主播簽約規(guī)范
- 完整招商服務(wù)合同案例
- 物資選購協(xié)議樣式
- 演出合作放心合同
- 高效家居采購合同的簽訂要點
- 供水合同協(xié)議書簽訂流程詳解
- 智能充電站轉(zhuǎn)讓協(xié)議書范本
- 蘇教版六年級數(shù)學(xué)上冊全冊知識點歸納梳理
- 2024年新蘇教版科學(xué)六年級上冊全冊知識點(超全)
- 低壓不停電換表接插件技術(shù)規(guī)范
- DLT 5210.5-2018 電力建設(shè)施工質(zhì)量驗收規(guī)程 第5部分:焊接
- 骨科護(hù)理??谱o(hù)士護(hù)理知識筆試題及答案
- 勞動教育概論智慧樹知到期末考試答案章節(jié)答案2024年哈爾濱工業(yè)大學(xué)
- 計算機使用管理制度
- 中考語文押題作文范例7篇(含題目)
- 勞務(wù)分包方考核評價表格附表
- DZ∕T 0214-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 銅、鉛、鋅、銀、鎳、鉬(正式版)
評論
0/150
提交評論