2012-07-09 3 views
16
  1. 이 호출에서 반환 된 DMA 주소는 실제 주소와 동일합니까? LDD3은 DMA 주소가 드라이버에 의해 불투명 한 것으로 취급되어야한다고 말합니다. 이 DMA 버퍼를 mmap하여 사용자 공간이 직접 읽고 쓸 수있게하고 싶습니다. 질문은 remap_pfn_range에 대해 PFN이 지정해야하는 것입니다 (현재 유쾌한 놀라움으로 (커널 3.4+)은 I/O 메모리와 같은 기본 메모리에서 작동합니다). DMA 주소를 부호없는 long으로 변환하여 PFN으로 변환 할 수 있습니까? 이것은 LDD3가 불투명하다고 말한 것에 대한 위반이 아닙니까?dma_alloc_coherent에 대한 몇 가지 질문

  2. dma_alloc_coherent은 항상 __get_free_pages을 내부적으로 사용합니까? 이는 영역이 잠재적으로 항상 할당량이 많다는 것을 의미합니까 (첫 번째 함수는 바이트를 사용하지만 두 번째 함수는 페이지 단위로 할당하므로)?

  3. __get_free_pages으로 전화하여 얻은 여러 연속 페이지에 대해 단일 스트리밍 매핑을 설정하는 방법이 있습니까? dma_map_page은 단일 페이지에만 적용됩니다.

+0

remap_pfn_range 메모리에 dma 메모리를 연결하는 올바른 방법을 찾으셨습니까? – Luca

답변

11
  1. 아니, 반환 주소는, 그렇지 않으면 당신은 커널 공간에서 액세스 할 수 없을 것입니다, 가상 주소입니다. 실제 주소를 나타내는 dma_handle이지만 불투명합니다. 반환하는 주소에 virt_to_phys를 사용하고 이것을 remap_pfn_range에 전달해야합니다.

  2. 믿을 수는 없지만 (플랫폼에 따라 달라질 수 있습니다.) 페이지를 할당합니다. DMA를위한 메모리 양을 줄이려면 dma_pool_create를 사용하고 거기에서 영역을 할당해야합니다.

  3. dma_map_page 대신 dma_map_single을 사용할 수 있습니다.

이 자료 중 일부는 DMA-API.txt에게 문의하는 것이 좋습니다.