什么是BAR寄存器:
BAR寄存器是基地址寄存器。
BAR寄存器的作用:
通过BAR寄存器,我们首先知道这个基址对应的空间属性,然后给这段空间分配一个基址(这个基址只是用来路由寻址用的,不能和存储器空间的地址搞混,很多软件实现上会把两个地址设置成一样,但是本质上没有任何关系,只是TLP寻址的时候用的!)。这样的话,TLP就能根据地址被路由到对应设备的BAR空间中去。比如说现在有一个mem read request,如果路由地址(地址信息包含在TLP中)是0x71000000,而有一个设备func0的mem空间范围是0x70000000~0x80000000,那么这个TLP就会被这个func处理。从func0的0x71000000对应的地址读取相应数据。
设备在系统的PCI地址空间里申请一段来用,所申请的空间基址和大小保存在BAR寄存器里。
BAR里的只是PCI域的地址空间,需要映射到IO地址空间里或者内存地址空间里之后软件才能使用。映射到IO空间的话,用IO读写指令和函数去访问设备;映射到内存空间的话,首先得到的是物理地址,映射到虚拟地址后就可以像用指针那样访问。
1,BAR寄存器的数据格式,BAR寄存器表示的设备存储类型有memory space BAR和IO space BAR两种,
对于memory space BAR,数组格式如下面所示
31-----------------------------------4 | 3 | 2-1 | 0
16-Byte aligned Base Adress prefetchable Type always 0
--bit0 为 0表示 memory,为 1 表示 IO
--bit2-1 为10 表示 64 bit decode,为00 表示 32 bit decode
--bit3 为1 表示 prefetchable ,为0 表示 non-prefetchable
对于IO space BAR,数组格式如下所示
31-----------------------------------2 | 1 | 0
4-Byte Aligned Base Address reserve always 0
对于memory space BAR的16-Byte aligned Base Address 这里的Base Address代表的是16个byte数据的地址
对于IO space BAR的4-Byte aligned Base Address这里的BaseAddress代表的是4个byte数据的地址