日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

主设备号与次设备号以及申请

發(fā)布時間:2023/12/20 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 主设备号与次设备号以及申请 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一個字符設備或者塊設備都有一個主設備號和次設備號。主設備號和次設備號統(tǒng)稱為設
備號。主設備號用來表示一個特定的驅(qū)動程序。次設備號用來表示使用該驅(qū)動程序的各
設備。例如一個嵌入式系統(tǒng),有兩個LED指示燈,LED燈需要獨立的打開或者關閉。那么
,可以寫一個LED燈的字符設備驅(qū)動程序,可以將其主設備號注冊成5號設備,次設備號
分別為1和2。這里,次設備號就分別表示兩個LED燈。
1.主設備號和次設備號的表示
在Linux內(nèi)核中,dev_t類型用來表示設備號。在Linux 2.6.29.4中,dev_t定義為一個
無符號長整型變量,如下:typedef u_long dev_t;
u_long在32位機中是4個字節(jié),在64位機中是8字節(jié)。以32位機為例,其中高12表示主設備號,低20為表示次設備號,如圖6.1所示。
2.主設備號和次設備號的獲取
為了寫出可移植的驅(qū)動程序,不能假定主設備號和次設備號的位數(shù)。不同的機型中,主
設備號和次設備號的位數(shù)可能是不同的。應該使用MAJOR宏得到主設備號,使用MINOR宏來得到次設備號。下面是兩個宏的定義:
#define MINORBITS? ?20? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? /*次設備號位數(shù)*/
#define MINORMASK? ?((1U << MINORBITS) - 1)? ?? ?? ?? ? /*次設備號掩碼*/
#define MAJOR(dev)??((unsigned int) ((dev) >> MINORBITS))
/*dev右移20位得到主設備號*/?
#define MINOR(dev)((unsigned int) ((dev) & MINORMASK))
? ?/*與次設備掩碼與,得到次設備號*/
MAJOR宏將dev_t向右移動20位,得到主設備號;MINOR宏將dev_t的高12位清零,得到次
設備號。相反,可以將主設備號和次設備號轉(zhuǎn)換為設備號類型(dev_t),使用宏
MKDEV可以完成這個功能。#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))??
MKDEV宏將主設備號(ma)左移20位,然后與次設備號(mi)相與,得到設備號。
3.靜態(tài)分配設備號
靜態(tài)分配設備號,就是驅(qū)動程序開發(fā)者,靜態(tài)地指定一個設備號。對于一部分常用的設
備,內(nèi)核開發(fā)者已經(jīng)為其分配了設備號。這些設備號可以在內(nèi)核源碼documentation/
devices.txt文件中找到。如果只有開發(fā)者自己使用這些設備驅(qū)動程序,那么其可以選
擇一個尚未使用的設備號。在不添加新硬件的時候,這種方式不會產(chǎn)生設備號沖突。但
是當添加新硬件時,則很可能造成設備號沖突,影響設備的使用。
4.動態(tài)分配設備號
由于靜態(tài)分配設備號存在沖突的問題,所以內(nèi)核社區(qū)建議開發(fā)者使用動態(tài)分配設備號的
方法。動態(tài)分配設備號的函數(shù)是alloc_chrdev_region()。
5.查看設備號
當靜態(tài)分配設備號時,需要查看系統(tǒng)中已經(jīng)存在的設備號,從而決定使用哪個新設備號
。可以讀取/proc/devices文件獲得設備的設備號。/proc/devices文件包含字符設備和
塊設備的設備號,如下所示。[root@tom /]# cat /proc/devices /*cat命令查看
/proc/devices文件的內(nèi)容*/??Character devices:? ?? ?? ?? ?? ?? ?/*字符設備*/
1 mem? ? 4 /dev/vc/0? ? 7 vcs? ? 13 input? ? 14 sound? ? 21 sg??Block
devices:??/*塊設備*/? ? 1 ramdisk? ? 2 fd? ? 8 sd? ? 253??device-mapper? ? 254 mdp?? 
3. 6.1.3 申請和釋放設備號
 內(nèi)核維護著一個特殊的數(shù)據(jù)結構,用來存放設備號與設備的關系。在安裝設備時,應該
給設備申請一個設備號,使系統(tǒng)可以明確設備對應的設備號。設備驅(qū)動程序中的很多功
能,是通過設備號來操作設備的。下面,首先對申請設備號進行簡述。
1.申請設備號
在構建字符設備之前,首先要向系統(tǒng)申請一個或者多個設備號。完成該工作的函數(shù)是
register_chrdev_region(),該函數(shù)在<fs/char_dev.c>中定義:
int register_chrdev_region(dev_t from, unsigned count, const char *name);
其中,from是要分配的設備號范圍的起始值。一般只提供from的主設備號,from的次設
備號通常被設置成0。count是需要申請的連續(xù)設備號的個數(shù)。最后name是和該范圍編號
關聯(lián)的設備名稱,該名稱不能超過64字節(jié)。
和大多數(shù)內(nèi)核函數(shù)一樣,register_chrdev_region()函數(shù)成功時返回0。錯誤時,返回
一個負的錯誤碼,并且不能為字符設備分配設備號。下面是一個例子代碼,其申請了
CS5535_GPIO_COUNT個設備號。retval = register_chrdev_region(dev_id,
CS5535_GPIO_COUNT,NAME);
在Linux中有非常多的字符設備,在人為的為字符設備分配設備號時,很可能發(fā)生沖突
。Linux內(nèi)核開發(fā)者一直在努力將設備號變?yōu)閯討B(tài)的。可以使用
alloc_chrdev_region()函數(shù)達到這個目的。
int alloc_chrdev_region(dev_t *dev, unsigned baseminor,unsigned count, const char *name)
在上面的函數(shù)中,dev作為輸出參數(shù),在函數(shù)成功返回后將保存已經(jīng)分配的設備號。函
數(shù)有可能申請一段連續(xù)的設備號,這是dev返回第一個設備號。baseminor表示要申請的
第一個次設備號,其通常設為0。count和name與register_chrdev_region()函數(shù)的對應
參數(shù)一樣。count表示要申請的連續(xù)次設備號個數(shù),name表示設備的名字。下面是一個例
子代碼,其申請了CS5535_GPIO_COUNT個次設備號。retval =
alloc_chrdev_region(&dev_id, 0, CS5535_GPIO_COUNT, NAME);
2.釋放設備號
使用上面兩種方式申請的設備號,都應該在不使用設備時,釋放設備號。設備號的釋放
統(tǒng)一使用下面的函數(shù):void unregister_chrdev_region(dev_t from, unsignedcount);
在上面這個函數(shù)中,from表示要釋放的設備號,count表示從from開始要釋放的次設備號

個數(shù)。通常,在模塊的卸載函數(shù)中調(diào)用unregister_chrdev_region()函數(shù)。


總結

以上是生活随笔為你收集整理的主设备号与次设备号以及申请的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。