linux如何发现正确的驱动?
是这样,我的机子有两个网卡,分别是8139和e100的。我在配置内核里除了选择了8139和e100,还选了3com的网卡驱动。我想问一下 linux如何在内核里如何来判断选用选择合适的驱动程序?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
是这样,我的机子有两个网卡,分别是8139和e100的。我在配置内核里除了选择了8139和e100,还选了3com的网卡驱动。我想问一下 linux如何在内核里如何来判断选用选择合适的驱动程序?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
回复 9# xs3c
每个编译进kernel的module的__init函数都在内核image的__init_call__ section中,kernel初始化过程中会对这个section中的每个函数都调用一次。
上面简单的提到了 sysfs 文件系统,您可能想知道 sysfs 是怎么认出系统中存在的设备以及应该使用什么设备号。对于已经编入内核的驱动程序,当被内核检测到的时候,会直接在 sysfs 中注册其对象;对于编译成模块的驱动程序,当模块载入的时候才会这样做。大家知道这个内核检测是在那部分做的?
谢谢楼上的回答,有点门道, 我在看看udev是咋回事,以前就听说,但他具体咋工作还不知道。
回复 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(即插即用)
我的理解是这样的:在PCI驱动中有一个pci_device_id结构,里面包含了能够驱动的设备模块列表,在pci_driver中通过id_table和pci_device_id进行关联,加载驱动时,probe函数就会通过id_table找到对应的PCI设备
谢谢楼上的回答,那pci总线驱动在啥时候调用呢。我看了下redhat下的/etc/rcsysinit脚本。他里面有加载网卡这些驱动,
复制代码这里它已经就知道该加载正确的驱动了吗?
驱动程序里注明了它要接管的chip的pci id,pci总线驱动一开始会probe所有的pci device,对每个pci device都去问驱动程序,这个设备的pci id是否是它像要控制的设备的pci id.如果是,就交给这个驱动就行了。其他驱动则打酱油。
这个问题好,我也想知道
自己先顶一下。。