PCI Express BAR内存映射基本了解

时间:2014-01-03 10:12:27

标签: memory memory-management dma pci pci-e

我试图了解PCI Express的工作原理,因此我可以编写一个可以读取和写入自定义PCI Express设备的Windows驱动程序,而不需要板载内存。

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

我的问题如下:

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

感谢您的时间。

致以最诚挚的问候,

3 个答案:

答案 0 :(得分:17)

我也在使用定制主板开发设备驱动程序(尽管在linux上)。以下是我尝试回答您的问题:

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

如果您的架构没有总线层转换机制,我会说“特定于总线”=“物理”地址。查看this thread了解详情。

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

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

答案 1 :(得分:12)

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

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

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

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

答案 2 :(得分:6)

澄清你的怀疑/问题在这里。

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

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

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

- flyinghigh