免费注册 查看新帖 |

Chinaunix

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

关于MMIO访问错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-23 13:58 |只看该作者 |倒序浏览
请教一个硬件的问题。

x86的物理内存地址空间有4G靠下的一段范围是MMIO的内存,对这段内存的访问实际上是对设备内存和寄存器的访问。

假设你在访问PCIE的设备MMIO的区域,当内存地址对应的位置有实际设备的寄存器时,过程中发生的错误实际上会触发一个root port上的中断。

但当一个地址没有真正设备寄存器对应的话,会产生root port上的中断吗? 还是产生一个CPU的trap?

[ 本帖最后由 Solaris12 于 2009-4-24 13:20 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-24 00:29 |只看该作者
这个要看PCIE的SPEC了吧? 不知道哪里能搞到免费的?

论坛徽章:
0
3 [报告]
发表于 2009-05-21 16:14 |只看该作者
原帖由 accessory 于 2009-4-24 00:29 发表
这个要看PCIE的SPEC了吧? 不知道哪里能搞到免费的?



是否产生trap不属于PCIE spec的范围。

这个问题我知道答案了,在x86上,只会有root port上的错误中断,没有异常。

在SPARC上除了root port 中断,还会有CPU上的trap.

论坛徽章:
0
4 [报告]
发表于 2009-05-21 16:47 |只看该作者
原帖由 Solaris12 于 2009-4-23 13:58 发表
请教一个硬件的问题。

x86的物理内存地址空间有4G靠下的一段范围是MMIO的内存,对这段内存的访问实际上是对设备内存和寄存器的访问。

假设你在访问PCIE的设备MMIO的区域,当内存地址对应的位置有实际设备 ...

没有真正的寄存器映射,产生的就是个page fault。

论坛徽章:
0
5 [报告]
发表于 2009-05-21 18:01 |只看该作者
原帖由 zx_wing 于 2009-5-21 16:47 发表

没有真正的寄存器映射,产生的就是个page fault。


你确定吗?

同事说他做了这个实验,

1. 读ACPI设备配置空间的基地址

2. 找一个不存在的BDF, 算出这个设备配置空间的基地址

3. 访问内存方式,读这个设备的vendorid

4. sparc panic, x86没有任何错误,返回全f.


实验结果和你说的不一样啊。

论坛徽章:
0
6 [报告]
发表于 2009-05-21 19:03 |只看该作者
原帖由 Solaris12 于 2009-5-21 18:01 发表


你确定吗?

同事说他做了这个实验,

1. 读ACPI设备配置空间的基地址

2. 找一个不存在的BDF, 算出这个设备配置空间的基地址

3. 访问内存方式,读这个设备的vendorid

4. sparc panic, x86没有 ...

>>找一个不存在的BDF, 算出这个设备配置空间的基地址
你说的这个不是MMIO,是port I/O。访问PCI配置空间是通过0xCF8~0xCFF端口访问的。
对于非法访问访问返回全1在PCI spec中有规定:
Since 0 FFFFh is an invalid Vendor ID, it is adequate
for the host bus to PCI bridge to return a value of all 1's on read accesses to Configuration
Space registers of non-existent devices.
  (Note that these accesses will be terminated with a
Master-Abort.)

论坛徽章:
0
7 [报告]
发表于 2009-05-21 22:42 |只看该作者
原帖由 zx_wing 于 2009-5-21 19:03 发表

>>找一个不存在的BDF, 算出这个设备配置空间的基地址
你说的这个不是MMIO,是port I/O。访问PCI配置空间是通过0xCF8~0xCFF端口访问的。
对于非法访问访问返回全1在PCI spec中有规定:



可能我说的不清楚,ACPI里有个MMCFG表,这个表里有配置空间MMIO的物理地址。

根据BDF,可以算出每个设备的物理地址。这个是PCI fireware规范里讲的,你可以去看下。

我前面讲的实验和x86的机制1一点关系也没有,全部是mov指令访问属于MMIO方式。

我们要做的就是在支持MMIO的平台上用MMIO的方式枚举设备。

论坛徽章:
0
8 [报告]
发表于 2009-05-22 09:31 |只看该作者

回复 #7 Solaris12 的帖子

IO和MMIO没有本质区别,通过IO和MMIO访问vendorID最后都由主桥转成CFG access.

你的这个问题和实现相关的,你访问的BDF不存在时,主桥发起的CFG access没有任何设备应答,这个时候,我认为返回全F是最好的实现方式。X86也是这么实现的。

[ 本帖最后由 bluesky_jxc 于 2009-5-22 13:10 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-05-22 12:17 |只看该作者
原帖由 bluesky_jxc 于 2009-5-22 09:31 发表
IO和MMIO没有本质区别,通过IO和MMIO访问vendorID最后都由主桥转成CFG access.

你的这个问题和实现相关的,你访问的BDF不存在时,主桥发起的CFG access没有任何设备应答,这个时候,我认为返回全F是最好的实现方式。X86也是这么实现的。

你说通过BDF可以得到物理地址?我的理解是,在特定平台下,firmware也是特定的情况下,PCI插槽的设备特定的情况下,才能根据 firmware的scan算法来得到,这个不具有普遍意义,举个简单例子,如果我在bus num比较小的slot上插上一块网卡(比如 bus num为2), 和我不插这块网卡,导致bus num较大(比如5)的slot上分配到的物理地址就不会一样,但是bus num为5的这个slot的BDF值不会改变的。





主要的区别在MMIO可以访问4K范围的配置空间,IO只能256字节以内。

通过BDF可以得到一个物理地址,这个地址可能没有对应的设备,也可能有。

如果没有设备应答,或者出现映射的空间里没有对应的寄存器,访问这个寄存器时会发生target abort, 这个时候root port上会有错误,但是这个错误到底怎么处理,不同操作系统也可能不一样。


这是x86的实现,不同硬件平台不同的,SPARC除了root port错误中断,还会有CPU的trap.

论坛徽章:
0
10 [报告]
发表于 2009-05-22 12:39 |只看该作者

回复 #9 Solaris12 的帖子

>>”通过BDF可以得到一个物理地址,这个地址可能没有对应的设备,也可能有“。

[ 本帖最后由 bluesky_jxc 于 2009-5-22 13:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP