PCIE之设备地址

PCIE之设备地址

PCIE之设备地址

PCI、PCIE外设的地址大致有两种,第一种是IO地址,第二种是MEM地址。

IO地址

IO地址是早期访问外设的方式,比起MEM地址访问,效率低。PCIE保留了这种方式前向兼容。
可以从下图看到BAR空间中,如果是使用IO地址的话,最后一位标识位会为1。比如某个PCIE外设的bar0空间值为0x1001,表示使用的是IO地址,而且外设的地址为0x1000。(0x1001 & 0xFFF0)
在这里插入图片描述

MEM地址

MEM地址是后来通用的地址访问方式,其效率比IO地址要高,而且分为可预取地址和不可预取地址。
从下图看到,BAR空间的后四位是标识位,bit0为0标识为MEM地址,bit2和bit1组合表示为32位MEM地址还是64位MEM地址,bit3就是表示是否为可预取的MEM地址,值为1表示为可预取地址。比如有个PCIE外设bar空间为0x41000008,就是表示是可预取的32位MEM地址。外设的访问地址依旧是0x41000000(0x41000008 & 0xFFFFFFF0)
在这里插入图片描述

在不同平台下的地址访问

ARM平台(以FT2000/4为例)

FT2000/4平台的地址划分是这样的:

可以看出来ARM平台的地址映射都是连续的,基本上从PCIE外设读取BAR值就能直接访问。

MIPS平台(以龙芯2K为例)

首先看一眼龙芯2K的地址空间划分
在这里插入图片描述
可以看到龙芯2K平台的PCIE IO地址是从0x18000000开始的,PCIE MEM地址是从0x4000000开始的。所以在龙芯平台使用PCIE外设IO地址需要注意,还是用上面BAR值为0x1001的例子做示范:需要访问这个PCIE外设,应用或者操作系统需要访问的虚拟地址就是0x18001000(0x18000000 | (0x1001 & 0xFFF0))。
说到这了,那就再看一眼MIPS架构的地址分布:
在这里插入图片描述
kuseg : 0x00000000~0x7fffffff(2G),这一段空间,为User Space;
kseg0 : 0x80000000~0x9fffffff(512MB), 这一段空间是过cache的;
kseg1 : 0xa0000000~0xbfffffff(512MB),这一段空间是不过cache的;
kseg2和kseg3 : 0xc0000000~0xffffffff(1GB),访问这段物理空间需要tlb转换,会经过cache。
回到上面的例子,一般用0x18001000和0xB8001000(0x18001000 | 0xA000000)都能访问这个PCIE外设,不同的是,用后面的方式访问是不过cache的。

PS:MEM地址也是类似的,只不过一般MEM地址从BAR空间读到后,就可以用读到的这个值去访问外设。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值