下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
linuxMISC驅(qū)動模型分析閱讀led驅(qū)動程序的代碼的時候,沒有發(fā)現(xiàn)ldd3中提到的各種字符設(shè)備注冊函數(shù),而是發(fā)現(xiàn)了一個misc_register函數(shù),這說明led設(shè)備是作為雜項設(shè)備出現(xiàn)在內(nèi)核中的,在內(nèi)核中,misc雜項設(shè)備驅(qū)動接口是對一些字符設(shè)備的簡單封裝,他們共享一個主設(shè)備號,有不同的次設(shè)備號,共享一個open調(diào)用,其他的操作函數(shù)在打開后運用linux驅(qū)動程序的方法重載進(jìn)行裝載。1.主要數(shù)據(jù)結(jié)構(gòu)內(nèi)核維護(hù)一個misc_list鏈表,misc設(shè)備在misc_register注冊的時候鏈接到這個鏈表,在misc_deregister中解除鏈接。主要的設(shè)備結(jié)構(gòu)就是miscdevice。定義如下:[plain]viewplaincopyprint?structmiscdevice{intminor;const char *name;const structfile_operations*fops;struct list_headlist;struct device *parent;struct device *this_device;const char *nodename;mode_t mode;};這個結(jié)構(gòu)體是misc設(shè)備基本的結(jié)構(gòu)體,在注冊misc設(shè)備的時候必須要聲明并初始化一個這樣的結(jié)構(gòu)體,但其中一般只需填充nameminorfops字段就可以了。下面就是led驅(qū)動程序中初始化miscdevice的代碼:[plain]viewplaincopyprint?staticstructmiscdevicemisc={.minor=MISC_DYNAMIC_MINOR,.name=DEVICE_NAME,.fops=&dev_fops,};一般的時候在fops不用實現(xiàn)open方法,因為最初的方法misc_ops包含了open方法。其中minor如果填充MISC_DYNAMIC_MINOR,則是動態(tài)次設(shè)備號,次設(shè)備號由misc_register動態(tài)分配的。misc_init函數(shù)misc也是作為一個模塊被加載到內(nèi)核的,只不過是靜態(tài)模塊。這個函數(shù)是misc靜態(tài)模塊加載時的初始化函數(shù)。[plain]viewplaincopyprint?staticint__initmisc_init(void){interr;4.5.#ifdefCONFIG_PROC_FSproc_create("misc",0,NULL, &misc_proc_fops);#endifmisc_class=class_create(THIS_MODULE, "misc");//udev創(chuàng)建設(shè)備節(jié)點使用err=PTR_ERR(misc_class);if(IS_ERR(misc_class))gotofail_remove;14.15.err=-EIO;if(register_chrdev(MISC_MAJOR,"misc",&misc_fops))//注冊一個字符設(shè)備gotofail_printk;misc_class->devnode=misc_devnode;return0;21.22.fail_printk:printk("unabletogetmajor%dformiscdevices\n",MISC_MAJOR);class_destroy(misc_class);fail_remove:remove_proc_entry("misc",NULL);returnerr;}可以看出,這個初始化函數(shù),最主要的功能就是注冊字符設(shè)備,所用的注冊接口是2.4內(nèi)核的register_chrdev。它注冊了主設(shè)備號為MISC_MAJOR,次設(shè)備號為0-255的256個設(shè)備。并且創(chuàng)建了一個misc類。misc_register()函數(shù)misc_register()函數(shù)在misc.c中,最主要的功能是基于misc_class構(gòu)造一個設(shè)備,將miscdevice結(jié)構(gòu)掛載到misc_list列表上,并初始化與linux設(shè)備模型相關(guān)的結(jié)構(gòu),它的參數(shù)是miscdevice結(jié)構(gòu)體。[plain]viewplaincopyprint?intmisc_register(structmiscdevice*misc){structmiscdevice *c;dev_tdev;interr=0;6.7.INIT_LIST_HEAD(&misc->list);//鏈表項使用時必須初始化9.10.mutex_lock(&misc_mtx);list_for_each_entry(c,&misc_list,list){if(c->minor==misc->minor){mutex_unlock(&misc_mtx);return-EBUSY;}}//遍歷鏈表如果發(fā)現(xiàn)次設(shè)備號一樣的,返回錯誤18.19.if(misc->minor==MISC_DYNAMIC_MINOR){//動態(tài)次設(shè)備號inti=DYNAMIC_MINORS;while(--i>=0)if((misc_minors[i>>3]&(1<<(i&7)))==0)break;if(i<0){
26.mutex_unlock(&misc_mtx)26.mutex_unlock(&misc_mtx)return-EBUSY;}misc->minor=i;}31.32.if(misc->minor<DYNAMIC_MINORS)misc_minors[misc->minor>>3]|=1<<(misc->minor&7);dev=MKDEV(MISC_MAJOR,misc->minor);36.37.misc->this_device=device_create(misc_class,misc->parent,dev,misc,"%s",misc->name);//udev創(chuàng)建設(shè)備節(jié)點使用,linux設(shè)備模型相關(guān)if(IS_ERR(misc->this_device)){err=PTR_ERR(misc->this_device);gotoout;TOC\o"1-5"\h\z}45.46./**Addittothefront,sothatlaterdevicescan"override"*earlierdefaults*/list_add(&misc->list,&misc_list);//添加至Umisc_list之中out:mutex_unlock(&misc_mtx);returnerr;}可以看出,這個函數(shù)首先遍歷misc_list鏈表,查找所用的次設(shè)備號是否已經(jīng)被注冊,防止沖突。如果是動態(tài)次設(shè)備號則分配一個,然后調(diào)用MKDEV生成設(shè)備號,從這里可以看出所有的misc設(shè)備共享一個主設(shè)備號MISC_MAJOR,然后調(diào)用device_create,生成設(shè)備文件。最后加入到misc_list鏈表中。關(guān)于device_create,class_create作用: class_create函數(shù)在misc.c中的模塊初始化中被調(diào)用,現(xiàn)在一起說一下。這兩個函數(shù)看起來很陌生,沒有在ldd3中發(fā)現(xiàn)過,看源代碼的時候發(fā)現(xiàn)class_create會調(diào)用底層組件__class_regsiter()是說明它是注冊一個類。而device_create是創(chuàng)建一個設(shè)備,他是創(chuàng)建設(shè)備的便捷實現(xiàn)調(diào)用了device_register函數(shù)。他們都提供給linux設(shè)備模型使用,從linux內(nèi)核2.6的某個版本之后,devfs不復(fù)存在,udev成為devfs的替代。相比devfs,udev有很多優(yōu)勢。[plain]viewplaincopyprint?structclass*myclass=class_create(THIS_MODULE,“my_device_driver”);class_device_create(myclass,NULL,MKDEV(major_num,0),NULL,“my_device”);這樣就創(chuàng)建了一個類和設(shè)備,模塊被加載時,udevdaemon就會自動在/dev下創(chuàng)建my_device設(shè)備文件節(jié)點。這樣就省去了自己創(chuàng)建設(shè)備文件的麻煩。這樣也有助于動態(tài)設(shè)備的管理。4.總結(jié)雜項設(shè)備作為字符設(shè)備的封裝,為字符設(shè)備提供的簡單的編程接口
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北京航空航天大學(xué)科學(xué)技術(shù)研究院聘用編科研助理F崗招聘備考題庫參考答案詳解
- 中國司法大數(shù)據(jù)研究院2026年招聘備考題庫及參考答案詳解
- 2025年遂寧市大數(shù)據(jù)中心遂寧數(shù)字經(jīng)濟研究院的招聘備考題庫附答案詳解
- 黑龍江公安警官職業(yè)學(xué)院《現(xiàn)代漢語》2025 學(xué)年第二學(xué)期期末試卷
- 清遠(yuǎn)市公安局公開招聘警務(wù)輔助人員200人備考題庫及1套參考答案詳解
- 2025吉林白城市鎮(zhèn)賚縣事業(yè)單位招聘(含專項招聘高校畢業(yè)生)附基層治理專干47人備考核心試題附答案解析
- 2025年中國社會科學(xué)院亞太與全球戰(zhàn)略研究院公開招聘第一批專業(yè)技術(shù)人員備考題庫完整答案詳解
- 2025年北京協(xié)和醫(yī)院變態(tài)(過敏)反應(yīng)科合同制科研助理招聘備考題庫及一套完整答案詳解
- 2025年吉安市第十二中學(xué)面向社會公開招聘編外工作人員考試核心試題及答案解析
- 2025廣西北海市海城區(qū)發(fā)展和改革局招聘編外人員1人備考考試試題及答案解析
- 2026成方金融信息技術(shù)服務(wù)有限公司校園招聘5人考試題庫附答案
- 車輛租賃服務(wù)協(xié)議書
- 2025安徽安慶市公安機關(guān)招聘警務(wù)輔助人員418人備考筆試題庫及答案解析
- 2025廣東廣州市黃埔區(qū)招聘社區(qū)專職工作人員50人(第二次)參考筆試題庫及答案解析
- 2024年廣州市南沙區(qū)南沙街道社區(qū)專職招聘考試真題
- 2026年牡丹江大學(xué)單招職業(yè)技能考試題庫新版
- 國家開放大學(xué)22517《社區(qū)工作》(統(tǒng)設(shè)課)期末終考題庫
- 江西省三新協(xié)同體2025-2026年高一上12月歷史試卷(含答案)
- 2026年大慶醫(yī)學(xué)高等??茖W(xué)校單招職業(yè)適應(yīng)性測試題庫及答案詳解1套
- (2026年)老年癡呆認(rèn)知癥患者的照護(hù)課件
- 2025年中職電梯安全管理(電梯安全規(guī)范)試題及答案
評論
0/150
提交評論