我知道PCI配置空间中的基地址寄存器(BAR)定义了PCI地址的起始位置,但该区域的大小是如何建立的?
当然这是硬件的属性,因为它只知道它可以处理的地址空间有多远.但是,我似乎无法在PCI配置结构中看到BAR大小字段.
pc3*_*c3e 11
首先,BAR大小必须是2的幂(例如,1 KiB,2 MiB),并且每个区域必须在存储器中对齐,使得log2(size)基址的低位始终为零.例如,假设端点具有4 KiB存储区,其地址范围为0-0xfff.主机可以将该区域的开头重新映射到fx,0x1000或者0xabcd000通过写入BAR寄存器,但不能写入0x1080或0xabcd100.
写入BAR寄存器时,端点将忽略LSB并始终在读取时返回零.因此,写入0xffffffff寄存器然后读回该值表示该区域的大小.对于4 KiB示例,它返回0xfffff00X(低4位保留,请参阅规范).确定大小:
0xfffff000)0xfff)0x1000 = 4096 bytes)这也适用于64位区域.下一个基地址寄存器的值形成基地址的MSB.这在PCI 3.0规范的6.2.5.1节中描述.