主編號(major)與次編號(minor)
字元裝置的存取是透過他在檔案系統上的名稱;這些名稱稱為特殊檔(special file)、裝置檔(device file)、或檔案系統樹的節點(node);不管哪一種說法,意義都是一樣的。照慣例,特殊檔是集中在/dev目錄之下。字元裝置的特殊檔,ls -l的輸出訊息中的第一欄,會出現c字樣。區塊裝置的特殊檔也是集中在/dev/,但是它們是被標示為b。
再仔細觀察ls -l /dev的輸出,可以發現在日期欄之前發現兩個以逗號隔開的數值,由左而右,它們依序是該裝置的"主編號"(major number)與次編號(minor number);這兩者合稱"裝置編號"。就下列例子而言,這些裝置的主編號包括了1,10,14,29,248。而次編號有0,7,9,13,61,100,228,229。
crw-rw----+ 1 root audio 14, 9 2月 16 09:07 dmmidi
drwxr-xr-x 2 root root 100 2月 16 09:07 dri
crw------- 1 root root 10, 61 2月 16 09:07 ecryptfs
crw-rw---- 1 root video 29, 0 2月 16 09:07 fb0
lrwxrwxrwx 1 root root 13 2月 16 09:07 fd -> /proc/self/fd
crw-rw-rw- 1 root root 1, 7 2月 16 09:07 full
crw-rw-rw- 1 root root 10, 229 2月 16 09:07 fuse
crw------- 1 root root 248, 0 2月 16 09:07 hidraw0
crw------- 1 root root 10, 228 2月 16 09:07 hpet
傳統上,"主編號"代表裝置所配合驅動程式。例如,/dev/ecryptfs與/dev/hpet都是由driver 10所控管。現在的核心容許多個驅動程式共用同一個主編號,但是大多數裝置仍遵守一個主編號對應一個驅動程式。
"次編號"是讓核心用來表示被指稱的裝置個體。你的驅動程式可直接由核心取得一個指向目標裝置的指標,或者,也可以將次編號當成一個區域性的裝置陣列的索引,不管哪一種方式,核心只知道一項事實:次編號代表你的驅動程式實作的裝置,除此之外,核心對次編號的意義一無所知。
裝置編號內部表示法
主編號與次編號兩者合稱"裝置編號",在核心內部,是以dev_t型別(定義於linux/type.h)來表示裝置編號,包括個別的主編號與次編號ˇ。dev_t是一個32bit無號數,其中12bit是主編號,20bit是次編號。不過,你的程式不應該假裝裝置編號的內部組織格式,而應該借用
MAJOR(dev_t dev);
MINOR(dev_t dev);
上述兩個巨集可從一個裝置編號中抽離出主編號與次編號,展開後的資料行別依然是dev_t。相反地,若你有主次編號(兩個int),要將他們併為一個dev_t,請使用:
MKDEV(int major,int minor);
請注意,舊版核心有255個主編號與255個次編號限制,但2.6版核心可以收納很大量的裝置。