【PCI】BDF&配置空间、PCIe Memory 、IO 地址空间

一、BDF&配置空间

  系统在启动过程中会枚举所有的pcie设备,当这些设备加载完成之后,软件上是根据什么信息来找到其中的某一设备的呢?就是BDF,即 Bus number、Devicesnumber、Function number。如下图中 Bus number 为 01,Devicesnumber 为 00,Function number 为 0。
在这里插入图片描述
  每一个 PCIe 设备可以只有一个功能(Function),即 Fun0。也可以拥有最多 8 个功能,即多功能设备(Multi-Fun)。不管这个 PCIe 设备拥有多少个功能,其每一个功能都有一个唯一独立的配置空间(Configuration Space)与之对应。
看一下 PCI 配置空间具体信息如下

在这里插入图片描述
  配置空间类型分为两种,一种为EP(设备)、一种为桥片,共为256字节。在引入 PCIe 时,原始的256字节配置区域没有足够的空间来容纳所有需要的新能力结构。因此,配置空间的大小从每个功能的 256 字节扩展到 4KB,称为扩展配置空间(Extended Configuration Space)。
  在 BDF 中,Bus Number占用 8 位,Device Number占用 5 位,Function Number占用 3 位。显然,PCIe总线最多支持256个子总线,每个子总线最多支持32个设备,每个设备最多支持 8 个功能。因此配置空间最大为 256bus * 32device * 8function * 4KB = 256M,服务器上可以通过 /proc/iomem 查看地址范围:
在这里插入图片描述

二、Memory Address Space(存储器地址空间)

  Memory Address Space 是一块用于访问设备内存区域的地址范围。PCI设备可以通过读写事务与系统的主存储器进行数据交换。
  使用存储器地址空间时,设备的内存被视为系统内存的一部分,设备可以像读写主存储器一样读写这些内存区域。
  在Linux中,设备驱动程序可以通过内核提供的函数(如ioremap)将设备的存储器地址空间映射到内核虚拟地址空间中。然后,驱动程序可以使用指针对这些内存区域进行读写操作,也可以使用devmem 命令来直接进行读写物理地址。

三、I/O Address Space(I/O地址空间)

  I/O Address Space 是一块用于访问设备的I/O端口的地址范围。PCI设备可以通过读写事务与系统的I/O地址空间进行数据交换。
  使用I/O地址空间时,设备的I/O端口被视为系统的一部分,设备可以像读写常规I/O端口一样读写这些端口。
  在Linux中,设备驱动程序可以使用函数(如inb、outb)来读写设备的I/O端口。例如,在串口设备驱动程序中,可以使用I/O地址空间中的inb和outb函数来读取和写入串口的数据寄存器。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值