久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Linux字符設備驅動模型之設備號

Linux字符設備驅動模型之設備號 時間:2018-09-27      ;來(lai)源:未知

從上(shang)(shang)文中(zhong)可知,在(zai)Linux用戶空間中(zhong),如(ru)若(ruo)需要(yao)操作硬件設(she)備(bei)(bei),均通過(guo)/dev目(mu)錄(lu)下的設(she)備(bei)(bei)文件節(jie)點進行操作,基本上(shang)(shang)每(mei)一(yi)種設(she)備(bei)(bei)都會(hui)存在(zai)一(yi)個(ge)或者(zhe)多個(ge)的設(she)備(bei)(bei)節(jie)點。

并(bing)且在Linux內核中,其(qi)表示字符(fu)設備的結構(gou)成員(yuan)也提供了(le)相應的設備號。

設備號成員為dev_t dev;那么其(qi)與(yu)設備之(zhi)間的(de)關系是什么呢?它又與(yu)用戶空間的(de)操作(zuo)是和關系??

一、設備號

那么(me)設備文件節點又(you)是如何與Linux內核驅(qu)動程序進(jin)行對(dui)應(ying)的映射關系呢???答案(an)是:主設備號(hao)。

在前文舉例過,可能會存在多(duo)個相同的設(she)備(bei)運行在Linux系統中,這些設(she)備(bei)所使用的是(shi)同一個內(nei)核驅(qu)動程序(xu),那么是(shi)如何區(qu)分各個設(she)備(bei)的呢???答案是(shi):次(ci)設(she)備(bei)號。

那么(me)設備號在用(yong)戶空間中,是如(ru)何體現的呢???

在我們現有的(de)Linux系統(tong)中,進行/dev目錄(lu)下,執行命(ming)令(ling)。

命令:ls -l

如上(shang)圖(tu)所示(shi),在(zai)其設(she)(she)備(bei)(bei)節(jie)點文件的(de)屬性中,可以查看到設(she)(she)備(bei)(bei)節(jie)點的(de)主(zhu)設(she)(she)備(bei)(bei)號(hao)(hao)(hao)和次(ci)設(she)(she)備(bei)(bei)號(hao)(hao)(hao)。其中逗號(hao)(hao)(hao)‘,’前為主(zhu)設(she)(she)備(bei)(bei)號(hao)(hao)(hao),后為次(ci)設(she)(she)備(bei)(bei)號(hao)(hao)(hao)。并且如上(shang)圖(tu)所示(shi),對于loop設(she)(she)備(bei)(bei)而言,其有很多(duo)相(xiang)(xiang)同的(de)設(she)(she)備(bei)(bei)運行在(zai)Linux操作(zuo)系(xi)統中,那么他(ta)們的(de)各(ge)個(ge)相(xiang)(xiang)同的(de)設(she)(she)備(bei)(bei)都具有唯一(yi)的(de)節(jie)點名稱,但他(ta)們的(de)主(zhu)設(she)(she)備(bei)(bei)號(hao)(hao)(hao)相(xiang)(xiang)同,均為7;次(ci)設(she)(she)備(bei)(bei)號(hao)(hao)(hao)不同,按照節(jie)點的(de)順(shun)序進行排(pai)列。

二、設備號操作

在Linux內(nei)核源(yuan)(yuan)碼(ma)中(zhong)(zhong),使用(yong)結構體dev_t類型來(lai)定(ding)義設備號。實(shi)際上dev_t類型為32位的unsigned int類型(在Linux內(nei)核源(yuan)(yuan)碼(ma)中(zhong)(zhong)可以進(jin)行跟蹤)。其(qi)中(zhong)(zhong)高12位作(zuo)為存儲(chu)主設備號,低20位作(zuo)為存儲(chu)次設備號。

那么(me)就存在了如下幾個問題:

1.如果知(zhi)道(dao)主設備號(hao)和次設備號(hao),那么怎么組合成dev_t類型(xing)的數(shu)據?

 在Linux內核中,提供了(le)MKDEV方法宏來進行組合主設備(bei)號(hao)(hao)和次(ci)設備(bei)號(hao)(hao)。其原型如下(xia):

用(yong)法為:dev_t dev = MKDEV(主設備號(hao),次設備號(hao))

2.如何從dev_t類型的(de)數據(ju)中解析出主設(she)備號?

如(ru)上圖,在Linux內核中采用了MAJOR方法(fa)宏來進行(xing)解(jie)析(xi)主設備號。用法(fa)如(ru)下(xia):

主設備號 = MAJOR(dev_t dev)

3.如何從dev_t類型的數據(ju)中解(jie)析出次設備號?

 如上圖,在Linux內核中采用了MINOR方(fang)法宏來進行解析主設備號(hao)。用法如下(xia):

次設(she)備號 = MINOR(dev_t dev)

三、設(she)備號分配(pei)/申請

因為是在(zai)Linux內核(he)(he)框架下進(jin)行(xing)編寫設備驅動程序,那么每一個設備的設備號可以有Linux內核(he)(he)提供的方(fang)法來進(jin)行(xing)分配(pei)。

Linux內核中(zhong)如何(he)為設備分配一個主設備號???

實際上在Linux內核中(zhong)提供(gong)了兩種方法可以(yi)進行(xing)分(fen)配主設(she)(she)備(bei)號。分(fen)別為靜(jing)態(tai)(tai)申請設(she)(she)備(bei)號和(he)動(dong)態(tai)(tai)分(fen)配設(she)(she)備(bei)號。

靜(jing)態申請設(she)(she)備(bei)(bei)號(hao):程序員(yuan)自己選擇一(yi)個數字作(zuo)為某(mou)一(yi)個設(she)(she)備(bei)(bei)的(de)主(zhu)設(she)(she)備(bei)(bei)號(hao),再確定其(qi)(qi)次設(she)(she)備(bei)(bei)號(hao)(實際上如果是單一(yi)的(de)設(she)(she)備(bei)(bei),通常(chang)次設(she)(she)備(bei)(bei)號(hao)為0),通過組合得到設(she)(she)備(bei)(bei)號(hao),然后通過函(han)數register_chrdev_region向內核申請主(zhu)設(she)(she)備(bei)(bei)號(hao)使用(yong)。其(qi)(qi)原型如下:

 靜態申請設(she)(she)備(bei)(bei)號(hao)的(de)缺(que)點(dian)在(zai)(zai)于(yu),如果所申請的(de)設(she)(she)備(bei)(bei)號(hao)已經在(zai)(zai)內核(he)中被其他設(she)(she)備(bei)(bei)驅(qu)(qu)動(dong)使用(yong)了,則會申請失(shi)敗。并且另(ling)一點(dian)是,在(zai)(zai)Linux內核(he)中存在(zai)(zai)一些(xie)設(she)(she)備(bei)(bei)驅(qu)(qu)動(dong)的(de)設(she)(she)備(bei)(bei)號(hao)為固(gu)定(ding)的(de)設(she)(she)備(bei)(bei)號(hao),例如:串(chuan)口UART、I2C設(she)(she)備(bei)(bei)驅(qu)(qu)動(dong)等。

動(dong)態分配設備號:Linux內(nei)核(he)提供方法(fa)函(han)數(shu)alloc_chrdev_region,由內(nei)核(he)動(dong)態的(de)(de)分配一個可用的(de)(de)主(zhu)設備號給相應的(de)(de)設備驅動(dong)。其原型為:

動態分配設備號(hao)的(de)(de)優點在于,因為Linux內核本(ben)身自己知道了哪些設備號(hao)已(yi)經(jing)被(bei)使用(yong)了,所(suo)以基本(ben)不(bu)會導(dao)致分配到(dao)已(yi)用(yong)了的(de)(de)設備號(hao),從(cong)而(er)不(bu)會申(shen)請設備號(hao)失敗。

四、設備(bei)號(hao)注(zhu)銷(xiao)

實際上(shang)無(wu)論是(shi)使(shi)(shi)用(yong)動(dong)(dong)態(tai)分(fen)配(pei)得到的(de)設(she)備(bei)號(hao)(hao),還是(shi)使(shi)(shi)用(yong)靜態(tai)申請得到的(de)設(she)備(bei)號(hao)(hao),當Linux系統(tong)中(zhong)不再(zai)需(xu)要相應的(de)硬(ying)件設(she)備(bei)時,可將(jiang)其設(she)備(bei)驅動(dong)(dong)進行注銷,那么(me)重要的(de)一步就是(shi)在設(she)備(bei)驅動(dong)(dong)退出時,使(shi)(shi)用(yong)方法函(han)數unregister_chrdev_region函(han)數釋放相應的(de)設(she)備(bei)號(hao)(hao)。其原型為:

設備號釋放后(hou),設備節點文件將不存在(zai)。

上一篇:Linux字符設備驅動模型之框架解說

下一篇:一瞥Unity集成開發環境中的軟件工程設計思想

熱點文章推(tui)薦
華清學(xue)員就(jiu)業(ye)榜單
高薪學員(yuan)經驗分享
熱點新聞推(tui)薦
前臺專(zhuan)線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部