Это то, что "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?другие?