2016-07-31 2 views
0

ARM에서 커널 3.18을 사용하고 있습니다. 나는 드라이버를 쓰고있는 카메라에서 데이터를 읽는다. 나는 메모리를 설정하려면 다음을 사용하십시오 : 이것은 매우 잘 작동어디에서 remap_pfn_range에 대해 vm_area_struct를 얻을 수 있습니까?

cpu_handle = dma_alloc_coherent(NULL, dma_size, &dma_handle, GFP_KERNEL | GFP_DMA); 

. 나는 카메라가 데이터를 전달한 후에 동일한 커널 모듈을 사용하여 메모리를 읽고 그림을 볼 수있다.

이제 사용자 공간 응용 프로그램을 시작하여 동일한 데이터를 읽으 려합니다. 가는 길은 remap_pfn_range입니다.

필자는 예제를 계속 찾고 있지만 결코 설명하지 않는 한 가지는 내가 vm_area_struct를 얻는 곳입니다. 나는 이것이 사용자 응용 프로그램 권한에서 왔다고 가정하고 있습니까? 첫 번째 인수는 "user vma to map"이라고되어 ​​있습니다. 그러면이 구조체에 대한 포인터를 어떻게 얻을 수 있습니까?

+0

드라이버가'dma_alloc_coherent()'로 버퍼를 할당했다면'remap_pfn_range()'를 직접 호출하지 말고'dma_mmap_coherent()'를 통해 해당 버퍼에 대한'mmap()'요청을 구현해야합니다. – Notlikethat

+0

이 팁을 가져 주셔서 감사합니다. dma_mmap_coherent가이 문제를 해결하는 방법 인 것 같습니다. – pgibbons

답변

0

vma 포인터가 사용자 공간 응용 프로그램에서 오는 것처럼 보입니다.

드라이버 (커널 공간) 내에서/dev 파일뿐만 아니라 몇 가지 방법을 만들어야했습니다.

그런 다음 사용자 응용 프로그램에서/dev 파일을 열었고 mmap을 호출했습니다. 이 차례로 내 드라이버 내에서 내 자신의 mmap 메서드를 호출하고 vma (vm_area_struct) 마술 함께 보냈습니다.

관련 문제