我知道PCI配置空间中的基址寄存器(BAR)定义了PCI地址的起始位置,但是如何确定该区域的大小?
当然,这是硬件的属性,因为只有它知道它可以处理到其地址空间中的距离。但是,我似乎看不到PCI配置结构中的BAR大小字段。
最佳答案
首先,BAR大小必须为2的幂(例如1 KiB,2 MiB),并且每个区域必须在内存中对齐,以使基址的低log2(size)
位始终为零。例如,假设一个端点有一个4 KiB的存储区,其地址范围为0-0xfff
。主机可以将该区域的开头重新映射到f.x。通过写入BAR寄存器,而不写入0x1000
或0xabcd000
来0x1080
或0xabcd100
。
写入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/