Từ Giao diện lập trình Linux , §14.1
Mỗi tệp thiết bị có một số ID chính và một số ID phụ. ID chính xác định lớp chung của thiết bị và được nhân sử dụng để tra cứu trình điều khiển thích hợp cho loại thiết bị này. ID phụ xác định duy nhất một thiết bị cụ thể trong một lớp chung. ID chính và phụ của tệp thiết bị được hiển thị bằng lệnh ls -l.
[...]
Mỗi trình điều khiển thiết bị đăng ký liên kết của nó với một ID thiết bị chính cụ thể và liên kết này cung cấp kết nối giữa tệp đặc biệt của thiết bị và thiết bị. Tên của tệp thiết bị không có liên quan khi kernel tìm trình điều khiển thiết bị.
Xem thêm chương Trình điều khiển thiết bị Linux (2e) cũ (2001) này .
tức là ý định là cung cấp một ánh xạ duy nhất của chính: phụ cho thiết bị: ví dụ cho từng loại thiết bị. Nghiêm túc, bạn có thể có hai thiết bị riêng biệt có cùng một chính: thứ yếu, miễn là một là char và một là khối:
# 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
Trên Linux, tại bất kỳ thời điểm nào trên một hệ thống, số chính: số phụ cho mỗi loại thiết bị là duy nhất. Tuy nhiên, các con số có thể thay đổi theo thời gian và không cần phải giống nhau trên các hệ thống Linux khác nhau (ngay cả cùng phân phối, nhân và phần cứng). Lưu ý rằng các thiết bị ký tự và khối có không gian đánh số riêng biệt, ví dụ: khối chính 1 được gán cho các đĩa RAM, char Major 1 được gán cho một bộ thiết bị kernel bao gồm null và zero.
Các chuyên ngành thiết bị trong lịch sử (hầu hết) được phân bổ tĩnh thông qua một sổ đăng ký (vẫn còn hiện diện, mặc dù không rõ ràng, trong nguồn kernel Documentation/devices.txt
). Ngày nay, nhiều thiết bị được phân bổ động, điều này được quản lý bởi udev và ánh xạ có thể xem được /proc/devices
. Các thiết bị cố định vẫn tồn tại incude/uapi/linux/major.h
(được chuyển từ gần đây include/major.h
)
Bây giờ mặc dù kết hợp chính: nhỏ xác định duy nhất các trường hợp thiết bị cụ thể, không có gì ngăn bạn tạo nhiều nút thiết bị (tệp) tham chiếu đến cùng một thiết bị. Chúng thậm chí không phải được tạo trong /dev
(nhưng chúng phải nằm trên một hệ thống tệp hỗ trợ tạo các nút thiết bị và không được gắn với nodev
tùy chọn).
Một cách sử dụng phổ biến là tạo các thiết bị ngẫu nhiên zero, null và ngẫu nhiên trong một 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
Tên chỉ là bí danh, kernel không quan tâm nhiều đến hầu hết tên hoặc địa điểm, nó quan tâm đến số chính để nó có thể chọn trình điều khiển chính xác và trình điều khiển (thường) quan tâm đến số phụ để nó có thể chọn ví dụ đúng.
Hầu hết các tên chỉ đơn giản là quy ước (mặc dù một số được định nghĩa bởi POSIX ). Cũng lưu ý rằng một thiết bị có thể đăng ký nhiều số chính, kiểm tra sd
trình điều khiển trong /proc/devices
; tên mô-đun trình điều khiển ( .ko
) không cần giống với tên thiết bị và không cần giống với nút thiết bị /dev
và một mô-đun trình điều khiển duy nhất có thể quản lý nhiều thiết bị logic / vật lý hoặc tên thiết bị.
Tóm tắt lại: bạn có thể có hai hoặc nhiều nút thiết bị (trong /dev/
hoặc ở nơi khác) có cùng số chính: số phụ, nhưng nếu chúng cùng loại thì chúng tham chiếu đến cùng một thiết bị. Bạn có thể có một trình điều khiển có thể xử lý nhiều phiên bản chính, nhưng trong nhân và trong trình điều khiển, đối với mỗi loại (char hoặc khối), số chính: số phụ được lấy để chỉ một thiết bị cụ thể (chính) và một phiên bản cụ thể ( nhỏ) của thiết bị.
Bạn không thể có hai nút thiết bị có cùng loại và chính: phụ và mong muốn chúng truy cập hai thiết bị logic hoặc vật lý khác nhau. Khi một thiết bị đang được truy cập, nhân chọn một trình điều khiển dựa trên loại và số chính (và không dựa trên tên nút của thiết bị) và theo quy ước, số phụ sẽ xác định chọn một thể hiện hoặc chức năng phụ cụ thể.
Cập nhật
Một số lịch sử thú vị và một số phối cảnh * BSD có thể được tìm thấy trong bài thuyết trình BSDCon năm 2002 của Poul-Henning Kamp :
https://www.usenix.org/legacy/events/bsdcon/full_ con / kamp / kamp_html /
Nếu bạn quay ngược thời gian về năm 1978 (với sự cho phép của Alcatel-Lucent, Tạp chí kỹ thuật hệ thống Bell tháng 7-8 / 1978), ' Hệ thống chia sẻ thời gian Unix ' sẽ nêu rõ (tr1937):
Các thiết bị được đặc trưng bởi một số thiết bị chính, một số thiết bị phụ và một lớp (khối hoặc ký tự). Đối với mỗi lớp, có một loạt các điểm vào trình điều khiển thiết bị. Số thiết bị chính được sử dụng để lập chỉ mục mảng khi gọi mã cho trình điều khiển thiết bị cụ thể. Số thiết bị nhỏ được truyền cho trình điều khiển thiết bị làm đối số. Số phụ không có ý nghĩa gì khác ngoài số được quy cho nó bởi người lái xe. Thông thường, trình điều khiển sử dụng số phụ để truy cập một trong một số thiết bị vật lý giống hệt nhau.