显卡bind 驱动 linux,驱动的手动绑定与松绑

2.6.13-rc3内核提供了一个新的特性,可以在用户空间手动的将驱动与设备进行帮定和分离。之前,我们只能够通过rmmod来将整个的驱动从内存中卸载才能将驱动与设备断开联系。

root@dell-desktop:~# lspci | grep Ethernet

00:19.0 Ethernet controller: Intel Corporation 82566DM-2 Gigabit Network Connection (rev 02)

root@dell-desktop:~# cd /sys/bus/pci/devices/0000:00:19.0

root@dell-desktop:/sys/bus/pci/devices/0000:00:19.0# ll

total 0

-rw-r--r-- 1 root root   4096 2008-09-10 10:07 broken_parity_status

lrwxrwxrwx 1 root root      0 2008-09-10 10:07 bus -> ../../../bus/pci

-r--r--r-- 1 root root   4096 2008-09-08 14:32 class

-rw-r--r-- 1 root root    256 2008-09-10 10:07 config

-r--r--r-- 1 root root   4096 2008-09-08 14:32 device

lrwxrwxrwx 1 root root      0 2008-09-11 23:15 driver -> ../../../bus/pci/drivers/e1000e

-rw------- 1 root root   4096 2008-09-10 10:07 enable

-r--r--r-- 1 root root   4096 2008-09-10 10:07 irq

-r--r--r-- 1 root root   4096 2008-09-10 10:07 local_cpulist

-r--r--r-- 1 root root   4096 2008-09-10 10:07 local_cpus

-r--r--r-- 1 root root   4096 2008-09-10 10:07 modalias

-rw-r--r-- 1 root root   4096 2008-09-10 10:07 msi_bus

lrwxrwxrwx 1 root root      0 2008-09-11 23:15 net:eth0 -> ../../../class/net/eth0

drwxr-xr-x 2 root root      0 2008-09-10 10:07 power

-r--r--r-- 1 root root   4096 2008-09-08 14:32 resource

-rw------- 1 root root 131072 2008-09-10 10:07 resource0

-rw------- 1 root root   4096 2008-09-10 10:07 resource1

-rw------- 1 root root     32 2008-09-10 10:07 resource2

lrwxrwxrwx 1 root root      0 2008-09-08 14:32 subsystem -> ../../../bus/pci

-r--r--r-- 1 root root   4096 2008-09-08 14:32 subsystem_device

-r--r--r-- 1 root root   4096 2008-09-08 14:32 subsystem_vendor

-rw-r--r-- 1 root root   4096 2008-09-08 14:32 uevent

-r--r--r-- 1 root root   4096 2008-09-08 14:32 vendor

可以看到网卡的驱动连接到e1000e上面。

unbind取消设备与驱动的联系:

root@dell-desktop:/sys/bus/pci/drivers/e1000e# echo -n "0000:00:19.0" > unbind

root@dell-desktop:/sys/bus/pci/drivers/e1000e# ll

total 0

--w------- 1 root root 4096 2008-09-11 23:23 bind

lrwxrwxrwx 1 root root    0 2008-09-11 23:23 module -> ../../../../module/e1000e

--w------- 1 root root 4096 2008-09-11 23:23 new_id

--w------- 1 root root 4096 2008-09-11 23:23 uevent

--w------- 1 root root 4096 2008-09-11 23:25 unbind

查看PCI相应的目录:

root@dell-desktop:/sys/bus/pci/devices/0000:00:19.0# ll

total 0

-rw-r--r-- 1 root root   4096 2008-09-10 10:07 broken_parity_status

lrwxrwxrwx 1 root root      0 2008-09-10 10:07 bus -> ../../../bus/pci

-r--r--r-- 1 root root   4096 2008-09-08 14:32 class

-rw-r--r-- 1 root root    256 2008-09-10 10:07 config

-r--r--r-- 1 root root   4096 2008-09-08 14:32 device

-rw------- 1 root root   4096 2008-09-10 10:07 enable

-r--r--r-- 1 root root   4096 2008-09-10 10:07 irq

-r--r--r-- 1 root root   4096 2008-09-10 10:07 local_cpulist

-r--r--r-- 1 root root   4096 2008-09-10 10:07 local_cpus

-r--r--r-- 1 root root   4096 2008-09-10 10:07 modalias

-rw-r--r-- 1 root root   4096 2008-09-10 10:07 msi_bus

drwxr-xr-x 2 root root      0 2008-09-10 10:07 power

-r--r--r-- 1 root root   4096 2008-09-08 14:32 resource

-rw------- 1 root root 131072 2008-09-10 10:07 resource0

-rw------- 1 root root   4096 2008-09-10 10:07 resource1

-rw------- 1 root root     32 2008-09-10 10:07 resource2

lrwxrwxrwx 1 root root      0 2008-09-08 14:32 subsystem -> ../../../bus/pci

-r--r--r-- 1 root root   4096 2008-09-08 14:32 subsystem_device

-r--r--r-- 1 root root   4096 2008-09-08 14:32 subsystem_vendor

-rw-r--r-- 1 root root   4096 2008-09-08 14:32 uevent

-r--r--r-- 1 root root   4096 2008-09-08 14:32 vendor

bind重新将设备与驱动进行帮定

root@dell-desktop:/sys/bus/pci/drivers/e1000e# echo -n "0000:00:19.0" > bind

root@dell-desktop:/sys/bus/pci/drivers/e1000e# ll

total 0

lrwxrwxrwx 1 root root    0 2008-09-11 23:25 0000:00:19.0 -> ../../../../devices/pci0000:00/0000:00:19.0

--w------- 1 root root 4096 2008-09-11 23:25 bind

lrwxrwxrwx 1 root root    0 2008-09-11 23:23 module -> ../../../../module/e1000e

--w------- 1 root root 4096 2008-09-11 23:23 new_id

--w------- 1 root root 4096 2008-09-11 23:23 uevent

--w------- 1 root root 4096 2008-09-11 23:25 unbind

查看PCI相应的目录:

root@dell-desktop:/sys/bus/pci/devices/0000:00:19.0# ll

total 0

-rw-r--r-- 1 root root   4096 2008-09-10 10:07 broken_parity_status

lrwxrwxrwx 1 root root      0 2008-09-10 10:07 bus -> ../../../bus/pci

-r--r--r-- 1 root root   4096 2008-09-08 14:32 class

-rw-r--r-- 1 root root    256 2008-09-10 10:07 config

-r--r--r-- 1 root root   4096 2008-09-08 14:32 device

lrwxrwxrwx 1 root root      0 2008-09-11 23:23 driver -> ../../../bus/pci/drivers/e1000e

-rw------- 1 root root   4096 2008-09-10 10:07 enable

-r--r--r-- 1 root root   4096 2008-09-10 10:07 irq

-r--r--r-- 1 root root   4096 2008-09-10 10:07 local_cpulist

-r--r--r-- 1 root root   4096 2008-09-10 10:07 local_cpus

-r--r--r-- 1 root root   4096 2008-09-10 10:07 modalias

-rw-r--r-- 1 root root   4096 2008-09-10 10:07 msi_bus

lrwxrwxrwx 1 root root      0 2008-09-11 23:23 net:eth0 -> ../../../class/net/eth0

drwxr-xr-x 2 root root      0 2008-09-10 10:07 power

-r--r--r-- 1 root root   4096 2008-09-08 14:32 resource

-rw------- 1 root root 131072 2008-09-10 10:07 resource0

-rw------- 1 root root   4096 2008-09-10 10:07 resource1

-rw------- 1 root root     32 2008-09-10 10:07 resource2

lrwxrwxrwx 1 root root      0 2008-09-08 14:32 subsystem -> ../../../bus/pci

-r--r--r-- 1 root root   4096 2008-09-08 14:32 subsystem_device

-r--r--r-- 1 root root   4096 2008-09-08 14:32 subsystem_vendor

-rw-r--r-- 1 root root   4096 2008-09-08 14:32 uevent

-r--r--r-- 1 root root   4096 2008-09-08 14:32 vendor

正如例子中所示,这个特性可以很方便的在处理相同类型的驱动间切换设备,一些商业版的linux发行版会在他们的内核包里面提供多个版本的驱动。这种手动绑定机制可以允许配置工具选择并设置设备与哪一个驱动进行绑定,允许用户只更新他们想要更新的设备驱动。

为了设备可以与一个驱动成功的进行绑定,需要驱动必须支持这个设备。这就是为什么不能将一个随便的设备与一个随便的驱动进行帮定的原因。

这个特性在虚拟机的实现中应用广泛,例如USB设备在虚拟机中的使用。

首先在host中unbind那个USB设备与原有的驱动(usb.ko),然后bind那个USB设备到虚拟机的虚拟USB驱动(vusb.ko)上

面。这样,虚拟机就可以使用USB设备了,但是主机就无法使用这个USB设备了,当主机要使用的时候,再进行ubind和bind操作。

注意:忽然想起之前的libe1000的bind问题,刚开始总是不开窍,一个设备只能够与一个驱动进行bind,在bind其他驱动的时候,就会提示:

bash: echo: write error: No such device

在这个地方糊涂了好长时间。

现在来看libe1000的udev规则文件:

KERNEL=="0000:81:00.0", WAIT_FOR_SYSFS="driver/unbind"

,

PROGRAM="modprobe libe1000",

ATTR{driver/unbind}="$kernel",ATTR{subsystem/drivers/libe1000/bind}="$kernel"

当sysfs文件系统中"driver/unbind"被创建的时候,执行程序"modprobe libe1000",然后将设备与驱动unbind,然后向libe1000目录下面的bind写数据来绑定设备与驱动。

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值