Что такое сопоставление DMA и механизм DMA в контексте ядра Linux?

Что такое сопоставление DMA и механизм DMA в контексте ядра Linux? Когда API сопоставления DMA и API механизма DMA можно использовать в драйвере устройства Linux? Любой реальный пример драйвера устройства Linux в качестве эталона был бы великолепен.


person GeekyJ    schedule 25.12.2015    source источник
comment
Отображение DMA — это преобразование из виртуальной адресованной памяти в память, которая поддерживает DMA по физическим адресам (фактически по адресам шины). Вы должны прочитать документацию ядра для этого kernel.org/doc/Documentation /DMA-API-HOWTO.txt   -  person 0andriy    schedule 25.12.2015
comment
Извините, @AndyShevchenko Я понятия не имел, что вы разместили комментарий. Я писал ответ до вашего комментария. Надеюсь, вы не возражаете, что я ответил на вопрос.   -  person Punit Vara    schedule 25.12.2015


Ответы (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 в качестве эталона был бы великолепен.

Простой пример PCI DMA

Внутри ядра Linux вы можете найти различные реальные драйверы в drivers/dma.

person Punit Vara    schedule 25.12.2015
comment
Не могли бы вы указать драйвер в дереве исходного кода ядра на lxr.free-electrons.com для реального примера концепции? - person GeekyJ; 25.12.2015
comment
@JagsVG доволен или вы ожидаете чего-то другого? - person Punit Vara; 25.12.2015
comment
почему требуется карта памяти dma даже в тех случаях, когда движок dma находится в устройстве (например, в pci)? - person ransh; 07.02.2018

dmaengine — это общая структура ядра для разработки драйверов контроллера DMA.

Вы можете прочитать: поставщик dmaengine . Вы можете найти множество примеров драйверов dmaengine в разделе drivers/dma.

person stdcall    schedule 25.12.2015
comment
Нужен ответ и на первую часть вопроса. Смотрите мой комментарий выше. - person 0andriy; 25.12.2015