免费注册 查看新帖 |

Chinaunix

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

linux2.6内核中pci初始化的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-14 15:33 |只看该作者 |倒序浏览
在2.6内核里面pci设备的初始化是由pci_driver中的probe做的。而probe的调用是由
pcibios_init->pci_scan_bus->device_add->device_attach等等到最后调用pci_driver中的probe。
可是大多数pci设备驱动的加载是通过moudle_init,__define_initcall("6",fn),
而pcibios_init的调用是通过subsys_initcall,__define_initcall("4",fn)即在调用probe函数的时候,
pci_driver还没有加载进去,那不就是无法调用了吗?
我不知道是不是我理解的有问题,请高手指教。

论坛徽章:
0
2 [报告]
发表于 2008-05-15 12:13 |只看该作者

回复 #1 satlantis 的帖子

device module里面没有定义device和driver加载的先后问题,我的理解是因为有“热插拔”设备的存在。

对于不支持热插拔的PCI设备来讲,是先构建PCI的资源树,如果当前没有driver存在,当然绑定driver失败了,这个时候是不会调用probe的。

但是请你看一下加载PCI driver的代码,你会发现每次加入driver,都会遍历资源树,完成binding。

代码为什么要这样,你想想有PCI设备可以支持热插拔就会明白了。

论坛徽章:
0
3 [报告]
发表于 2008-05-16 12:16 |只看该作者
谢谢sky兄的解释。不过我还是不是太明白。首先我们不考虑“热插拔”,假设没有支持热插拔的
设备存在。那么一个正常的加载顺序是在start_kernel后的rest_init中载入,__define_initcall
("N",fn), N从小到大。在2.4的内核如你所说,加载的顺序不是固定的,而且是由pci_init调用
pcibios_init->pci_scan_bus->.....->(drv->probe).
drv->probe这个就是每个pci设备的初始化,而它是需要pci_register_driver通过
module_init(XX_init)加载的。这里的XXX_init和pci_init中__define_initcall("N",fn)的N是
一样的。所以没有什么问题。
可是2.6的内核pcibios_init不是通过pci_init调用的,而是subsys_initcall,它的N比
module_init优先级要高。所以pcibios_init在建立完内核树再probe pci设备的时候,pci设备
的驱动还没有通过module_init(XX_init)加载到内核里面。
我想问的是pci设备的probe是不是要等module_init(XX_init)加载到内核后,在做的呢?
如果是那样的话,pcibios_init不是只用建立内核树,不用在对pci设备进行scan和probe了吗?

论坛徽章:
0
4 [报告]
发表于 2008-05-16 23:06 |只看该作者

回复 #3 satlantis 的帖子

看来你没有明白我的意思

你说的这种情形binding是不成功的,这个probe过程有两个地方可以调用,一个是你说的发现device,另一个地方是在加载driver的时候.两个地方只要有一个地方调用probe成功就可以了.

所以,如果不考虑热插拔,这个时候是不会调用probe的,而是加载driver的时候调用的

论坛徽章:
0
5 [报告]
发表于 2008-05-16 23:48 |只看该作者
我帮用代码解释一下哈

pci_register_driver->driver_register->bus_add_driver(drv) ->driver_attach

driver_attach这个函数会对总线所有未有驱动的设备进行尝试pci总线提供的probe(pci_device_probe),而这个probe最终导致pci device driver提供的driver,就是bluesky_jxc 说的加载时候提供的pci_driver里面的probe

论坛徽章:
0
6 [报告]
发表于 2008-05-17 18:00 |只看该作者
是的,昨天晚上在看pci_register_driver是突然发现的really_probe这个函数,才明白了,呵呵
当时只是觉的在pcibios_init中调用probe一定会失败,为什么系统还是会调用呢?于是就走进了
死胡同。谢谢bluesky_jxc 和flw2  了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP