momo zone

调核人的blog

module 自动加载也是过啊

上了 kernel 2.6.32 后自动又加上了rtl8187 这个模块,当然依旧没有解决速率控制的BUG 导致连接后无法收发包,换回r8187l吧。

不过这里我还是想同时保留rtl8187 而且能够随时进行切换到r8187l.不管怎样先把编译过的r8187l.ko copy到/lib/module/`uname -r`/kernel/driver/net/wirless/r8187 中作为一个独立的存在,再运行一下depmod -a 重新刷新系统中的模块设定。(其实就是更新modules.alias和modules.dep)

其实boot过程中自动加载module的流程很简单:

首先 执行rc.d 中的udev初始化脚并启动udevd

然后 udevd在接收到kernel 发出的hotplug 消息后刷/sys 目录(由kernel 生成),发现有新的项就调用/etc/udev/rules.d 中的规则进行处理。

最后 udev调用modprobe 加载driver。
而modprobe 是如何自动找到对应设备的driver的呢?

关键在于/lib/module/`uname -r`/modprobe.alias 文件中

该文件使用一定的匹配模式依赖vendor id 和product id 来匹配驱动模块(*.ko),取得后再以来/lib/module/`uname -r`/modprobe.dep 获得依赖模块进行加载。

先看modules.alias

alias usb:v114Bp0150d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0DF6p0028d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0DF6p000Dd*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v03F0pCA02d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0846p4260d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0846p6A00d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0846p6100d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0789p010Cd*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0769p11F2d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0BDAp8198d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0BDAp8197d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0BDAp8189d*dc*dsc*dp*ic*isc*ip* rtl8187
#alias usb:v0BDAp8187d*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v050Dp705Ed*dc*dsc*dp*ic*isc*ip* rtl8187
alias usb:v0B05p171Dd*dc*dsc*dp*ic*isc*ip* rtl8187

其中第一列不做解释了就是alias,意思是别名,其实就是作对应关系。

第二列是总线类型(asus P5B-Deluex 的wifi 其实是usb)。

第三列是关键用来为modprobe提供自动匹配的依据, vXXXX :vendor id XXXX 四位16进制代码,pXXXX:product id XXXX 后面还有一些主要是subVendorID,subProductID .

第四列是内核模块名称

那么第二列的数据怎么获得呢 ,否则我无法注释掉来改模块。

很简单,用lshal 来查:

udi = ‘/org/freedesktop/Hal/devices/usb_device_bda_8187_0015AF048F06’
  info.linux.driver = ‘usb’  (string)
  info.parent = ‘/org/freedesktop/Hal/devices/usb_device_1d6b_2_0000_00_1a_7’  (string)
  info.product = ‘RTL8187 Wireless Adapter’  (string)
  info.subsystem = ‘usb_device’  (string)
  info.udi = ‘/org/freedesktop/Hal/devices/usb_device_bda_8187_0015AF048F06’  (string)
  info.vendor = ‘Realtek Semiconductor Corp.’  (string)
  linux.device_file = ‘/dev/bus/usb/001/003’  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = ‘usb’  (string)
  linux.sysfs_path = ‘/sys/devices/pci0000:00/0000:00:1a.7/usb1/1-3’  (string)
  usb_device.bus_number = 1  (0x1)  (int)
  usb_device.can_wake_up = false  (bool)
  usb_device.configuration = ‘Wireless Network Card’  (string)
  usb_device.configuration_value = 1  (0x1)  (int)
  usb_device.device_class = 0  (0x0)  (int)
  usb_device.device_protocol = 0  (0x0)  (int)
  usb_device.device_revision_bcd = 256  (0x100)  (int)
  usb_device.device_subclass = 0  (0x0)  (int)
  usb_device.is_self_powered = false  (bool)
  usb_device.linux.device_number = 3  (0x3)  (int)
  usb_device.linux.sysfs_path = ‘/sys/devices/pci0000:00/0000:00:1a.7/usb1/1-3’  (string)
  usb_device.max_power = 500  (0x1f4)  (int)
  usb_device.num_configurations = 1  (0x1)  (int)
  usb_device.num_interfaces = 1  (0x1)  (int)
  usb_device.num_ports = 0  (0x0)  (int)
  usb_device.product = ‘RTL8187 Wireless Adapter’  (string)
  usb_device.product_id = 33159  (0x8187)  (int)
  usb_device.serial = ‘0015AF048F06’  (string)
  usb_device.speed = 480.0 (480) (double)
  usb_device.vendor = ‘Realtek Semiconductor Corp.’  (string)
  usb_device.vendor_id = 3034  (0xbda)  (int)
  usb_device.version = 2.0 (2) (double)

不用多说了,注释掉modules.alias 中的对应条目就可以了。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: