2012-07-09 21 views
16
  1. ¿La dirección DMA devuelta desde esta llamada es la misma que la dirección física? LDD3 dice que el controlador debe tratar la dirección DMA como opaca. Quiero mapear este buffer DMA para que el espacio de usuario pueda leer/escribir directamente en él. La pregunta es qué PFN debería especificar para el remap_pfn_range (lo que para mi grata sorpresa ahora (kernel 3.4+) funciona para la memoria convencional igual que para la memoria de E/S). ¿Puedo simplemente convertir la dirección DMA a unsigned long y convertir eso a PFN? ¿No es esto una violación de lo que LDD3 dijo acerca de la opacidad?Algunas preguntas sobre dma_alloc_coherent

  2. ¿dma_alloc_coherent siempre usa __get_free_pages internamente? ¿Significa esto que la región siempre está potencialmente sobreasignada (ya que la primera función toma bytes pero la segunda función asigna unidades de páginas)?

  3. ¿Hay alguna manera de configurar una asignación de transmisión única para varias páginas consecutivas obtenida de la llamada al __get_free_pages? dma_map_page se aplica solo a páginas individuales.

+0

¿ha encontrado la forma correcta de conectar la memoria dma a la memoria remap_pfn_range? – Luca

Respuesta

11
  1. No, la dirección devuelta es una dirección virtual, de lo contrario no sería capaz de acceder a él desde el espacio del núcleo. Es dma_handle que representa la dirección física, pero es opaca. Necesita usar virt_to_phys en la dirección que devuelve y luego pasarlo a remap_pfn_range.

  2. No creo que sí (aunque es probable que dependa de la plataforma), pero asigna páginas. Si desea cantidades más pequeñas de memoria para DMA, debe usar dma_pool_create y luego asignar regiones desde allí.

  3. Puede usar dma_map_single en lugar de dma_map_page.

le recomiendo consultar DMA-API.txt para más detalles sobre algunas de estas cosas.

Cuestiones relacionadas