Làm thế nào để Linux kernel biết driver nào để nạp lúc khởi động?
Hạt nhân tạo sự kiện cho thiết bị, ví dụ: bus PCI khi chúng được cắm (hoặc nóng hoặc lạnh; các sự kiện được xếp hàng đợi cho đến khi không gian người dùng chạy AFAIR). udev sẽ nhận các sự kiện này và thực hiện các cuộc gọi modprobe bao gồm PID/VID (ID sản phẩm/nhà cung cấp) của (các) thiết bị; đây thường là một chuỗi với một số * trong đó. modprobe sau đó sẽ tính toán giao điểm của tập được biểu thị bằng ký tự đại diện yêu cầu tải của udev và tập hợp các bí danh của các mô-đun hạt nhân (bản thân chúng có thể là các ký tự đại diện).
Vì USB/Firewire/v.v. bộ điều khiển thường được gắn vào bus PCI, đó là cách trình điều khiển HCI của bạn được tải. Đó là cách mọi thứ trở lại; tải sau đó được thực hiện với USB/Firewire PID/VIDs của khóa học.
Mô-đun giao thức mạng (ví dụ: ipv6) tuy nhiên không được xử lý thông qua udev; thay vào đó, khi một chương trình gọi số socket(AF_INET6, ...)
hạt nhân gọi trực tiếp modprobe (chính xác hơn là: /proc/sys/kernel/modprobe
) với một bí danh không có ký tự đại diện, net-pf-10
trong trường hợp IPv6, vì AF_INET6
xảy ra có giá trị 10. modprobe sau đó tải ipv6.ko
, vì đó là những gì có bí danh net-pf-10
.
Tương tự đối với hệ thống tệp, cố gắng mount -t foo
cũng sẽ làm cho hạt nhân cũng gọi modprobe (lần nữa, thông qua ____call_usermodehelper
), lần này với số foo
làm đối số.
Truy cập các nút thiết bị (ví dụ: /dev/loop0
, miễn là nó tồn tại) có cùng một chiến lược nếu loop.ko
chưa được tải. Hạt nhân ở đây yêu cầu block-major-7-0
(vì loop0 thường có (7,0), xem ls -l
) và loop.ko
có bí danh block-major-7-*
phù hợp.
Nguồn
2011-12-12 04:46:21
Đoán đây sẽ là câu hỏi hay hơn cho http://unix.stackexchange.com. – ziesemer
http://doc.opensuse.org/documentation/html/openSUSE_113/opensuse-reference/cha.udev.html – firo