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)

  1. bit[0]:指明类型,对系统软件只读,0代表MMIO(Memory),1代表端口IO(IO)

  2. bit[3:1] : 指明属性

    1. bit[2:1]

      • 如果 bit[2:1] = 00b,表明系统软件需要为该资源分配一个32位的地址
      • 如果 bit[2:1] = 10b,表明系统软件需要为该资源分配一个64位的地址
    2. 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[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数据区域 设备寄存器、中断状态、配置空间
  1. bit[6:4],不可更改,必须设置为0

  2. 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的类型和读写类型:

  1. fmt

    1. 000 - Read

    2. 010 - Write

  2. style

    1. 00100 - Type0(非桥设备,如EP)

    2. 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)
posted @ 2025-07-16 09:19  midorii  阅读(39)  评论(0)    收藏  举报