免费注册 查看新帖 |

Chinaunix

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

还是不理解IOMMU、北桥、PCI的MMIO和ioremap [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-03-24 15:10 |只看该作者
原帖由 epegasus 于 2008-3-24 14:40 发表
zx_wing 老大可否就这段代码讲解一下?

phymem = pci_resource_start(pdev, 0);
    if (!request_mem_region(phymem, pci_resource_len(pdev, 0), "eth")) {
        printk(KERN_ERR "eth_pci: cannot  ...

这个就是驱动使用PCI bar的方式了。大概是这么一个意思:
request_mem_region()把设备PCI bar占用的的物理地址空间预留出来,pci_resource_start()得到设备PCI bar地址,用ioremap把这个地址映射到虚拟地址空间,然后把基地址返回给mem。
以后操作设备的寄存器,就用mem+offset的方式了,例如:
outb(mem_0x10, 0xff)

通常为了方便,是会根据设备的spec,定义一个结构体来描述这些寄存器的,而不会直接用mem这种得到基地址的方式。例如:

  1. struct control_reg
  2. {
  3.     int reg1;
  4.     int reg2;  
  5.     int reg3;
  6.    ......
  7.     int reg;
  8. } csr;

  9. csr = ioremap( pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));

  10. //然后
  11. crs.reg1 = 0xff; //就是写设备的寄存器1了
复制代码

论坛徽章:
0
12 [报告]
发表于 2008-03-24 15:18 |只看该作者

to zx_wing:

看你的帖子真是享受



> IOMMU是对于设备发起DMA操作来说的,你可以理解成设备用于做DMA的地址是一个虚拟地址(这个虚拟地址和我们平时说的那个不一样,是指设备DMA 用的地址不是真实的物理地址,没有IOMMU的情况下用的是物理地址)。也有称这个虚拟地址为总线地址的,但我认为不恰当,容易让人误解。

这里好像有个小小的问题。 我们都是用「总线地址」这个词 来指 位于设备上的IO内存地址, 也就是你说的「物理地址」。 内核里有bus_to_virt和virt_to_bus宏,就是用来计算他们的,当然在IOMMU之后这两个宏就非法了。

老大有时间看看吗?

论坛徽章:
0
13 [报告]
发表于 2008-03-24 15:22 |只看该作者
原帖由 albcamus 于 2008-3-24 15:18 发表
看你的帖子真是享受



> IOMMU是对于设备发起DMA操作来说的,你可以理解成设备用于做DMA的地址是一个虚拟地址(这个虚拟地址和我们平时说的那个不一样,是指设备DMA 用的地址不是真实的物理地址,没有IO ...

老大过奖了哈。

总线地址这个说法我可能说错鸟,我记得LDD讲DMA那章讲了这个概念,对设备做DMA的地址称为总线地址,还有一个什么DMA地址。到底哪个对应有IOMMU情况下DMA的虚拟地址我记不清楚了。我记得是总线地址。
现在手边没有LDD,有的兄弟翻一下哈,翻到了出来纠正一下

论坛徽章:
0
14 [报告]
发表于 2008-03-24 15:36 |只看该作者
原帖由 zx_wing 于 2008-3-24 15:22 发表

总线地址这个说法我可能说错鸟,我记得LDD讲DMA那章讲了这个概念,对设备做DMA的地址称为总线地址,还有一个什么DMA地址。到底哪个对应有IOMMU情况下DMA的虚拟地址我记不清楚了。我 ...


sorry, 我没有看仔细你的context

论坛徽章:
0
15 [报告]
发表于 2008-03-24 16:04 |只看该作者
原帖由 zx_wing 于 2008-3-24 12:50 发表

汗,这几个问题就真和IOMMU没有关系了。
如crspo所说,pci_read_config_dword是用于读取PCI设备的配置空间的,不是读寄存器的。PCI配置空间的具体信息你可以baidu一下,我就不打字了,但对于上层软件,它最主 ...

仿佛有点明白老大讲的iommu是什么意思了。
但有这样一个问题,
pci_read_config_dword得到PCI bar ----> ioremap映射PCI bar到虚拟地址空间
pci bar似乎一开始就占到的物理地址,
这个初始过程是怎么样的呢?硬件上又是如何支持的?

论坛徽章:
0
16 [报告]
发表于 2008-03-24 16:08 |只看该作者
x86架构上总线地址应该就是物理地址  包括返回给网卡这样的pci设备的地址也就是返回物理地址
不过在驱动里面dma映射时用dma_addr_t来表示总线地址  比如在8139驱动里面  只不过给这个总线地址赋值的还是物理地址。。。

request_mem_region()不是很懂  它预留的空间大小应该是所需要映射的大小吧?它返回的地址是虚拟地址么?  然后用ioremap建立虚拟地址和要映射的地址间的关系?
我不懂什么叫“占到物理地址” 物理地址不是物理内存大小的地址么  它直接占用在物理内存里面么?不是虚拟地址?

[ 本帖最后由 duanius 于 2008-3-24 16:09 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-03-24 16:13 |只看该作者
原帖由 epegasus 于 2008-3-24 16:04 发表

仿佛有点明白老大讲的iommu是什么意思了。
但有这样一个问题,
pci_read_config_dword得到PCI bar ----> ioremap映射PCI bar到虚拟地址空间
pci bar似乎一开始就占到的物理地址,
这个初始过程是怎么样的呢 ...


这个就是PCI配置的过程, 在booting阶段进行的, 枚举每条PCI总线上的每个PCI设备功能,进行配置。

配置有几种方式:

1)老的,已经废弃了的pcibios,这个是支持PCI的BIOS的意思,PCI BIOS规范也是PCI-SIG的众多PCI 规范中的一个 ;
2) 直接配置: PCI规范的type1
3)直接配置: PCI规范的type2
4)对PCI-E来说, 还有个PCI Firmware规范,它在ACPI中提供了一张 MCFG表, 也就是mmconfig方式, 内核可以读MCFG表进行配置。

论坛徽章:
0
18 [报告]
发表于 2008-03-24 16:27 |只看该作者
原帖由 epegasus 于 2008-3-24 16:04 发表

仿佛有点明白老大讲的iommu是什么意思了。
但有这样一个问题,
pci_read_config_dword得到PCI bar ----> ioremap映射PCI bar到虚拟地址空间
pci bar似乎一开始就占到的物理地址,
这个初始过程是怎么样的呢 ...

你可以理解成操作系统启动的时候,PCI设备的寄存器就已经分配到物理地址了。
这个分配过程我还不太清楚,也是以后学习的一个目标。al老大讲那几个我也不懂

论坛徽章:
0
19 [报告]
发表于 2008-03-24 16:35 |只看该作者
原帖由 duanius 于 2008-3-24 16:08 发表
x86架构上总线地址应该就是物理地址  包括返回给网卡这样的pci设备的地址也就是返回物理地址
不过在驱动里面dma映射时用dma_addr_t来表示总线地址  比如在8139驱动里面  只不过给这个总线地址赋值的还是物理地 ...

可能是我用词不准确,不应该说是预留。
实际是这样的,linux中用resouce结构来描述PCI设备占用的资源。PCI设备是树状结构,所以linux中也有一个树状的resource(ISA设备的我不清楚)来描述所有的PCI设备。
当系统枚举到一个设备,得到它的PCI bar信息后,就分配一个resource,把这些信息填进去,再把这个resource注册到resource树中。并且在向resource树注册的时候,要检测这个设备的PCI bar是否和其它设备的PCI bar冲突。如果冲突,这个resouce就注册失败,对应的设备驱动也就不应该工作了。

所以我说预留物理地址空间就是告诉kernel:“这块物理地址被我的PCI bar占啦,以后的设备不许跟我抢,要抢就不要它工作”

request_mem_region不返回什么地址,pci_resource_start返回设备PCI bar的物理地址,然后用ioremap映射到虚拟地址空间。

论坛徽章:
0
20 [报告]
发表于 2008-03-24 16:43 |只看该作者
多谢2个老大的轮流讲解
一个是配置过程,alb 老大将的,可能要看pci规范了。
但是初始配置好以后呢?整个寻址过程是怎么样的?
通过pci bar在硬件上如何能寻址到pci设备上的寄存器去?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP