免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 23608 | 回复: 37

疑问: PCIe BAR 只有32bit, 怎么在64bit kernel上使用?? [复制链接]

论坛徽章:
0
发表于 2010-08-31 22:17 |显示全部楼层
本帖最后由 gaoping561 于 2010-08-31 22:19 编辑

有个帖子讨论过IOMMU, IOMMU解决了32bit设备在64bit系统中使用的问题, 主要是DMA的问题.
http://linux.chinaunix.net/bbs/v ... p;extra=&page=1

但是, 如果PCIe设备的BAR寄存器大小只有32bit,  能否在64bit kernel上使用呢?  我的系统物理内存为16G, 完全可能给这个32bit 的BAR分配一个64位的地址, 这样岂不是不能在64位系统中使用?

望高人指点. x86_64 Linux是否有这样的机制, 给32位的BAR分配4G空间内的resource?

论坛徽章:
0
发表于 2010-09-01 03:10 |显示全部楼层
本帖最后由 epegasus 于 2010-09-01 03:18 编辑

PCIe配置头好象也是32位的.这意味着PCIe 设备也只能使用4G的地址.
当然范围只4G,并不意味着物理地址就是0-4G,可能存在偏移.

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
发表于 2010-09-01 12:38 |显示全部楼层
BAR是32还是64位的, 和OS没关系

论坛徽章:
0
发表于 2010-09-01 12:39 |显示全部楼层
BAR是32位的话,在64位系统上如果分配一个64位有效的地址,岂不是溢出?

论坛徽章:
0
发表于 2010-09-01 14:11 |显示全部楼层
64为处理器并不一定就是64位物理地址,AMD是52位,
PCIe PCI用统一的bar,.都是32位.所以总线地址就32位.
物理地址如果等于总线地址,(X86基本相等),那么就是只能分配到4G以内的物理地址.
PCI有64位的说法.不是BAR,而已传输位宽,比如2个32位字节可以有一个64位数据线传完.
总的来说.PCI系列还是面向32位的.

论坛徽章:
0
发表于 2010-09-01 14:38 |显示全部楼层
谢谢epegasus 回复。

BAR代表了PCIe总线空间的基地址,如果这个BAR寄存器只有32bit,那PCIe总线空间就没有办法map到4G以上, 但是在x86_64系统中,如果系统初始化的时候给32bit的BAR register 赋了一个64位的地址怎么办?32bit寄存器溢出了。我想问的是,kernel里是不是有这个机制,对32bit的BAR只分配4G已下的PCIe总线空间呢?

PCIe 标准上对Base Address Registers,有如下描述,64-Bit Addressing MUST be supported by non legacy Endpoint devices。我的设备支持MSI-X,就是说它是一个non legacy Endpoint devices,必须支持64bit的address么?

论坛徽章:
0
发表于 2010-09-01 15:16 |显示全部楼层
本帖最后由 epegasus 于 2010-09-01 16:29 编辑

刚看到2个BAR可以合并成一个64位地址.分别是高32位和低32位.PCI也是支持的.64位的地址用于起始于4G以上边界.
所以兼容下32位地址的都在4G以下.
具体没看代码,但是明显32位的不会分配4G以上地址.

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
发表于 2010-09-01 16:35 |显示全部楼层
内存有什么32、64之分吗? 没有。

有分别的, 乃是谁访问内存。

CPU访问内存, 地址总线宽度是多少? 如果是64, 那么地址就是64bit的;

PCI访问内存, 如果它支持64位, 碍着CPU什么事了?

论坛徽章:
0
发表于 2010-09-01 16:41 |显示全部楼层
本帖最后由 epegasus 于 2010-09-01 16:47 编辑

回复 8# 帅绝人寰


    LZ的意思是:64位的PCI系统.只有32位的BAR,怎么用?或者说64位的物理地址寻址空间,32位BAR怎么约定.

不过我有想到个问题.
16G的物理内存,物理地址在具体放在哪里?
上面认为32位的PCI设备物理地址应该分在4G以内.那16G如果起始在4G内,那就不能连续了.

论坛徽章:
0
发表于 2010-09-01 17:10 |显示全部楼层
本帖最后由 gaoping561 于 2010-09-01 17:16 编辑

我也是这么猜测的, 但是我又发现一个矛盾的地方。

PCI设备通过pci_alloc_consistent分配DMA空间,返回一个CPU可以操作的虚拟地址和dma_addr_t总线地址, 按照上面的理解,操作系统应该也不会给32位设备的DMA分配一个超过4G的PCI总线地址, 这样一来DMA操作就可以进行,32位PCI设备在64位x86系统上使用没有问题,但事实上需要回弹缓冲区或者IOMMU。

实际上powerpc上不存在这个问题,设置inbound outbound寄存器可以完全实现32位PCI空间到36位处理器空间的转换,相当于实现了IOMMU。

x86上PCI的总线空间和处理的存储空间到底怎么相互映射的呢,很可能是两头直接相等
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP