(3)主次裝置號

2021-06-01 11:45:35 字數 2424 閱讀 4950

分配並註冊主次裝置號

在已有的/dev裝置中,可以用ls -l看其主次裝置號

裝置號是在驅動module中分配並註冊的,也就是說,驅動module擁有 這個裝置號(我的理解),而/dev目錄下的裝置檔案是根據這個裝置號建立的,因此,當訪問/dev目錄下的裝置檔案 時,驅動module就知道,自己該出場服務了(當然是由核心通知)。

在linux核心看來,主裝置號標識裝置對應的驅動程式,告訴linux核心 使用哪乙個驅動程式為該裝置(也就是/dev下的裝置檔案)服務;而次裝置號則用來標識具體且唯一的某個裝置。

在核心中,用dev_t型別(其實就是乙個32位的無符號整數)的變數來儲存裝置的主次裝置號,其中高12位表示主裝置號,低20位表示次裝置號。

裝置獲得主次裝置號有兩種方式:一種是手動給定乙個32位數,並將它與裝置聯絡起來(即用某個函式註冊);另一種是呼叫系統函式給裝置動態分配乙個主次設 備號。

對於手動給定乙個主次裝置號,使用以下函式:

intregister_chrdev_region(dev_t         first, 

unsigned int -count, 

char          *name)

其中first是我們手動給定的裝置號,count是所請求的連續裝置號的個數,而name是和該裝置號範圍關聯的裝置名稱,它將出現在/proc /devices和sysfs中。

比如,若first為0x3ffff0,count為0x5,那麼該函式就會為5個裝置註冊裝置號,分別是0x3ffff0、 0x3ffff1、 0x3ffff2、 0x3ffff3、 0x3ffff4,其中0x3(高12位)為這5個裝置所共有的主裝置號(也就是說這5個裝置都使用同乙個驅動程式)。而0xffff0、 0xffff1、 0xffff2、 0xffff3、 0xffff4就分別是這5個裝置的次裝置號了。需要注意的是,若count的值太大了,那麼所請求的裝置號範圍可能會和下乙個主裝置號重疊。比如若 first還是為0x3ffff0,而count為0x11,那麼first+count=0x400001,也就是說為最後兩個裝置分配的主裝置號已經 不是0x3,而是0x4了!用這種方法註冊裝置號有乙個缺點,那就是若該驅動module被其他人廣泛使用,那麼無法保證註冊的裝置號是其他人的 linux系統中未分配使用的裝置號。

對於動態分配裝置號,使用以下函式:

intalloc_chrdev_region(dev_t         *dev, 

unsigned int 

-firstminor, 

unsigned int 

-count, 

char          *name)

該函式需要傳遞給它指定的第乙個次裝置號firstminor(一般為0)和要分配的裝置數count,以及裝置名,呼叫該函式後自動分配得到的裝置號保 存在dev中。動態分配裝置號可以避免手動指定裝置號時帶來的缺點,但是它卻也有自己的缺 點,那就是無法預先在/dev下建立裝置節點,因為動態分配裝置號不能保證在每次載入驅動module時始終一致(其實 若在兩次載入同乙個驅動module之間並沒有載入其他的module,那麼自動分配的裝置號還是一致的,因為核心分配裝置號並不是隨機的,但是書上說某 些核心開發人員預示不久的將來會用隨機方式進行處理),不過,這個缺點可以避免,因為在載入驅動module後,我們可以讀取/proc/devices 檔案以獲得linux核心分配給該裝置的主裝置號。

與主次裝置號相關的3個巨集:

major(dev_t dev):根據裝置號dev獲得主裝置號;

minor(dev_t dev):根據裝置號dev獲得次裝置號;

mkdev(int major, int minor):根據主裝置號major和次裝置號minor構建裝置號。

linux下的裝置在/dev/目錄下一般會有相對應的節點,關於裝置號有如下的言論:

主裝置號被系統用來確定驅動程式,次裝置號被驅動程式用來確定具體的裝置。

像如下的兩個字元裝置節點:

crw-r--r--  1 root root 

254, 

0jan  9 13:14 /dev/nx_ids

crw-r--r--  1 root root 

254, 

99jan  9 13:14 /dev/nx_ips

它們的主裝置號都是254,當使用者**開啟這兩個裝置的時候,系統會定位到同乙個驅動程式,並呼叫其open函式。那麼驅動程式怎麼知道使用者開啟的是哪一 個裝置呢?就是根據次裝置號來判斷的。

int my_drv_open(struct inode *inode, struct file *filp)

else if (99 == minor(inode->i_rdev))

return 0;

}在include/linux/kdev_t.h檔案中可以看到操作裝置號的方法

Linux的主次裝置號

在linux核心中,主裝置號標識裝置對應的驅動程式,告訴linux核心使用哪乙個驅動程式為該裝置 也就是 dev下的裝置檔案 服務 而次裝置號則用來標識具體且唯一的某個裝置。比如說在linux的終端打入命令 root node1 ll dev sd brw rw 1 root disk 8,0 fe...

主裝置號和次裝置號

上圖中,紅色方塊內為裝置的主裝置號,黃色方塊內為裝置的次裝置號。主裝置號是表示系統訪問這個裝置的 核心驅動 驅動程式是unix系統核心 中的一部分,其作用是用來控制一種特殊裝置的輸入輸出。大多數的unix系統都有多種裝置驅動程式,每乙個裝置檔名中的主裝置號就代表這個裝置使用的是哪個裝置驅動程式。次裝...

linux主裝置號和從裝置號

裝置號是在驅動module中分配並註冊的,也就是說,驅動module擁有這個裝置號 我的理解 而 dev目錄下的裝置檔案是根據這個裝置號建立的,因此,當訪問 dev目錄下的裝置檔案時,驅動module就知道,自己該出場服務了 當然是由核心通知 在linux核心看來,主裝置號標識裝置對應的驅動程式,告...