經常發現,udev中並沒有指定許多驅動/設備的載入規則,但udev卻能在設備插入系統后 正確的載入其驅動,仔細分析后,發現事情原來是這樣的. 1,udev 預設rule的忽略 fedora 6中的/etc/udev/rules.d/50-udev.rules有如下一個規則: ACTION=="add", SUBSYSTEM=="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe $env{MODALIAS}". 表示系統發生一個add event,並且產生event的device對應的SUBSYSTEM和MODALIAS key均 包含至少一個字元的字元串時候,執行 /sbin/modprobe $env{MODALIAS} $env{MODALIAS}就是匹配規則中的key MODALIAS的值. 可以看出這個規則非常容易匹配,可以理解為 一個預設的規則。 另外,udev規定多個規則都可匹配的話, 每個匹配規則對應的動作都會執行. 2,modules.alias是如何生成的 /lib/modules/KERNEL_VERSION/modules.alias文件內容格式如下: ... alias pci:v00001412d00001712sv*sd*bc*sc*i* snd-ice1712 ... alias usb:v*p*d*dc*dsc*dp*ic01isc01ip* snd-usb-audio alias usb:v*p*d*dc*dsc*dp*ic01isc03ip* snd-usb-audio ... make modules 的modpost階段,會調用modpost工具從.ko的elf格式 中找到類似信息,並生成modules.alias文件. module 源碼一般通過 MODULE_DEVICE_TABLE (type,table) 定義相應的數據信息,type表示pci/usb/ieee1394/pcmcia/...等 設備類型,table則定義了module所匹配的此種類型的哪些具體設備, 一般不同類型的設備有不同的匹配結構,比如usb的匹配結構為struct usb_device_id類型,pci設備為 struct pci_device_id,等等. 一般來說,不同類型的設備,定義了不同的匹配結構,因此生成的 module alias的格式也不同. 一個module的MODULE_DEVICE_TABLE (type,table) 中的table有多少個元素,該module就會生成多少個對應的module alias,這些 module alias都對應該module 的名稱. 每種類型的module alias的格式一樣, ":"前為類型名稱(usb/pci/...),":"后和具體類型相關,但格式均為: key_namekey_value|key_namekey_value|key_namekey_value|... key_name為某個id的名稱,key_value為匹配的值(*表示任意值). 3,sysfs中的modalias信息 sysfs中的modalias屬性一般由設備所在的bus驅動來提供介面並生成. 比如: [root@localhost /]# find /sys/devices -name modalias /sys/devices/pci0000:00/0000:00:12.0/modalias /sys/devices/pci0000:00/0000:00:11.0/modalias /sys/devices/pci0000:00/0000:00:10.0/modalias /sys/devices/pci0000:00/0000:00:0f.0/modalias /sys/devices/pci0000:00/0000:00:07.3/modalias /sys/devices/pci0000:00/0000:00:07.2/usb1/1-1/1-1:1.1/modalias /sys/devices/pci0000:00/0000:00:07.2/usb1/1-1/1-1:1.0/modalias /sys/devices/pci0000:00/0000:00:07.2/usb1/1-0:1.0/modalias /sys/devices/pci0000:00/0000:00:07.2/modalias /sys/devices/pci0000:00/0000:00:07.1/ide1/1.0/modalias /sys/devices/pci0000:00/0000:00:07.1/modalias /sys/devices/pci0000:00/0000:00:07.0/modalias /sys/devices/pci0000:00/0000:00:01.0/modalias /sys/devices/pci0000:00/0000:00:00.0/modalias /sys/devices/platform/bluetooth/modalias /sys/devices/platform/floppy.0/modalias /sys/devices/platform/i8042/serio1/modalias /sys/devices/platform/i8042/serio0/modalias /sys/devices/platform/i8042/modalias /sys/devices/platform/serial8250/modalias /sys/devices/platform/vesafb.0/modalias /sys/devices/platform/pcspkr/modalias 4,驅動載入的完整過程 1),設備插入系統,設備所在的bus調用device driver model介面生成 netlink event,event包含了modalias key以及對應的值; 2),udevd接收到內核發來的netlink event,根據默認的匹配規則發現有 匹配的項,於是就執行對應的動作: /sbin/modprobe $env{MODALIAS} $env{MODALIAS}和/lib/modules/KERNEL_VERSION/modules.alias中的某行 所匹配,於是就相當於modprobe module_name,載入了對應的模塊.
[火星人
]
linux device driver module 預設是如何自動載入的 已經有1474 次圍觀
本文地址: http://coctec.com/docs/linux/show-post-187845.html