จากThe Linux Programming Interface , §14.1
ไฟล์อุปกรณ์แต่ละไฟล์มีหมายเลข ID หลักและหมายเลข ID รอง ID หลักระบุคลาสทั่วไปของอุปกรณ์และใช้โดยเคอร์เนลเพื่อค้นหาไดรเวอร์ที่เหมาะสมสำหรับอุปกรณ์ประเภทนี้ ID รองระบุอุปกรณ์เฉพาะภายในคลาสทั่วไป ID หลักและรองของไฟล์อุปกรณ์ถูกแสดงโดยคำสั่ง ls -l
[ ... ]
ไดรเวอร์อุปกรณ์แต่ละตัวลงทะเบียนการเชื่อมโยงกับ ID อุปกรณ์หลักที่เฉพาะเจาะจงและการเชื่อมโยงนี้ให้การเชื่อมต่อระหว่างไฟล์พิเศษของอุปกรณ์และอุปกรณ์ ชื่อของไฟล์อุปกรณ์ไม่มีความเกี่ยวข้องเมื่อเคอร์เนลค้นหาไดรเวอร์อุปกรณ์
โปรดดูบทเก่า (2001) ไดรเวอร์อุปกรณ์ Linux (2e)นี้ด้วย
เช่นความตั้งใจที่จะให้การทำแผนที่ที่ไม่ซ้ำกันของหลัก: รองลงไปที่อุปกรณ์: ตัวอย่างสำหรับอุปกรณ์แต่ละประเภท อย่างเคร่งครัดคุณสามารถมีสองอุปกรณ์ที่แตกต่างกันซึ่งมีอุปกรณ์หลัก: รองลงมาตราบใดที่อุปกรณ์ยังเป็นถ่านอยู่และหนึ่งคือบล็อก:
# 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 อื่น (แม้แต่การกระจายเคอร์เนลและฮาร์ดแวร์เดียวกัน) โปรดทราบว่าอุปกรณ์ตัวละครและบล็อกมีช่องว่างการกำหนดหมายเลขที่แตกต่างกันเช่น block Major 1 ถูกกำหนดให้กับดิสก์ RAM, Char Major 1 ถูกกำหนดให้กับชุดของอุปกรณ์เคอร์เนลรวมถึง null และศูนย์
ในอดีตวิชาเอกอุปกรณ์ (ส่วนใหญ่) ได้รับการจัดสรรแบบสแตติกผ่านรีจิสตรี (ยังคงมีอยู่แม้ว่าจะไม่ได้รับการแก้ไขในแหล่งเคอร์เนลDocumentation/devices.txt
) วันอุปกรณ์จำนวนมากเหล่านี้ได้รับการจัดสรรแบบไดนามิกนี้มีการจัดการโดยudev/proc/devices
และแมปสามารถดูได้ใน อุปกรณ์คงที่ยังคงอยู่ในincude/uapi/linux/major.h
(เพิ่งย้ายจากinclude/major.h
)
ในขณะนี้แม้ว่าชุดใหญ่: ชุดย่อยจะระบุอินสแตนซ์ของอุปกรณ์เฉพาะอย่างเจาะจง แต่ก็ไม่มีอะไรจะหยุดคุณสร้างโหนดอุปกรณ์ (ไฟล์) หลายอันที่อ้างถึงอุปกรณ์เดียวกัน พวกเขาไม่จำเป็นต้องสร้างใน/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 บางส่วนสามารถพบได้ในการนำเสนอBSDConของ Poul-Henning Kamp 2002 :
https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
หากคุณย้อนเวลากลับไปในปี 1978 (เอื้อเฟื้อโดย Alcatel-Lucent วารสารเทคนิคระบบกระดิ่งก.ค. - ส.ค. 2521) ระบบ ' Unix Time Sharing ' ระบุไว้อย่างชัดเจน (หน้า 1937):
อุปกรณ์ถูกกำหนดโดยหมายเลขอุปกรณ์หลักหมายเลขอุปกรณ์รองและคลาส (บล็อกหรืออักขระ) สำหรับแต่ละคลาสจะมีอาร์เรย์ของจุดเข้าในไดรเวอร์อุปกรณ์ หมายเลขอุปกรณ์หลักใช้สำหรับจัดทำดัชนีอาร์เรย์เมื่อเรียกใช้รหัสสำหรับไดรเวอร์อุปกรณ์เฉพาะ หมายเลขอุปกรณ์รองจะถูกส่งไปยังไดรเวอร์อุปกรณ์เป็นอาร์กิวเมนต์ จำนวนเล็กน้อยไม่มีความสำคัญอื่น ๆ นอกจากนั้นมาจากคนขับ โดยทั่วไปแล้วไดรเวอร์ใช้หมายเลขรองเพื่อเข้าถึงอุปกรณ์ทางกายภาพที่เหมือนกันหลายรายการ