【谈谈PCIE的地址映射】


【博客首发于微信公众号《漫谈芯片与编程》,欢迎专注一下,多谢大家】

1 为什么PCIE需要地址映射?

每个PCIE设备,都有自己的内部空间,这部分空间若是开放给Host(软件/CPU)来访问,那么Host怎样往这部分空间写入数据或者读数据?
---->CPU只能直接访问Host内存(Memory)空间,不对PCIE等外设直接操作,具体再通过RC分忧。
具体办法就是:CPU如果想访问某个设备的空间,由于它不能亲自跟那些PCIe外设打交道,因此叫RC去办。比如,如果CPU想读PCIe外设的数据,先叫RC通过TLP把数据从PCIe外设读到Host内存,然后CPU从Host内存读数据;如果CPU要往外设写数据,则先把数据在内存中准备好,然后叫RC通过TLP写入到PCIe设备。

最左边虚线的表示CPU要读Endpoint A的数据,RC则通过TLP(经历Switch)数据交互获得数据,并把它写入到系统内存中,然后CPU从内存中读取数据(紫色箭头所示),从而CPU间接完成对PCIe设备数据的读取。
系统把PCIe设备开放的空间(系统软件可见)映射到内存空间,CPU要访问该PCIe设备空间,只需访问对应的内存空间。RC检查该内存地址,如果发现该内存空间地址是某个PCIe设备空间的映射,就会触发其产生TLP,去访问对应的PCIe设备,读取或者写入PCIe设备。
在这里插入图片描述

2 地址映射在PCIE协议中的几个主要原因和用途:

  • 内存地址空间共享:PCIe设备需要访问系统内存,而系统内存地址空间是有限的。通过地址映射,每个PCIe设备可以被分配一个唯一的内存地址范围,确保不同设备不会相互干扰。
  • I/O地址空间共享:类似地,I/O地址空间也需要被合理分配,以避免冲突。
  • 配置空间访问:每个PCIe设备都有一个配置空间(Configuration Space),用于存储设备的配置信息,如设备ID、类代码、基地址寄存器(BARs)等。地址映射使得主机可以通过配置空间访问和配置每个设备。
  • 直接内存访问DMA:PCIe设备经常需要直接访问系统内存进行DMA操作。地址映射确保了设备可以正确地访问指定的内存地址,而不会访问到其他设备或系统的敏感区域。
  • 虚拟地址支持:在使用虚拟化技术的系统中,地址映射可以将虚拟地址转换为物理地址,确保虚拟机能够正确访问物理设备。

具体实现:地址映射在PCIe协议中主要通过基地址寄存器(Base Address Registers, BARs)来实现。每个PCIe设备的配置空间中都有多个BARs,用于指定设备的内存和I/O地址范围。主机通过配置这些BARs来分配地址空间。

3 软件如何为其分配映射空间的?

在这里插入图片描述

上电时,系统软件首先会读取PCIe设备的BAR0,得到数据:
在这里插入图片描述

然后系统软件往该BAR0写入全1,得到:
在这里插入图片描述

BAR寄存器有些bit是只读的,是PCIe设备在出厂前就固定好的bit,写全1进去,如果值保持不变,就说明这些bit是厂家固化好的。
怎么解读?低12没变,表明该设备空间大小是4KB(2的12次方),然后低4位表明了该存储空间的一些属性,这些都是PCIe设备在出厂前都设置好的,提供给系统软件的信息。
然后系统软件根据这些信息,在系统内存空间找到这样一块地方来映射这4KB的空间,把分配的基地址写入到BAR0:
在这里插入图片描述

从而最终完成了该PCIe空间的映射。一个PCIe设备可能有若干个内部空间需要开放出来,系统软件依次读取BAR1,BAR2。。。,直到BAR5,完成所有内部空间的映射。

【ref】
1.http://www.ssdfans.com/?p=8210

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值