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

当然,这是硬件的属性,因为只有它知道它可以处理到其地址空间中的距离。但是,我似乎看不到PCI配置结构中的BAR大小字段。

最佳答案

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

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


将低四位清除为零(0xfffff000
反转所有32位(0xfff
将一加到结果(0x1000 = 4096 bytes


这也适用于64位区域。下一个基址寄存器的值形成基址的MSB。 PCI 3.0规范的第6.2.5.1节对此进行了描述。

关于pci - 如何确定PCI/PCIe BAR大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19006632/

10-12 21:33