Driver de dispositivo do kernel Linux para DMA no espaço do kernel
LDD3 (p: 453) demosdma_map_single
sando 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