我的位置: 首頁 > 學習專區 > 網絡工程 > Linux設備驅動:如何寫字符設備驅動(1)

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

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