PCIe协议

一、 PCIe基础知识

PCIe总线(协议简述):https://www.cnblogs.com/YINBin/p/10946247.html


PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。
与大多数总线一样,PCIe总线也包括电气属性和协议组成两部分。完整地了解PCIe是相对复杂的,所以从应用角度来讲,我先从基本的协议入手,对PCIe有个初步的认识。拓展学习可以参考官方协议规范文档《PCI Express Base Specification》。
PCIe 规范对于设备的设计采用分层的结构,有事务层、数据链路层和物理层组成,各层有都分为发送和接收两功能块。
在发送端,应用程序(设备核A)在事务层形成事务层包(TLP——Transaction Layer Package),储存在发送缓冲器里,等待推向下层。在数据链路层,在TLP 包上再串接一些附加信息,这些信息是对方接收TLP 包时进行错误检查要用到的,形成数据链路层包(DLLP——Data Link Layer Package);在物理层,对DLLP 包进行编码,占用链路中的可用通道,从发送器发送出去。
在接收端,实际上是发送端的“逆”过程。如果说发送端是在不断组包,那么接收端就是不断的拆包,最后提取出有用的数据信息供B设备的应用程序使用。



二、PCIe的Config空间与BAR空间

0.总结

把 PCIe 功能理解成一个“插卡设备”:

Config 空间:设备的“身份证 + 控制面板 + 资源申请单”。系统通过它发现设备、识别类型、配置命令、中断、电源,并读取 BAR。

BAR 空间:设备向系统申请的“地址窗口/门牌号”。系统给 BAR 分配一段主机物理地址后,CPU 访问这段地址,就等于访问设备内部的寄存器、FIFO、SRAM、Doorbell 等资源。


1.PCIe Config 空间

PCIe 每个 Function 都有独立的配置空间。传统 PCI 是 256 字节,PCIe 扩展到 4KB:

  • 0x000 ~ 0x0FF:PCI 兼容配置空间,前 64 字节是标准头。
  • 0x100 ~ 0xFFF:PCIe 扩展配置空间,如 PCIe Capability、AER、SR-IOV 等。

标准头里常见字段:

  • Vendor ID、Device ID:厂商和设备 ID。
  • Class Code:设备类型,如网卡、NVMe、桥。
  • Command、Status:使能 Memory/IO 空间、总线主控、中断等。
  • Header Type:普通设备 Type 0,桥 Type 1。
  • BAR0 ~ BAR5:基地址寄存器。
  • Capabilities Pointer:指向 MSI、MSI-X、PCIe 能力等。

访问方式:

  • 传统 x86:通过 IO 端口 0xCF8/0xCFC,只能访问前 256 字节。
  • PCIe 推荐:ECAM,通过 MMIO 访问全部 4KB。地址通常是:
ECAM_BASE + (bus << 20) + (dev << 15) + (func << 12) + offset

其中 bus/dev/func 就是 BDF。
Config 空间是标准化的,主要给 BIOS/OS 枚举和驱动管理用。


2.BAR 空间

BAR 寄存器本身位于 Config 空间 的 0x10 ~ 0x24。它描述设备需要的一段地址窗口:

  • 是 Memory BAR 还是 I/O BAR;
  • 是 32 位还是 64 位地址;
  • 是否可预取;
  • 需要多大空间;
  • 系统分配给它哪个基地址。

一个 Type 0 设备最多 6 个 32 位 BAR;如果是 64 位 BAR,会占用两个连续的 BAR 寄存器。

系统枚举时通常这样做:
1.保存 BAR 原值。
2.向 BAR 写全 1,例如 0xFFFFFFFF。
3.读回 BAR。
4.清除低 4 位属性位,取反加一,得到 BAR 空间大小。
5.分配一段未使用的物理地址。
6.把基地址写回 BAR。
7.设置 Command 寄存器的 Memory Space Enable 或 I/O Space Enable。

例如:

  • BAR0 写全 1 后读回 0xFFFF0000,说明大小是 0x10000,即 64KB,且需要 64KB 对齐。
  • 系统分配 0xFE000000,写入 BAR0。
  • 之后 CPU 访问 0xFE000000 + 0x100,就是访问设备内部偏移 0x100 的寄存器。

BAR 空间的特点是:

  • 大小由设备决定,可能几 KB,也可能几百 MB。
  • 地址由系统分配,必须对齐。
  • 多个 BAR 可以映射不同资源,例如 BAR0 寄存器,BAR1 MSI-X 表,BAR2 队列。
  • PCIe 推荐使用 Memory BAR,I/O BAR 已逐渐淘汰。
  • 必须使能 Command 中的 Memory/IO Space,设备才会响应 BAR 地址访问。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱德华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值