免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3257 | 回复: 14
打印 上一主题 下一主题

linux如何发现正确的驱动? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-17 08:28 |只看该作者 |倒序浏览
是这样,我的机子有两个网卡,分别是8139和e100的。我在配置内核里除了选择了8139和e100,还选了3com的网卡驱动。我想问一下 linux如何在内核里如何来判断选用选择合适的驱动程序?

论坛徽章:
0
2 [报告]
发表于 2010-03-17 10:22 |只看该作者
自己先顶一下。。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-05-06 06:20:00
3 [报告]
发表于 2010-03-17 13:21 |只看该作者
这个问题好,我也想知道

论坛徽章:
0
4 [报告]
发表于 2010-03-17 14:54 |只看该作者
驱动程序里注明了它要接管的chip的pci id,pci总线驱动一开始会probe所有的pci device,对每个pci device都去问驱动程序,这个设备的pci id是否是它像要控制的设备的pci id.如果是,就交给这个驱动就行了。其他驱动则打酱油。

论坛徽章:
0
5 [报告]
发表于 2010-03-17 19:17 |只看该作者
谢谢楼上的回答,那pci总线驱动在啥时候调用呢。我看了下redhat下的/etc/rcsysinit脚本。他里面有加载网卡这些驱动,

  1. # Network
  2. pushd /etc/sysconfig/network-scripts >/dev/null 2>&1
  3. interfaces=`ls ifcfg* | LC_ALL=C egrep -v '(ifcfg-lo|:|rpmsave|rpmorig|rpmnew)' | \
  4.             LC_ALL=C egrep -v '(~|\.bak)$' | \
  5.             LC_ALL=C egrep 'ifcfg-[A-Za-z0-9\._-]+$' | \
  6.             sed 's/^ifcfg-//g' |
  7.             sed 's/[0-9]/ &/' | LC_ALL=C sort -k 1,1 -k 2n | sed 's/ //'`

  8. for i in $interfaces ; do
  9.         eval $(LC_ALL=C fgrep "DEVICE=" ifcfg-$i)
  10.         load_module $DEVICE
  11. done
  12. popd >/dev/null 2>&1

  13. for module in $network ; do
  14.         load_module $module
  15. done

  16. echo -n $" network"
复制代码
这里它已经就知道该加载正确的驱动了吗?

论坛徽章:
0
6 [报告]
发表于 2010-03-17 20:14 |只看该作者
我的理解是这样的:在PCI驱动中有一个pci_device_id结构,里面包含了能够驱动的设备模块列表,在pci_driver中通过id_table和pci_device_id进行关联,加载驱动时,probe函数就会通过id_table找到对应的PCI设备

论坛徽章:
0
7 [报告]
发表于 2010-03-17 22:45 |只看该作者
回复 5# xs3c


    你这里是另外一回事。前面我说的pci云云,都是在driver module已经插入到kernel space中以后这个前提下。即buildin的driver或者已经modprobe后的driver。如果你的driver还在文件系统上,那肯定是参与不到pci probe的id匹配过程的。但总不可能把所有driver module都编译进内核或者一个接一个的modprobe吧。所以就有了udev这种程序,它在user space做这种类似的pci id match的工作,然后把文件系统上对应的module给插入到kernel space中。你的这个脚本也差不多,就是比如你ifconfig eth0 up时,脚本会根据eth0找到一个module name,然后将它modprobe到kernel space.这种机制叫hotplug(热插拔)。前面说的pci id match的机制叫(plug and play)或者pnp(即插即用)

论坛徽章:
0
8 [报告]
发表于 2010-03-18 08:36 |只看该作者
谢谢楼上的回答,有点门道, 我在看看udev是咋回事,以前就听说,但他具体咋工作还不知道。

论坛徽章:
0
9 [报告]
发表于 2010-03-18 10:18 |只看该作者
上面简单的提到了 sysfs 文件系统,您可能想知道 sysfs 是怎么认出系统中存在的设备以及应该使用什么设备号。对于已经编入内核的驱动程序,当被内核检测到的时候,会直接在 sysfs 中注册其对象;对于编译成模块的驱动程序,当模块载入的时候才会这样做。大家知道这个内核检测是在那部分做的?

论坛徽章:
0
10 [报告]
发表于 2010-03-18 15:24 |只看该作者
回复 9# xs3c


    每个编译进kernel的module的__init函数都在内核image的__init_call__ section中,kernel初始化过程中会对这个section中的每个函数都调用一次。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP