19

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

我了解 PCIE 配置空间中的基地址寄存器 (BAR) 保存 PCI Express 应响应/允许写入的内存地址。(理解正确吗?)

我的问题如下:

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

我很感激你的时间。

此致,

4

3 回答 3

23

我还在使用自定义板开发设备驱动程序(尽管在 linux 上)。这是我回答您的问题的尝试:

BAR 代表主机系统 (CPU) 看到的与设备通信的内存窗口。设备不会写入该窗口,而只会回答 TLP(事务层数据包)请求(MRd*、MWr*)。

如果您的架构没有总线层转换机制,我会说“总线特定”=“物理”地址。检查此线程以获取更多信息。

到目前为止,在我使用的所有 x86 消费类 PC 中,BAR 地址似乎是由 BIOS 或在操作系统启动时分配的。驱动程序必须使用已分配的任何地址。

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

于 2014-02-07T16:35:42.277 回答
17

从您的查询中可以清楚地看出您想要为 PCIe 从设备编写驱动程序。要了解 PCIe 传输背后发生的事情的方案,互联网上有很多东西可用(如 PCIe 总线枚举、外设地址映射到内存等)。

是的,您对 PCIe 寄存器到内存的映射的​​理解是正确的,您可以读/写它们。(例如,在 linux PCIe 设备驱动程序的情况下,您可以使用“ioremap”来执行此操作)。

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

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

于 2014-01-11T18:04:01.983 回答
9

澄清您的疑虑/问题在这里。

1> 有许多设备位于总线上,例如 PCI,它以不同于物理地址的术语来看待内存,这些设备称为总线地址。例如,如果您从位于总线上的设备启动 DMA 到系统的主内存,则目标地址应该是内存中相同物理地址的相应总线地址

2> BARS 在枚举时被填充,在典型的 PC 中,当您的 PCI 感知固件枚举 PCI 设备出现在插槽上并将地址和大小分配给 BARS 时,它是在引导时。

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

——高飞

于 2014-02-19T09:02:38.583 回答