歡迎您光臨本站 註冊首頁

linux device driver module 預設是如何自動載入的

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

經常發現,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