Memory PCI Express条内存映射基本理解

Memory PCI Express条内存映射基本理解,memory,memory-management,dma,pci,pci-e,Memory,Memory Management,Dma,Pci,Pci E,我试图了解PCI Express的工作原理,以便编写一个windows驱动程序,该驱动程序可以在没有板载内存的情况下读取和写入自定义PCI Express设备 我了解PCIE配置空间中的基址寄存器(BAR)包含PCI Express应响应/允许写入的内存地址。(理解正确吗?) 我的问题如下: 在谈到PCIE时,与物理地址相比,“总线特定地址”是什么 何时以及如何在栏中填充地址?驱动程序是否负责分配内存并将地址写入外设条 将数据从外设传输到主机内存时是否使用DMA 谢谢你抽出时间 致以最诚挚的

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

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

我的问题如下:

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


致以最诚挚的问候,

从您的查询中可以清楚地看出,您希望为PCIe从设备编写驱动程序。为了了解PCIe传输背后发生的情况,internet上提供了很多内容(如PCIe总线枚举、到内存的外围地址映射等)

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

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

你的第三个问题很模糊。你是说从PCIe设备。假设是,您可以使用DMA控制器在从属PCIe设备和主机之间传输数据。
我正在从事一个项目,该项目涉及通过PCIe总线与主机连接的“PCIe DMA”。这取决于您的设计和实现。因此,在我的例子中,PCIe DMA本身就是通过PCIe连接到主机的目标板上的从PCIe设备。

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

这些条表示主机系统(CPU)与设备对话时看到的内存窗口。该设备不会写入该窗口,而只是响应TLP(事务层数据包)请求(MRd*,MWr*)

如果您的体系结构没有总线层传输机制,我会说“总线特定的”=“物理”地址。查看更多信息

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


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

这里是对您的疑问/问题的澄清

1> 有许多设备位于总线上,比如PCI,它以不同于物理地址的术语来看待Memory,这些被称为总线地址。 例如,若您正在初始化从总线上的设备到系统主存的DMA,那个么目标地址应该是Memmory中相同物理地址的对应总线地址

2> 条形图在枚举时填充,在典型的PC机中,当您的PCI感知frimware枚举插槽上的PCI设备并为条形图分配地址和大小时,它是在引导时填充的

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


--flyinghigh

您好,非常感谢您的回答。因此,“总线特定地址”与物理地址相同。例如,从主机和从PCIe设备上看,它们是相同的。非常欢迎。对您只需担心PCIe从属设备数据表中指定的寄存器地址。因此,一旦您将这些寄存器地址映射到系统内存,您就可以通过访问(读/写)映射的系统内存来访问PCIe设备寄存器。Hi@sumeet,此条形窗口是否在一个pci卡与另一个pci卡之间更改?我假设它不会改变,因为这是cpu用来获取pci卡物理地址的窗口,对吗?谢谢你的澄清Hi Claudio,这个条形窗口在一个pci卡到另一个pci卡之间会改变吗?我假设它不会改变,因为这是cpu用来获取pci卡物理地址的窗口,对吗?Hi@ransh,条形窗口大小由pci卡定义。此栏的位置取决于要设置的软件(BIOS或OS)。例如,一个PCI卡可能有1MB大小的BAR0,另一个PCI卡可能有16kB大小的BAR0。嗨,Cladio,谢谢。如果我理解正确,那么PCI配置空间中的“基址寄存器”(从cpu的角度指定设备内存的物理地址的寄存器)在用一个PCI卡更换另一个PCI卡时可能是相同的,根据pci设备特定寄存器和内存映射,只有该内存的内容+大小不同。如果错了,请纠正我。非常感谢!嗨,兰斯,也许还有些困惑。PCI配置空间(条形寄存器所在的位置)通常通过总线/设备/函数或linux(lspci)总线形式的特殊寻址进行访问:slot.func(00:01.0)。PCIe协议使用特殊数据包进行此类寻址(配置类型0/1读/写请求)。这些不是内存或IO空间访问(尽管访问它们的机制可能是…那是另一回事)。因此,如果您用另一个PCI卡(在同一插槽中)替换PCI卡,它们可能会使用相同的总线:插槽地址。希望这有帮助。克劳迪奥谢谢你的时间-非常感谢谁负责给定的酒吧地址?这取决于