免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6051 | 回复: 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
19 [报告]
发表于 2009-05-23 10:01 |只看该作者
原帖由 Solaris12 于 2009-5-23 00:31 发表


使用之前整个MCFG区域是映射到虚拟地址空间的。只不过在boot早期阶段Solaris的映射函数比较特殊。

既然是整个映射的,那返回全f就是spec规定的访问不存在设备的情况。
看了一下linux的,貌似也是整个映射

  1. static void __iomem * __init mcfg_ioremap(struct acpi_mcfg_allocation *cfg)
  2. {
  3.         void __iomem *addr;
  4.         u32 size;

  5.         size = (cfg->end_bus_number + 1) << 20;
  6.         addr = ioremap_nocache(cfg->address, size);
  7.         if (addr) {
  8.                 printk(KERN_INFO "PCI: Using MMCONFIG at %Lx - %Lx\n",
  9.                        cfg->address, cfg->address + size - 1);
  10.         }
  11.         return addr;
  12. }

复制代码

论坛徽章:
0
18 [报告]
发表于 2009-05-23 00:31 |只看该作者
原帖由 zx_wing 于 2009-5-22 16:38 发表

>>3. 保护模式下用mov指令,全f的结果。
那这个就不对了。保护模式下mov后的是虚拟地址,所以你访问到的是不知道映射到哪儿去的物理内存。


使用之前整个MCFG区域是映射到虚拟地址空间的。只不过在boot早期阶段Solaris的映射函数比较特殊。

论坛徽章:
0
17 [报告]
发表于 2009-05-22 16:38 |只看该作者
原帖由 Solaris12 于 2009-5-22 16:19 发表



1. 是

2. 是, 只不过有槽没有插卡。

3. 保护模式下用mov指令,全f的结果。

>>3. 保护模式下用mov指令,全f的结果。
那这个就不对了。保护模式下mov后的是虚拟地址,所以你访问到的是不知道映射到哪儿去的物理内存。

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


我之前不知道MCFG这个东西,刚才去看了一下PCI firmware spec相关章节。对你同事做的实验有几个疑问:
1. 访问的是否是通过BDF算出来的物理地址?

2.这个地址是在 base + size内吗? size = (cfg->end_bus_number + 1) << 20;

3. 最关键的一点,你们是如何直接访问物理地址的?是在进保护模式之间直接用的mov吗?如果是,返回全f那肯定就是PCI spec规定的对不存在设备配置空间访问返回全f(见前面我贴的spec相关内容)。如果不是,那你们访问的地址根本就错了。 ...



1. 是

2. 是, 只不过有槽没有插卡。

3. 保护模式下用mov指令,全f的结果。

论坛徽章:
0
15 [报告]
发表于 2009-05-22 16:04 |只看该作者
摘自pci系统结构中文版,18.10

如果配置写交易的目标不存在DEVSEL#不被任何PCI功能有效.

当DEVSEL#保持无效时,主pci桥交易与主设备失败,并配置配置状态寄存器的收到主失败位.
当收到主设备失败的读交易,桥向处理器返回全1做为读数据.
当经历主设备失败写交易,桥的操作就像写交易正常完成一样.

因为这个原因全1的ID定为无效.

__________

我对host桥和CPU之间的关联细节不清楚,也不知道该看什么资料.

[ 本帖最后由 epegasus 于 2009-5-22 16:11 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-05-22 13:59 |只看该作者
原帖由 Solaris12 于 2009-5-21 22:42 发表


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

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

我前面讲的实验和x86的机制1一点关 ...

我之前不知道MCFG这个东西,刚才去看了一下PCI firmware spec相关章节。对你同事做的实验有几个疑问:
1. 访问的是否是通过BDF算出来的物理地址?

2.这个地址是在 base + size内吗? size = (cfg->end_bus_number + 1) << 20;

3. 最关键的一点,你们是如何直接访问物理地址的?是在进保护模式之间直接用的mov吗?如果是,返回全f那肯定就是PCI spec规定的对不存在设备配置空间访问返回全f(见前面我贴的spec相关内容)。如果不是,那你们访问的地址根本就错了。

论坛徽章:
0
13 [报告]
发表于 2009-05-22 13:23 |只看该作者
原帖由 bluesky_jxc 于 2009-5-22 13:08 发表
OK,你说的是配置空间,我前面误解了。通过BDF,和系统为PCI CFG空间的基地址,就可以得到其对应的4K空间。

我收回前面说的话



是配置空间,IO空间和Memory空间有BAR可以用啊。

谢谢你的答复。

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

回复 #11 Solaris12 的帖子

OK,你说的是配置空间,我前面误解了。通过BDF,和系统为PCI CFG空间的基地址,就可以得到其对应的4K空间。

我收回前面说的话

论坛徽章:
0
11 [报告]
发表于 2009-05-22 12:56 |只看该作者
原帖由 bluesky_jxc 于 2009-5-22 12:39 发表
>>”通过BDF可以得到一个物理地址,这个地址可能没有对应的设备,也可能有“。

这话说了等于没说,每一个物理地址都可以这么说,可能对应一个设备,也可能没有。通过BDF怎么得到物理地址,我说了,这个和pci ...



怎么会等于没说呢?

我枚举设备的时候,我就是拿一个不确定是否存在的BDF来枚举啊?

只不过现在的枚举是利用配置机制1,而我们现在要做的是用MMIO枚举,而且BDF和每个设备配置空间基地址的对应关系是规范里定义好了的。

可以参考

PCI FIRMWARE SPECIFICATION, REV. 3.0 P40

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP