文章首发于公众号: PCIe—预取和非预取 更多干货文末扫码关注公号。
Prefetchable:设备可以先把未来可能需要的数据预取到自己的缓冲区中,并在需要时直接使用,从而减少对主系统内存的访问。这可以提高设备的读取性能,尤其对于需要较大数据块的设备来说。可预取的数据通常以缓存行(cacheline)的形式进行处理,这样设备可以在需要时迅速获取。
nonprefetchable:设备每次只能从系统内存中读取特定数据,不能预先将数据缓存起来。这样的读取行为通常发生在具有特殊需求的设备上,例如DMA(Direct Memory Access)控制器,其需要获取实时的、即时的数据,而不需要进行缓存.
强烈建议映射到内存空间的资源尽可能设计为可预取的。
Pcie规范鼓励请求大量内存空间的bar设置为可预取,因为在大多数可扩展平台上,可预取内存空间更充裕。
通过BAR请求内存资源的PCI Express Endpoint必须设置BAR的Prefetchable位,除非该范围包含具有读副作用的空间或该EP不允许写合并的空间,例如,如果请求者请求从一个地址读取128个字节,则Completer可能也会预取下一个128字节,以便在被请求时将其放在手边以提高性能。因此可预取必须有两个特性:读数据无副作用和允许写合并
对于PCI Express Endpoint,所有具有可预取的bar必须支持64位寻址,对于no-Prefetchable的bar,允许32位寻址。
预取位在BAR寄存器中bit3: