Это то, что "dma_map_single" просто преобразует виртуальный адрес в физический?

(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 заявляет, что я могу использовать rawkmalloc в DMA в?

формаhttp://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt

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

L: 74 вы не можете получить возврат вызова kmap () и прямого доступа к памяти от / до этого.

Так что я могу передать адрес, возвращенный сkmalloc на мое аппаратное устройство?Или я должен бежатьvirt_to_bus на первом?Или я должен передать это вdma_map_single?

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

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

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

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