Драйвер устройства ядра Linux для DMA в пространство ядра

LDD3 (p: 453) демонстрирует dma_map_single с использованием буфера, переданного в качестве параметра.

bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir);

Q1 : Что / где это делает буфер поступает из?

kmalloc ?

Q2 : Почему в DMA-API-HOWTO.txt указано, что я могу использовать необработанный kmalloc в DMA?

Form http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt

L: 51 Если вы приобрели свою память через распределитель страниц kmalloc (), то вы можете DMA в / из этой памяти используя адреса, возвращаемые этими подпрограммами.

L: 74 вы не можете принять ответ на вызов kmap () и DMA в / из этого.

  1. Чтобы я мог передать адрес, возвращенный из kmalloc , на мое аппаратное устройство?
  2. Или мне сначала запустить на нем virt_to_bus ?
  3. Или мне передать это в dma_map_single ?

Q3 : Могу ли я прочитать данные в драйвере ядра по адресу kmalloc , когда передача DMA завершится?

addr = kmalloc(...);
...
printk("test result : 0x%08x\n", addr[0]);

Q4 : Как лучше всего поместить это в пространство пользователя?

  1. copy_to_user ?
  2. mmap память kmalloc?
  3. другие?

8
задан Ian Vaughan 6 April 2011 в 09:39
поделиться