如何确定PCI/PCIe BAR尺寸?

Jef*_*ffV 9 pci pci-e

我知道PCI配置空间中的基地址寄存器(BAR)定义了PCI地址的起始位置,但该区域的大小是如何建立的?

当然这是硬件的属性,因为它只知道它可以处理的地址空间有多远.但是,我似乎无法在PCI配置结构中看到BAR大小字段.

pc3*_*c3e 11

首先,BAR大小必须是2的幂(例如,1 KiB,2 MiB),并且每个区域必须在存储器中对齐,使得log2(size)基址的低位始终为零.例如,假设端点具有4 KiB存储区,其地址范围为0-0xfff.主机可以将该区域的开头重新映射到fx,0x1000或者0xabcd000通过写入BAR寄存器,但不能写入0x10800xabcd100.

写入BAR寄存器时,端点将忽略LSB并始终在读取时返回零.因此,写入0xffffffff寄存器然后读回该值表示该区域的大小.对于4 KiB示例,它返回0xfffff00X(低4位保留,请参阅规范).确定大小:

  • 清除低四位为零(0xfffff000)
  • 反转所有32位(0xfff)
  • 在结果中添加一个(0x1000 = 4096 bytes)

这也适用于64位区域.下一个基地址寄存器的值形成基地址的MSB.这在PCI 3.0规范的6.2.5.1节中描述.


Jef*_*ffV 6

OSDev Wiki上找到答案:

"要确定PCI设备所需的地址空间量,必须保存BAR的原始值,将所有1的值写入寄存器,然后再读回."