繁体   English   中英

DMA传输到Linux中的从属PCI设备

[英]DMA transfer to a slave PCI device in Linux

我对使用PCIe设备进行DMA传输感到有些困惑。

举例来说,我有一个从属PCIe设备,并且我想使用DMA事务将数据块从该设备传输到RAM。 请注意,该设备是从设备,并且上面没有DMA“计算机”。

我知道我需要首先在RAM中获得一个DMA可用的缓冲区(通过分配一个连贯的缓冲区,或者通过映射一个页面)。

但是接下来呢? 从地址S到地址D启动N字节的DMA传输的API是什么?

现代系统是否可以向从属 pci设备发出DMA传输? 如果是的话,那是什么Linux API?


正如解释在这里

[ISA]在最初的IBM PC中,与ISA不同,PCI仅具有一个英特尔8237 DMA控制器。PCI体系结构没有中央DMA控制器。 相反,任何PCI组件都可以请求控制总线(“成为总线主控器”)并请求从系统内存中读取和写入数据

PCI总线没有“中央” DMA控制器-相反,每个设备都可以是DMA“控制器”。

首先,现代PC内没有奴隶和奴隶持有者。 有南桥(在PCI中)或根联合体(在PCI-express设备树的根中),还有其他一些PCI / PCIe actor,例如网桥,焊接芯片,插卡,硬件调试器等。我假设您是询问插入的卡或其他外围设备,例如焊接的声卡或以太网芯片。

根据对“事务层数据包”(TLP,“ PCIe的最上层”)的详细说明 ,有“总线主控权(DMA)”:

在PCIe上,它的异国情调明显减少了。 ...总线上的任何人都可以像根复合体一样在总线上发送读写TLP。 这允许外围设备直接访问CPU的内存(DMA)或与对等外围设备交换TLP(在交换实体支持的范围内)。

此外,插入的设备还具有DMA功能的一些优点: DMA攻击 PCIe被列为能够启动DMA传输的功能:

如果系统具有FireWire,ExpressCard,Thunderbolt或其他扩展端口(如通常的PCI和PCI-Express)将连接的设备直接连接到物理地址空间,则它们可能容易受到外部设备的DMA攻击。

我认为,没有用于编程从外围设备本身启动的DMA传输的通用API。 这取决于设备是什么,何时启动DMA以及将发送什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM