PCI基础
+ -

PCI配置头寄存器

2026-06-24 3 0

PCI Type 00h Configuration Space Header是PCI/PCIe设备(Endpoint)配置空间最开头64字节的标准区域。它相当于设备的“电子身份证”和“资源申请书”,操作系统通过读取这部分信息来识别设备、了解其功能需求,并为其分配系统资源。

这个Header位于每个PCI/PCIe设备配置空间的偏移地址0x00到0x3C处,总共占用64字节(0x40)

偏移地址 (Offset) 寄存器/字段 核心功能与说明
0x00 Vendor ID & Device ID 设备身份证。Vendor ID由PCI-SIG分配给厂商(如Intel是0x8086),Device ID由厂商自定义。系统据此识别设备并加载驱动。
0x04 Command & Status 设备控制与状态。Command寄存器控制设备是否响应I/O/内存访问、能否作为总线主控等。Status寄存器记录设备产生的各种事件和错误状态。
0x08 Revision ID & Class Code 设备分类与版本。Class Code(3字节)定义了设备类型(如网卡、显示控制器、存储控制器),让系统能匹配通用驱动。
0x0C Header Type 标识Header类型。其值决定后续布局,值为0x00即表示当前讨论的Type 0 Header(适用于Endpoint设备)。Bit 7指示是否为多功能设备。
0x10 - 0x24 Base Address Registers (BARs) 资源申请窗口。共6个32位寄存器,用于向系统声明设备需要多少I/O或内存空间。系统枚举时会读取这些BAR,然后分配地址并回填。
0x2C Subsystem Vendor/Device ID 板卡级标识。标识具体板卡制造商和型号,当芯片用在第三方板卡时提供更精确的信息。
0x30 Expansion ROM Base Address 扩展ROM基址。若设备有固件(如显卡BIOS),此寄存器指向其地址。
0x34 Capabilities Pointer 能力链表指针。指向一个链表,其中列出了设备支持的额外高级功能(如PCIe、MSI中断、电源管理等)。
0x3C Interrupt Line/Pin 中断配置。Interrupt Line记录系统分配的中断号,Interrupt Pin则说明设备使用了哪个中断引脚。

一、基本信息

  • 位置:每个PCI/PCIe设备配置空间的偏移0x00 ~ 0x3F,共64字节。
  • 作用:这是操作系统识别设备、分配资源、加载驱动、控制中断的唯一入口依据
  • 适用对象:Header Type寄存器的低7位 = 0x00,表示本设备是Endpoint(终端设备),而非桥设备(桥设备用的是Type 1 Header)。

二、身份识别区(0x00 ~ 0x0B)

偏移 内容 一句话功能
0x00 ~ 0x01 Vendor ID 厂商ID(如Intel=0x8086),由PCI-SIG分配,全球唯一。
0x02 ~ 0x03 Device ID 设备型号ID,由厂商自定,用于精确匹配驱动。
0x08 Revision ID 芯片硬件版本号,驱动可据此做版本兼容处理。
0x09 ~ 0x0B Class Code(3字节) 设备分类:大类(如0x03显卡)、子类(如0x00 VGA)、编程接口(如AHCI/NVMe),让系统能挂载通用驱动。

注意:0x04 ~ 0x07是控制/状态寄存器,0x0C是Header Type,所以身份识别字段在物理上不是完全连续的,但逻辑上属于“设备是谁”这一组。


三、控制与状态区(0x04 ~ 0x07,共2个16位寄存器)

  • Command Register(0x04):系统通过写这里开关设备功能

    • Bit 0 = I/O空间使能
    • Bit 1 = 内存空间使能(这两位置1后,BAR分配的地址才生效)
    • Bit 2 = 总线主控使能(关键位,置1才允许设备发起DMA传输)
    • Bit 6 = 奇偶校验错误响应
    • Bit 8 = 系统错误(SERR)使能
  • Status Register(0x06):设备向系统汇报状态,多位是“粘滞”的(需写1清零)。

    • Bit 14 = 已发出系统错误信号
    • Bit 8 = 主控数据传输奇偶校验错误
    • Bit 5 = 64位寻址能力
    • Bit 4 = 支持快速背靠背传输

四、资源申请区 —— BAR(0x10 ~ 0x24,共6个32位寄存器)

这是最核心的资源分配机制:

  • 6个BAR,每个32位。若设备支持64位寻址,则两个BAR合并为一个64位BAR,因此实际数量可能减少。
  • BAR的Bit 0是只读的,用来区分类型
    • Bit 0 = 0 → 申请内存空间(此时Bit 1~2还指示是否64位、是否预取)
    • Bit 0 = 1 → 申请I/O空间
  • 系统枚举过程:系统向BAR写全1再读回 → 硬件会固定返回地址大小的编码(低位不可写) → 系统解码得到所需空间大小(必须为2的幂且对齐)→ 在物理地址空间中划出该区域,再将基址写回BAR。

一个设备可以同时拥有内存BAR和I/O BAR,但现代PCIe设备几乎全用内存BAR。


五、扩展与能力区(0x2C ~ 0x34)

  • Subsystem Vendor ID & Subsystem Device ID(0x2C ~ 0x2F)

    • 当同一颗PCI芯片用在不同厂商的板卡上时,这两个ID标识具体板卡的制造商和型号,某些驱动需要靠它们做精确识别。
  • Expansion ROM Base Address(0x30)

    • 指向设备自带的固件(如显卡VBIOS、网卡PXE启动ROM)的基址。系统在POST早期会执行该ROM代码进行初始化或引导。
  • Capabilities Pointer(0x34)

    • 关键扩展指针,指向一个以链表形式组织的能力(Capability)结构。
    • 链表每个节点包含:能力ID(如PCIe能力、MSI中断能力、电源管理能力)、能力相关寄存器、指向下一节点的指针。
    • 系统通过遍历该链表,动态发现设备支持的所有高级特性,无需修改固定的Header结构,这是PCI/PCIe能不断扩展新功能的核心设计。

六、中断与头部类型(0x0C, 0x3C ~ 0x3F)

  • Header Type(0x0C)

    • 低7位 = 0x00 → 表示这是Type 0 Header(本文章所述)。
    • Bit 7 = 1 表示多功能设备(需额外枚举各功能);= 0 表示单功能设备。
  • Interrupt Pin(0x3D)

    • 只读,告诉系统该设备使用的是INTA、INTB、INTC还是INTD硬件中断引脚。
  • Interrupt Line(0x3C)

    • 可读写,系统在完成中断路由后,会将分配给该设备的IRQ号写入这里。驱动程序读取它,就知道自己要响应哪个中断号。

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!