use*_*702 17 memory memory-management dma pci pci-e
我试图了解PCI Express如何工作,所以我可以编写一个Windows驱动程序,可以读取和写入没有板载内存的自定义PCI Express设备.
据我所知,PCIE配置空间中的基地址寄存器(BAR)保存了PCI Express应响应/允许写入的存储器地址.(这是正确的理解吗?)
我的问题如下:
我很感激你的时间.
最好的祝福,
Cla*_*dio 19
我也在使用自定义板设备驱动程序(尽管在Linux上).以下是我尝试回答您的问题:
BAR表示由主机系统(CPU)与设备通信所看到的存储器窗口.设备不会写入该窗口,而只是回答TLP(事务层数据包)请求(MRd*,MWr*).
如果您的架构没有总线层转换机制,我会说"特定于总线"="物理"地址.查看此主题以获取更多信息.
在迄今为止我使用的所有x86消费者PC中,BAR地址似乎是由BIOS或OS启动分配的.驱动程序必须使用已分配的任何地址.
DMA这个术语似乎被滥用而不是总线主控,我认为这是PCIe中的正确术语.在PCIe中,每个设备可以是总线主控器(如果在其命令寄存器位2中允许).它通过将MRd,MWr TLP发送到总线中的其他设备(但通常发送到系统存储器)并向CPU发送中断信号来实现.
小智 14
从您的查询中可以清楚地知道您要为PCIe从设备编写驱动程序.为了理解PCIe传输背后发生的事情的方案,互联网上有许多东西可用(如PCIe总线枚举,外围地址映射到存储器等).
是的,您对PCIe寄存器到内存的映射是正确的,您可以读/写它们.(例如,对于Linux PCIe设备驱动程序,您可以使用"ioremap"执行此操作).
地址总线用于指定物理地址.当处理器或启用DMA的设备需要读取或写入存储器位置时,它指定地址总线上的存储器位置.没有什么可以补充的."PCIe总线枚举"主题将回答您的第二个问题.
你的第三个问题很模糊.你的意思是奴隶PCIe设备.假设是,您可以使用DMA控制器在从PCIe设备和主机之间传输数据.我正在开发一个涉及通过PCIe总线与主机连接的"PCIe-DMA"的项目.真的取决于您的设计和实施.因此在我的情况下,PCIe-DMA本身是目标板上的从PCIe设备,通过PCIe连接到主机.
您的疑问/问题的澄清就在这里.
1>有许多设备像PCI一样位于总线上,它们看起来与物理地址不同,它们被称为总线地址.例如,如果您从坐在总线上的设备启动DMA到系统的主存储器,那么目标地址应该是Memmory中相同物理地址的相应总线地址
2> BARS在枚举时填充,在典型的PC中,它是在启动时,当PCI识别的frimware枚举PCI设备出现在插槽上并为BARS分配地址和大小时.
3>是的,您可以在这些BARS上同时使用DMA启动或CPU启动的操作.
- flyinghigh
归档时间: |
|
查看次数: |
49199 次 |
最近记录: |