Передача DMA на ведомое PCI-устройство в Linux - PullRequest
1 голос
/ 25 ноября 2011

Я немного сбит с толку в отношении передач DMA с устройства PCIe.

Скажем, например, у меня есть подчиненное устройство PCIe, и я хочу передать блок данных с устройства в ОЗУ, используя транзакцию DMA. Обратите внимание, что устройство является подчиненным, и на нем нет «машины» DMA.

Я знаю, что мне нужно сначала получить в ОЗУ буфер, способный к DMA (либо путем выделения связного, либо путем отображения страницы).

Но что дальше? Что такое API для запуска передачи DMA N байтов с адреса S на адрес D?

Могут ли современные системы выдавать передачу DMA на / с подчиненного pci устройства? если да, то каков для этого Linux API?


Как объяснено здесь :

[ISA] В оригинальном IBM PC был только один контроллер Intel 8237 DMA [...] Архитектура PCI не имеет центрального контроллера DMA, в отличие от ISA. Вместо этого любой компонент PCI может запросить управление шиной («стать мастером шины») и запросить чтение и запись в системную память

Шина PCI не имеет "центрального" контроллера DMA - вместо этого каждое устройство может быть "контроллером" DMA.

1 Ответ

0 голосов
/ 09 июня 2012

Прежде всего, в современном ПК нет рабов и рабовладельцев.Есть южный мост (в PCI) или Root Complex (корень дерева устройств PCI-express), и есть некоторые другие участники PCI / PCIe, такие как мосты, припаянные чипы, подключенные карты, аппаратные отладчики и т. Д. Я предполагаю, что выспрашивать о подключенной карте или каком-либо другом периферийном устройстве, таком как припаянная звуковая карта или чип Ethernet.

Согласно этому подробному описанию «Transaction Layer Packet» (TLP, «самый верхний уровень PCIe»)есть "Bus Mastership (DMA)":

На PCIe это значительно менее экзотично.... любой в автобусе может отправлять чтение и запись TLP в автобусе, точно так же, как Корневой Комплекс.Это позволяет периферийному устройству получать прямой доступ к памяти ЦП (DMA) или обмениваться TLP с одноранговыми периферийными устройствами (в той степени, в которой это поддерживают коммутирующие объекты).

Кроме того, есть некоторые преимущества возможности DMA отподключенные устройства: атака DMA .И PCIe указан как способный инициировать передачу DMA:

Системы могут быть уязвимы для атаки DMA от внешнего устройства, если у них есть FireWire, ExpressCard, Thunderbolt или другой порт расширения, такой как PCIи PCI-Express в общем случае подключает подключенные устройства непосредственно к физическому адресному пространству.

Я думаю, что нет универсального API для программирования передач DMA, которые инициируются с самого периферийного устройства.Это зависит от того, что представляет собой устройство, когда должен быть запущен DMA и что будет отправлено.

...