簡體   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