Linux kernel device driver to DMA into kernel space

LDD3 (p: 453) demostracionesdma_map_single utilizando un búfer pasado como parámetro.

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

Q1: ¿De qué / de dónde viene este búfer?

kmalloc?

Q2: ¿Por qué DMA-API-HOWTO.txt indica que puedo usar rawkmalloc a DMA en?

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

L: 51 Si adquirió su memoria a través del asignador de páginas kmalloc (), entonces puede DMA a / desde esa memoria utilizando las direcciones devueltas de esas rutinas.

L: 74 no puede tomar la devolución de una llamada kmap () y DMA a / desde eso.

Entonces puedo pasar la dirección devuelta dekmalloc a mi dispositivo de hardware? O debería ejecutarvirt_to_bus@ en él primero? O debería pasar esto adma_map_single?

Q3: Cuando se completa la transferencia de DMA, ¿puedo leer los datos en el controlador del kernel a través dekmalloc dirección?

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

Q4: ¿Cuál es la mejor manera de llevar esto al espacio de usuario?

copy_to_user?mmap la memoria de kmalloc?¿otros

Respuestas a la pregunta(1)

Su respuesta a la pregunta