Driver de dispositivo do kernel Linux para DMA no espaço do kernel

LDD3 (p: 453) demosdma_map_singlesando um buffer passado como parâmetr

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

Q1: De que / de onde vem esse buffer?

kmalloc?

Q2: Por que o DMA-API-HOWTO.txt declara que eu posso usarkmalloc para DMA em?

Formatohttp: //www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.tx

L: 51 Se você adquiriu sua memória através do alocador de páginas kmalloc (), pode fazer DMA de / para essa memória usando os endereços retornados dessas rotina

L: 74 você não pode aceitar o retorno de uma chamada kmap () e de DMA para iss

Para passar o endereço retornado dekmalloc ao meu dispositivo de hardware?Ou devo executarvirt_to_bus nele primeiro?Ou devo passar isso paradma_map_single?

Q3: Quando a transferência do DMA estiver concluída, posso ler os dados no driver do kernel através dokmalloc endereço

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

Q4: Qual é a melhor maneira de levar isso ao espaço do usuário?

copy_to_user? mapear a memória do kmalloc?outras

questionAnswers(1)

yourAnswerToTheQuestion