Hardware

主要、次要編號是否唯一

  • September 23, 2020

major, minor號碼是唯一的嗎?

我們有任何引用和參考嗎?

NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0 465.8G  0 
├─sda1   8:1    0 298.2M  0 
├─sda2   8:2    0     3G  0 
├─sda3   8:3    0 458.7G  0 /
├─sda4   8:4    0     1K  0 
└─sda5   8:5    0   3.8G  0 
sr0     11:0    1  1024M  0 

來自Linux 程式介面,§14.1

每個設備文件都有一個主 ID 號和一個次 ID 號。主要 ID 標識設備的一般類別,核心使用它來查找此類設備的適當驅動程序。次要 ID 唯一標識通用類中的特定設備。設備文件的主要和次要 ID 由 ls -l 命令顯示。

$$ … $$ 每個設備驅動程序註冊其與特定主要設備 ID 的關聯,並且該關聯提供設備專用文件和設備之間的連接。核心查找設備驅動程序時,設備文件的名稱沒有關聯。

另請參見舊的 (2001) Linux 設備驅動程序(2e) 章節

即,目的是為每種類型的設備提供major:minor 到device:instance 的唯一映射。嚴格來說,你可以有兩個不同的設備具有相同的主要:次要,只要一個是 char 和一個是塊:

# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan  1  1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan  1  1970 /dev/ram1

在 Linux 上,在一個系統上的任何時間點,**每種設備的主要:次要編號都是唯一的。然而,這些數字可能會隨著時間而變化,並且在不同的 Linux 系統(即使是相同的發行版、核心和硬體)上不必相同。請注意,字元設備和塊設備具有不同的編號空間,例如,塊主設備 1 分配給 RAM 磁碟,字元主設備 1 分配給一組核心設備,包括 null 和零。

歷史上,設備專業(大部分)是通過系統資料庫靜態分配的(在核心原始碼中仍然存在,但未維護)。如今,許多設備都是動態分配的,由udev管理,映射可在. 固定設備仍然存在(最近從)Documentation/devices.txt``/proc/devicesincude/uapi/linux/major.hinclude/major.h

現在雖然major:minor 組合唯一地標識了特定的設備實例,但沒有什麼可以阻止您創建引用同一設備的多個設備節點(文件)。它們甚至不必在其中創建/dev(但它們必須位於支持創建設備節點的文件系統上,並且不使用該nodev選項掛載)。

一個常見的用途是在 chroot 中創建重複的零、空和隨機設備:

# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c | 
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero

名稱只是別名,核心並不關心大多數名稱或位置,它關心主編號以便它可以選擇正確的驅動程序,而驅動程序(通常)關心次要編號以便它可以選擇正確的實例。

大多數名稱都是簡單的約定(儘管有些是由 POSIX 定義的)。另請注意,一個設備可能會註冊多個主要號碼,請檢查sd驅動程序/proc/devices;驅動模組名稱(.ko)不必與設備名稱相同,也不必與 中的設備節點相同,/dev單個驅動模組可以管理多個邏輯/物理設備或設備名稱。


回顧一下:您可能有兩個或多個設備節點(在/dev/或其他地方)具有相同的主要:次要編號,但如果它們是相同的類型,則它們指的是相同的設備。您可以擁有一個可以處理多個主要實例的驅動程序,但在核心和驅動程序中,對於每種類型(字元或塊),主要:次要編號用於引用特定設備(主要)和特定實例(次要)的設備。

您不能擁有兩個具有相同類型和主要:次要的設備節點,並期望它們訪問兩個不同的邏輯或物理設備。當設備被訪問時,核心根據類型和主設備號(而不是設備節點名稱)選擇一個驅動程序,按照慣例,次設備號確定性地選擇一個特定的實例或子功能。


更新 一些有趣的歷史和一些 *BSD 觀點可以在 Poul-Henning Kamp 的 2002 BSDCon展示中找到: https ://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

如果你回到 1978 年(由 Alcatel-Lucent,貝爾系統技術期刊1978 年 7 月至 8 月提供),“ Unix 時間共享系統”清楚地說明了它(p1937):

設備由主設備號、次設備號和類(塊或字元)來表徵。對於每個類,設備驅動程序都有一組入口點。主設備號用於在呼叫特定設備驅動程序的程式碼時對數組進行索引。次要設備號作為參數傳遞給設備驅動程序。次要號碼除了由驅動程序賦予它的意義外,沒有任何意義。通常,驅動程序使用次要編號來訪問幾個相同的物理設備之一。

引用自:https://unix.stackexchange.com/questions/124225