招生熱線
0755-86191118 0755-86191118
我的位置: 首頁 > 學習專區(qū) > 網(wǎng)絡工程 > Linux設備驅(qū)動:如何寫字符設備驅(qū)動(1)

Linux設備驅(qū)動:如何寫字符設備驅(qū)動(1)

2016-03-04 16:25:48
來源:
[導讀] 如何寫Linux字符設備驅(qū)動?首先我們來分解一下字符設備驅(qū)動都有那些結構或者方法組成,也就是說實現(xiàn)一個可以使用的字符設備驅(qū)動我們必須做些什么工作。1、主設備號和次設備號對于字符設備的訪問是通過文件系統(tǒng)中的設備名稱進行的。他們通常位于 dev目錄下。如下:其中b代表塊設備,c
如何寫Linux字符設備驅(qū)動?首先我們來分解一下字符設備驅(qū)動都有那些結構或者方法組成,也就是說實現(xiàn)一個可以使用的字符設備驅(qū)動我們必須做些什么工作。
1、主設備號和次設備號
對于字符設備的訪問是通過文件系統(tǒng)中的設備名稱進行的。他們通常位于/dev目錄下。如下:
其中b代表塊設備,c代表字符設備。對于普通文件來說,ls -l會列出文件的長度,而對于設備文件來說,上面的7,5,4等代表的是對應設備的主設備號,而后面的0,1,2,10等則是對應設備的次設備號。那么主設備號和次設備號分別代表什么意義呢?一般情況下,可以這樣理解,主設備號標識設備對應的驅(qū)動程序,也就是說1個主設備號對應一個驅(qū)動程序。當然,現(xiàn)在也有多個驅(qū)動程序共享主設備號的情況。而次設備號有內(nèi)核使用,用于確定/dev下的設備文件對應的具體設備。舉一個例子,虛擬控制臺和串口終端有驅(qū)動程序4管理,而不同的終端分別有不同的次設備號。
1.1、設備編號的表達
在內(nèi)核中,dev_t用來保存設備編號,包括主設備號和次設備號。在2.6的內(nèi)核版本種,dev_t是一個32位的數(shù),其中12位用來表示主設備號,其余20位用來標識次設備號。
通過dev_t獲取主設備號和次設備號使用下面的宏:
MAJOR(dev_t dev);
MINOR(dev_t dev);
相反,通過主設備號和次設備號轉(zhuǎn)換為dev_t類型使用:
MKDEV(int major, int minor);
1.2、分配和釋放設備編號
在構建一個字符設備之前,驅(qū)動程序首先要獲得一個或者多個設備編號,這類似一個營業(yè)執(zhí)照,有了營業(yè)執(zhí)照才在內(nèi)核中正常工作營業(yè)。完成此工作的函數(shù)是:
int register_chrdev_region(dev_t first, unsigned int count, const char *name);
first是要分配的設備編號范圍的起始值。count是連續(xù)設備的編號的個數(shù)。name是和該設備編號范圍關聯(lián)的設備名稱,他將出現(xiàn)在/proc/devices和sysfs中。此函數(shù)成功返回0,失敗返回負的錯誤碼。此函數(shù)是在已知主設備號的情況下使用,在未知主設備號的情況下,我們使用下面的函數(shù):
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, const char* name);
dev用于輸出申請到的設備編號,firstminor要使用的第一個此設備編號。
在不使用時需要釋放這些設備編號,已提供其他設備程序使用:
void unregister_chrdev_region(dev_t dev, unsigned int count);
此函數(shù)多在模塊的清除函數(shù)中調(diào)用。
分配到設備編號之后,我們只是拿到了營業(yè)執(zhí)照,雖說現(xiàn)在已經(jīng)準備的差不多了,但是我們只是從內(nèi)核中申請到了設備號,應用程序還是不能對此設備作任何事情,我們需要一個簡單的函數(shù)來把設備編號和此設備能實現(xiàn)的功能連接起來,這樣我們的模塊才能提供具體的功能.這個操作很簡單,稍后就會提到,下一篇我們再來介紹幾個重要的數(shù)據(jù)結構。
評論
相關文章
好吊妞免费视频在线观看,久久亚洲国产人成综合网,久久精品国产2020,欧美精品综合在线
好吊操好吊妞在线观看妞 | 日韩一级毛欧美一级国产一级 | 亚洲理论欧美理论在线看 | 欧美亚洲尤物久久综合精品 | 日韩亚洲国产欧美在线 | 色婷婷在线播放看片 |