[问题] linux DMA问题

楼主: mikebenq (BenQ)   2014-04-30 17:34:47
我想在linux下用DMA和我的硬件沟通
网络上很多教学文都是kmalloc一块内存大小
用dma_map_single 映射出一个DMA可使用的地址
这种方法我也试成功了
现在的问题是我有一笔资料要用我的硬件做运算
我已经知道这笔资料起始位置也确定资料是连续的
但是我把这个地址用dma_map_single会出现segment fault
我现在的做法是把要算的资料复制到一块kmalloc的内存
再用硬件算我刚刚复制的资料
这样是成功的
但是复制一份花了相当多的时间
我想知道已知memory address 可否直接用DMA
该怎么做
我的dma_map_single 跟 kmalloc 都是写在我硬件的driver中的ioctl
要算的资料是在main中产生
当要开始算的时候call ioctl
拜托各位高手救救我
作者: alongalone (沿着孤单的路)   2014-04-30 18:03:00
kmalloc有大小限制,你提到花很多时间.我猜有可能爆掉
作者: alongalone (沿着孤单的路)   2014-04-30 18:04:00
有考虑试看看 vmalloc 吗
楼主: mikebenq (BenQ)   2014-04-30 18:38:00
我kmalloc一块内存将资料复制进去是成功的
楼主: mikebenq (BenQ)   2014-04-30 18:39:00
但是这么做感觉很浪费时间
楼主: mikebenq (BenQ)   2014-04-30 18:40:00
可以用原本的资料不用经过复制的程序吗?
作者: askacis (ASKA)   2014-04-30 20:27:00
vmalloc的位置应该不能拿来用DMA? 我记得不保证连续
作者: askacis (ASKA)   2014-04-30 20:31:00
只是说为什么你不一开始用就kmalloc来保存你的资料?
作者: askacis (ASKA)   2014-04-30 20:33:00
driver init时可以先kmalloc一块内存出来
作者: askacis (ASKA)   2014-04-30 20:34:00
如果资料来自userspace,可以用mmap让userspace可以直接到kmalloc出来的buffer,不需要ioctl送资料进driver~
作者: mayasky ( )   2014-05-02 01:40:00
实作你的IOREMAP,在DRIVER中MAP一段实体连续的给APP
作者: mayasky ( )   2014-05-02 01:41:00
说错..实作mmap
楼主: mikebenq (BenQ)   2014-05-02 12:05:00
感谢askacis跟mayasky的回复,这几天上网爬文已经实作出
楼主: mikebenq (BenQ)   2014-05-02 12:06:00
mmap,不过他的感觉是在kernel映射一块内存给user用
楼主: mikebenq (BenQ)   2014-05-02 12:07:00
所以我想运算的资料一定要写在mmap回传的address
楼主: mikebenq (BenQ)   2014-05-02 12:10:00
可是我想算的资料是一张图用opencv的函式cvLoadImage以及
楼主: mikebenq (BenQ)   2014-05-02 12:15:00
webcam传入,所以我无法指定要算资料的起始address
楼主: mikebenq (BenQ)   2014-05-02 12:17:00
请问各位高手这种问题要如何解决?小弟是第一次写driver
作者: alongalone (沿着孤单的路)   2014-05-02 21:21:00
把输入的资料复制到mmap回传的内存位置勒?
楼主: mikebenq (BenQ)   2014-05-02 21:30:00
是用memcpy()吗? 我现在就是使用这种方法,想请问一下还
楼主: mikebenq (BenQ)   2014-05-02 21:31:00
有更快的方法吗?因为这样感觉把内存复制感觉会慢很多
作者: mayasky ( )   2014-05-03 02:35:00
所以IMAGE的ADDRESS是LIBRARY决定的?
作者: mayasky ( )   2014-05-03 02:37:00
如果OPENCV是OPEN SOURCE...我会改OPENCV的配置MEM方式

Links booklink

Contact Us: admin [ a t ] ucptt.com