BAR寄存器

 

BAR寄存器:

  • Base Address Register0~5:即BAR寄存器,保存PCI设备使用的地址空间的基地址,保存设备在PCI总线域中的地址,每个设备最多可以有6个基址空间;
  • PCI设备复位之后,存放PCI设备需要使用的基地址空间大小,该空间是I /O空间还是存储器空间等信息;
  • 软件对PCI总线进行配置时,首先获得BAR寄存器中的初始化信息,之后根据处理器系统的配置,将合理的基地址写入相应的BAR寄存器中;系统软件还可以使用该寄存器,获得PCI设备使用的BAR空间的长度,通过向BAR寄存器写入0xFFFF-FFFF,之后再读取该寄存器实现;
  • 处理器访问PCI设备的BAR空间时,需要使用BAR寄存器提供的基地址;但处理器使用存储器域的地址,而BAR寄存器存放PCI总线域的地址,因此处理器系统并不能直接使用“BAR寄存器+偏移”的方式访问PCI设备的寄存器空间,而需要将PCI总线域的地址转换为存储器域的地址;
  • 即使x86处理器系统使能了IOMMU,这两个地址也并不一定相等,因此处理器系统直接使用这个PCI总线域的物理地址,并不能确保访问PCI设备BAR空间的正确性;除此之外在Linux系统中,ioremap函数的输入参数为存储器域的物理地址,而不能使用PCI总线域的物理地址;
  • 而在pci_dev -> resource[bar].start参数中保存的地址已经经过PCI总线域到存储器域的地址转换,因此在编写Linux系统的设备驱动程序时,需要使用pci_dev -> resource[bar].start参数中的物理地址,然后再经过ioremap函数将物理地址转换为“存储器域”的虚拟地址,再访问;
上一篇:PXIe,PXI,CPCI相互区别和关系,总线之间,几种机箱之间是否兼容?


下一篇:计算机网络体系结构(5)计算机网络分层结构