免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: motalelf
打印 上一主题 下一主题

为什么PCI桥的枚举用这样一种奇怪的顺序? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-10-28 01:14 |只看该作者

回复 #6 zx_wing 的帖子

有一种情况下bios不会初始化,就是发生资源冲突
kernel会查询设备,看设备是否允许资源重新配置

论坛徽章:
0
12 [报告]
发表于 2007-10-28 18:06 |只看该作者
原帖由 bluesky_jxc 于 2007-10-28 01:14 发表
有一种情况下bios不会初始化,就是发生资源冲突
kernel会查询设备,看设备是否允许资源重新配置

多谢提醒。不过我认为不是bios不初始化,而是错误的初始化。
我曾经调过一个bug(不是在linux上,而是在windows上)。ACPI中的dsdt表将MMIO空间声明错了,结果bios在初始化网卡时按照这个错误的空间为设备的PCI bar填写了地址,windows启动后检测到这个错误,将设备标记为资源冲突并关闭。
所以我认为资源冲突是bios错误初始化的结果,而非未初始化的结果。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
13 [报告]
发表于 2007-10-29 10:02 |只看该作者
当然大多数情况下,BIOS会初始化所有的PCI设备。

但是在kernel中,它意图充分考虑BIOS未完全初始化的情况:
第一步:读取/分配总线号,读取/分配最大子总线号。记入pci_bus的同时,写入PCI设备的相关寄存器。
第二步:读取/分配pci_bus的影射窗口,注册入iomem_resource的同时,写入PCI设备的相关寄存器。
第三部:读取/分配pci_dev的影射区间,注册入iomem_resource的同时,写入PCI设备的相关寄存器。
第四步:读取/分配irq,记入pci_dev的同时,写入PCI设备和中断路由。

每一步都不仅仅是读取BIOS的初始化值,都有另外一个选择,就是kernel另行分配,并更新firmware。如果仅仅是读取而不分配的话,PCI初始化部分的代码,有50%以上的代码都没用。

二三四步都没啥问题,我主要是对第一步的逻辑有疑问。

[ 本帖最后由 塑料袋 于 2007-10-29 10:07 编辑 ]

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
14 [报告]
发表于 2007-10-29 16:24 |只看该作者
setup节有一个函数:pci_setup,从这个函数来看:
指定启动参数“assign-busses”时,kernel无效一切BIOS分配的总线号,自己从头来过。
未指定时,kernel怀疑BIOS只枚举了一部分,另一部分需kernel自己再来一遍。

[ 本帖最后由 塑料袋 于 2007-10-29 16:37 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2007-10-31 10:37 |只看该作者
原帖由 塑料袋 于 2007-10-29 16:24 发表
setup节有一个函数:pci_setup,从这个函数来看:
指定启动参数“assign-busses”时,kernel无效一切BIOS分配的总线号,自己从头来过。
未指定时,kernel怀疑BIOS只枚举了一部分,另一部分需kernel自己再来一遍。

bluesky_jxc兄是很懂PCI的,昨天他给我指出了什么时候BIOS不会枚举设备留给kernel去做的情况。
估计他把一些细节理明白了就会发上来。我就不班门弄斧了。

论坛徽章:
0
16 [报告]
发表于 2007-10-31 10:55 |只看该作者
原帖由 zx_wing 于 2007-10-31 10:37 发表

bluesky_jxc兄是很懂PCI的,昨天他给我指出了什么时候BIOS不会枚举设备留给kernel去做的情况。
估计他把一些细节理明白了就会发上来。我就不班门弄斧了。

我列出来一些点,希望大家多多讨论
1. Add-in bus,就是我在一个PCI设备卡上自行做了一个PCI桥,由于BIOS是Platform相关的,它不会去检查这种类型的设备的。当kernel启动时,kernel会完成这些任务。当然,这就要求Add-in的卡必须满足标准要求,最关键的就是中断线的连接了。PCI标准并没有规定中断线一定要怎么连接,但是要kernel能够为Add-in的卡正确分配irq,那么必须按照标准的推荐方法连接。
2.兼容性考虑。kernel是不完全相信PCI bios的,在早期,很多PCI虽然有32位的地址总线,但是很多设备其实只用了24位有效地址总线。这个时候,如果PCI bios按照顺序来分配地址空间,这些设备可能不能分配到低的16M,Kernel会查看其他占用这些内存空间的设备是否允许资源重新配置,也就是说是否可以将内存挪到大于16M空间,如果可以,那么这些老式的设备就可以分配到合适的内存空间了,那么就可以实现同时使用,否则,总有一个会被禁止。当然,现在几乎没有这种只用24位地址线的设备了,但是为了兼容性考虑,内核不得不对其进行处理
3.一些IO端口,和内存空间比起来,IO可以说是最麻烦的了,因为几乎所有的I/O端口都不允许进行重新配置。如果两个设备之间冲突,那么必然有一个不能使用。

欢迎大家讨论

论坛徽章:
0
17 [报告]
发表于 2007-10-31 10:59 |只看该作者

回复 #16 bluesky_jxc 的帖子

再补充一点:PCI其实是支持hotplug的,这种情况下,bios是毫无办法的,只能通过kernel来配置

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
18 [报告]
发表于 2012-02-26 14:52 |只看该作者
本帖最后由 embeddedlwp 于 2012-02-26 15:26 编辑

[

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
19 [报告]
发表于 2012-02-26 15:05 |只看该作者
本帖最后由 embeddedlwp 于 2012-02-26 15:26 编辑

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP