Что такое сопоставление DMA и механизм DMA в контексте ядра Linux? Когда API сопоставления DMA и API механизма DMA можно использовать в драйвере устройства Linux? Любой реальный пример драйвера устройства Linux в качестве эталона был бы великолепен.
Что такое сопоставление DMA и механизм DMA в контексте ядра Linux?
Ответы (2)
Что такое сопоставление DMA и механизм DMA в контексте ядра Linux?
Ядро обычно использует виртуальный адрес. Такие функции, как kmalloc()
, vmalloc()
, обычно возвращают виртуальный адрес. Его можно сохранить в void*
. Система виртуальной памяти преобразует эти адреса в физические адреса. Эти физические адреса на самом деле бесполезны для драйверов. Драйверы должны использовать ioremap()
для сопоставления пространства и создания виртуального адреса.
CPU CPU Bus
Virtual Physical Address
Address Address Space
Space Space
+-------+ +------+ +------+
| | |MMIO | Offset | |
| | Virtual |Space | applied | |
C +-------+ --------> B +------+ ----------> +------+ A
| | mapping | | by host | |
+-----+ | | | | bridge | | +--------+
| | | | +------+ | | | |
| CPU | | | | RAM | | | | Device |
| | | | | | | | | |
+-----+ +-------+ +------+ +------+ +--------+
| | Virtual |Buffer| Mapping | |
X +-------+ --------> Y +------+ <---------- +------+ Z
| | mapping | RAM | by IOMMU
| | | |
| | | |
+-------+ +------+
Если устройство поддерживает DMA, драйвер устанавливает буфер, используя kmalloc
или аналогичный интерфейс, который возвращает виртуальный адрес (X). Система виртуальной памяти сопоставляет X с физическим адресом (Y) в системной оперативной памяти. Драйвер может использовать виртуальный адрес X для доступа к буферу, но само устройство не может, поскольку DMA не проходит через систему виртуальной памяти ЦП. В некоторых системах только Устройство может напрямую выполнять DMA по физическому адресу. В некоторых системах аппаратное обеспечение IOMMU используется для преобразования адреса DMA в физический адрес. Посмотрите на рисунок выше. Он преобразует Z в Y.
Когда API сопоставления DMA можно использовать в драйвере устройства Linux?
Причина использования API сопоставления DMA заключается в том, что драйвер может возвращать виртуальный адрес X интерфейсу, такому как dma_map_single()
, который устанавливает любое необходимое сопоставление IOMMU и возвращает адрес DMA Z. Затем драйвер сообщает устройству выполнить DMA для Z, а IOMMU сопоставляет его с буфер по адресу Y в системной оперативной памяти.
Ссылка взята из этой ссылки.
Любой реальный пример драйвера устройства Linux в качестве эталона был бы великолепен.
Внутри ядра Linux вы можете найти различные реальные драйверы в drivers/dma.
dmaengine — это общая структура ядра для разработки драйверов контроллера DMA.
Вы можете прочитать: поставщик dmaengine . Вы можете найти множество примеров драйверов dmaengine в разделе drivers/dma.