มีความสำคัญรองลงมาคือจำนวนเฉพาะ


11

เป็น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 

maj เป็นฮาร์ดแวร์ส่วนย่อยเป็นส่วนย่อยของฮาร์ดแวร์หลัก
Kiwy

คำตอบ:


20

จาก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):

อุปกรณ์ถูกกำหนดโดยหมายเลขอุปกรณ์หลักหมายเลขอุปกรณ์รองและคลาส (บล็อกหรืออักขระ) สำหรับแต่ละคลาสจะมีอาร์เรย์ของจุดเข้าในไดรเวอร์อุปกรณ์ หมายเลขอุปกรณ์หลักใช้สำหรับจัดทำดัชนีอาร์เรย์เมื่อเรียกใช้รหัสสำหรับไดรเวอร์อุปกรณ์เฉพาะ หมายเลขอุปกรณ์รองจะถูกส่งไปยังไดรเวอร์อุปกรณ์เป็นอาร์กิวเมนต์ จำนวนเล็กน้อยไม่มีความสำคัญอื่น ๆ นอกจากนั้นมาจากคนขับ โดยทั่วไปแล้วไดรเวอร์ใช้หมายเลขรองเพื่อเข้าถึงอุปกรณ์ทางกายภาพที่เหมือนกันหลายรายการ


เราสามารถมีอุปกรณ์สองเครื่องที่มีคู่หรือMAJ:Minหมายเลขเดียวกัน
Dipak Ingole

1
ใช่ด้วยข้อ จำกัด Updated
mr.spuratic

2

เมื่อแฟ้มอุปกรณ์ถูกสร้างขึ้นโดยmknodeที่majorและminorตัวเลขจะมา นี่คือวิธีที่ Linux ระบุอุปกรณ์ฮาร์ดแวร์พื้นฐานที่เกี่ยวข้องกับไฟล์อุปกรณ์ ในกรณีส่วนใหญ่majorหมายเลขจะระบุไดรเวอร์ในขณะที่minorอุปกรณ์ต่าง ๆ ที่ไดรเวอร์ควบคุมแตกต่างกัน

ดังนั้นหมายเลขดังกล่าวจะต้องไม่ซ้ำกันสำหรับแต่ละอุปกรณ์หรือเป็นไปไม่ได้ที่จะสร้างไฟล์อุปกรณ์ที่ถูกต้องสำหรับพวกเขาทั้งหมด


0

ไม่บน Linux มันไม่ได้มีความโดดเด่นเสมอไป

ลีนุกซ์กำลังใช้devptsระบบไฟล์เสมือนเพื่อจัดหา pseudoterminals (ptys), และระบบไฟล์เสมือนนั้นสามารถติดตั้งได้มากกว่าหนึ่งครั้งและในที่ต่าง ๆ , ซึ่งเป็นประโยชน์เมื่อตั้งค่า chroots หรือเนมสเปซคอนเทนเนอร์. ในขณะที่major:minortuple นั้นไม่เหมือนใครในdevptsอินสแตนซ์ของระบบไฟล์ แต่มันก็ไม่ซ้ำกันในระบบที่ใช้งาน:

# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   34:3
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   35:3

ในตัวอย่างข้างต้นscript(1)คำสั่งจะสร้างเทอร์มินัลเทียมและรันเชลล์ภายใน เห็นได้ชัดว่าแช่งหลอก - เทอร์มินัลที่สร้างขึ้นโดยscriptกระบวนการแรกนั้นไม่เหมือนกับที่สร้างโดยครั้งที่สอง แต่พวกเขาก็มีชื่อและหมายเลขรองที่สำคัญเหมือนกัน

ในการระบุ pseudoterminal ที่ไม่ซ้ำกันคุณจะต้องใช้สิ่งdevice:inodeอันดับของพวกเขาหรือรวมหมายเลขอุปกรณ์ (ของระบบไฟล์ devpts) เข้าด้วยmajor:minorกัน ปัญหาคือว่าฟิลด์ "tty" ของ/proc/PID/stat(ที่ 7 ดูproc(5)manpage; นั่นคือสิ่งที่เครื่องมือเช่นlsofหรือpsรับข้อมูลจาก) มีเพียงst_rdevของ tty (ที่บรรจุmajor:minor); หากเป็นทาสของ pty จะไม่มีการบ่งชี้devptsระบบไฟล์ที่ให้ไว้ ปัญหาเดียวกันส่งผลกระทบต่อหมายเลขอุปกรณ์ที่สามารถใช้ได้กับTIOCGDEVioctl

AFAICS ไม่มีวิธีที่เชื่อถือได้ในการระบุเทอร์มินัลการควบคุมของกระบวนการบน Linux การแก้ไขและข้อเสนอแนะเป็นอย่างอื่นยินดีต้อนรับ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.