PCI Express BAR内存映射基本了解

use*_*702 17 memory memory-management dma pci pci-e

我试图了解PCI Express如何工作,所以我可以编写一个Windows驱动程序,可以读取和写入没有板载内存的自定义PCI Express设备.

据我所知,PCIE配置空间中的基地址寄存器(BAR)保存了PCI Express应响应/允许写入的存储器地址.(这是正确的理解吗?)

我的问题如下:

  • 在讨论PCIE时,与物理地址相比,什么是"总线专用地址"?
  • BAR何时以及如何填充地址?驱动程序是否负责分配内存并将地址写入外设BAR?
  • 将数据从外设传输到主机内存时是否使用DMA?

我很感激你的时间.

最好的祝福,

Cla*_*dio 19

我也在使用自定义板设备驱动程序(尽管在Linux上).以下是我尝试回答您的问题:

BAR表示由主机系统(CPU)与设备通信所看到的存储器窗口.设备不会写入该窗口,而只是回答TLP(事务层数据包)请求(MRd*,MWr*).

如果您的架构没有总线层转换机制,我会说"特定于总线"="物理"地址.查看此主题以获取更多信息.

在迄今为止我使用的所有x86消费者PC中,BAR地址似乎是由BIOS或OS启动分配的.驱动程序必须使用已分配的任何地址.

DMA这个术语似乎被滥用而不是总线主控,我认为这是PCIe中的正确术语.在PCIe中,每个设备可以是总线主控器(如果在其命令寄存器位2中允许).它通过将MRd,MWr TLP发送到总线中的其他设备(但通常发送到系统存储器)并向CPU发送中断信号来实现.

  • 嗨ransh,也许还有一些混乱.PCI配置空间(BAR寄存器所在的位置)通常通过特殊寻址访问,该寻址以总线/设备/功能或linux(lspci)总线:slot.func(00:01.0)的形式出现.PCIe协议使用特殊数据包进行此类寻址(配置类型0/1读/写请求).这些不是内存或IO空间访问(尽管访问它们的机制可能是......这是另一个故事).因此,如果您更换PCI卡(在同一插槽中),他们可能会使用相同的总线:插槽地址.希望这可以帮助.克劳迪奥 (3认同)

小智 14

从您的查询中可以清楚地知道您要为PCIe从设备编写驱动程序.为了理解PCIe传输背后发生的事情的方案,互联网上有许多东西可用(如PCIe总线枚举,外围地址映射到存储器等).

是的,您对PCIe寄存器到内存的映射是正确的,您可以读/写它们.(例如,对于Linux PCIe设备驱动程序,您可以使用"ioremap"执行此操作).

地址总线用于指定物理地址.当处理器或启用DMA的设备需要读取或写入存储器位置时,它指定地址总线上的存储器位置.没有什么可以补充的."PCIe总线枚举"主题将回答您的第二个问题.

你的第三个问题很模糊.你的意思是奴隶PCIe设备.假设是,您可以使用DMA控制器在从PCIe设备和主机之间传输数据.我正在开发一个涉及通过PCIe总线与主机连接的"PCIe-DMA"的项目.真的取决于您的设计和实施.因此在我的情况下,PCIe-DMA本身是目标板上的从PCIe设备,通过PCIe连接到主机.


fly*_*igh 7

您的疑问/问题的澄清就在这里.

1>有许多设备像PCI一样位于总线上,它们看起来与物理地址不同,它们被称为总线地址.例如,如果您从坐在总线上的设备启动DMA到系统的主存储器,那么目标地址应该是Memmory中相同物理地址的相应总线地址

2> BARS在枚举时填充,在典型的PC中,它是在启动时,当PCI识别的frimware枚举PCI设备出现在插槽上并为BARS分配地址和大小时.

3>是的,您可以在这些BARS上同时使用DMA启动或CPU启动的操作.

- flyinghigh

  • 谁可以给定BAR地址?是否取决于pci卡?还是选择地址的cpu(以便如果我用另一张卡替换我可能会得到相同的地址)? (2认同)