2016-07-31 53 views
0

我正在ARM上使用内核3.18。我正在从我正在写驱动程序的摄像头读取数据。 我用下面的设置内存:我在哪里得到vm_area_struct remap_pfn_range?

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

这是工作得很好。在相机传送数据后,我使用相同的内核模块读出内存,并且可以看到照片。

现在我想启动一个用户空间应用程序来读取相同的数据。 我想要走的路是remap_pfn_range

我一直在寻找例子,但是他们从来没有描述过的一件事是从哪里获得vm_area_struct。我假设这必须来自用户应用程序的权利?对于第一个参数,它说“用户vma映射到”。那么我如何得到这个结构的指针呢?

+0

如果你的驱动程序用'dma_alloc_coherent()'分配缓冲区,它应该通过'dma_mmap_coherent()'实现对该缓冲区的'mmap()'请求,而不是直接调用'remap_pfn_range()'。 – Notlikethat

+0

感谢您的提示。 dma_mmap_coherent似乎是这样做的方式。 – pgibbons

回答

0

看起来vma指针来自用户空间应用程序。

在驱动程序(内核空间)中,我必须创建一些方法以及/ dev文件。

然后在用户应用程序中,我打开了/ dev文件,并对其调用了mmap。这反过来在我的驱动程序中调用了我自己的mmap方法,并且vma(vm_area_struct)被神奇地发送。