PCIe【4】地址空间
1. 概述
PCIe设备可以分配到哪些地址空间?
-
Configuration Space
-
用于设备初始化和配置管理
-
从PCI的
256B
到PCIe的4KB
-
-
Memory Space
-
用于数据传输
-
支持直接内存访问(DMA),允许设备直接读取或写入系统内存,减少CPU干预
-
-
I/O Space(现在基本不用I/O空间了,都是用Memory空间)
-
Message Space
- 实际上并不是一种独立的地址空间类型,而是PCIe引入的一种新的中断机制——消息信号中断(MSI/MSI-X)
2. Base Address Registers
每个PCI设备都有一组BARs,用于定义设备可以访问的内存区域。这些BARs在设备初始化时由BIOS配置,但有时候这些配置可能不是最优的,或者与操作系统的需求不兼容。
2.1 基础概念
基址寄存器(BAR)的主要作用是通过BAR寄存器实现主机与设备之间的地址转换机制,其位于配置空间的第4个双字开始。从PCI设备的角度来说,他只能看到自己的PCI域空间,不知道主机是无法直接被os所操作的,因此需要将其转换为os可以操作的空间。BAR映射模式就是这样一种转换机制,操作系统通过MMU将BAR映射的物理地址转换为进程可访问的虚拟地址。
-
不同设备的BAR分配不同的地址范围,彼此独立,不相互影响。
-
系统会根据需求动态的进行分配,支持热插拔和即插即用。
PCIe 桥类型设备,即PCIe Root Complex和PCIe Switch,包含1型配置头(Type 1 configuration header)
PCIe 非桥类型设备,例如PCIe Endpoint,包含0型配置头(Type 0 configuration header)
-
bit[0]:指明类型,对系统软件只读,0代表MMIO(Memory),1代表端口IO(IO)
-
bit[3:1] : 指明属性
-
bit[2:1]
- 如果 bit[2:1] = 00b,表明系统软件需要为该资源分配一个32位的地址
- 如果 bit[2:1] = 10b,表明系统软件需要为该资源分配一个64位的地址
-
bit[3]
- 如果 bit[3] = 1b,表明该资源是prefetchable(预取内存)的,即可以提前加载到缓存,
BAR |= PCI_BASE_ADDRESS_MEM_PREFETCH;
- 如果 bit[3] = 0b,表明该资源是non-prefetchable(非预取内存)的,BAR默认是非预取的。
lspci -vvv -s <BDF>
|pci_resource_flags()
- 如果 bit[3] = 1b,表明该资源是prefetchable(预取内存)的,即可以提前加载到缓存,
-
注意:当 bit[2:1] = 10b 时,相邻的两个基址寄存器(Base Address Registers)会合并为 1 个,即 BAR0 和 BAR1 合并为 1 个,BAR2 和 BAR3 合并为 1 个,BAR4 和 BAR5 合并为 1 个。其中,BAR1、BAR3 和 BAR5 用保存 64 位地址的高 32 位。
场景 | 预取内存 | 非预取内存 |
---|---|---|
数据特性 | 可缓存、可预读,写入可合并 | 严格按序访问,写入立即生效 |
地址范围 | 64位(支持高位内存) | 32位 |
性能影响 | 高吞吐、低延迟(适合大数据) | 低吞吐、高延迟(适合控制操作) |
典型应用 | 显存、DMA缓冲区、NVMe数据区域 | 设备寄存器、中断状态、配置空间 |
-
bit[6:4],不可更改,必须设置为0
-
bit[31:7]/bit[63:7] : 指明资源大小。
-
bit[31:7],I/O类型或32位地址的MMIO类型
-
bit[63:7],64位地址的MMIO类型
-
2.2 Type0 & Type1型配置请求
TLP包中的fmt和style字段决定Type的类型和读写类型:
-
fmt
-
000 - Read
-
010 - Write
-
-
style
-
00100 - Type0(非桥设备,如EP)
-
00101 - Type1(桥设备,Root和Switch端口中的P2P桥)
-
PCIe协议规定,只有RC可以发出配置空间的读写请求。当RC发出一个Type 1类型的读写请求时,PCIe桥设备会判断该读写请求的BDF中的Bus号是否与下一级总线号相等,如果相等,将类型变为Type 0并发到下一级;如果处于下一级Bus号到最后一级Bus号中间,则以Type 1的类型继续转发下去;否则,直接忽略。
2.3 寄存器偏移
之所以每个PCIe设备包含多个BAR,是因为每个BAR就对应了设备的一段内存空间或I/O空间,例如,显卡的显存可能映射到BAR0,而控制寄存器则有可能映射到BAR1。
寄存器偏移 | 对应BAR | 典型用途 |
---|---|---|
0x10 | BAR0 | 设备内存或I/O区域 |
0x14 | BAR1 | 扩展内存或功能寄存器 |
0x18 | BAR2 或 64位 BAR1 的高位部分 | 设备特定功能 |
0x20 | BAR4(64位设备) | 高位地址部分 |
0x24 | BAR5 / 扩展空间 | 设备特殊功能或 MSI-X 表 |
0x30 | Expansion ROM BAR | 设备固件或启动代码(如 GPU VBIOS) |