作者mikebenq ()
看板LinuxDev
標題[問題] linux DMA問題
時間Wed Apr 30 17:34:47 2014
我想在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
拜託各位高手救救我
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.27.12
※ 文章網址: http://webptt.com/m.aspx?n=bbs/LinuxDev/M.1398850493.A.75F.html
1F:→ alongalone:kmalloc有大小限制,你提到花很多時間.我猜有可能爆掉 04/30 18:03
2F:→ alongalone:有考慮試看看 vmalloc 嗎 04/30 18:04
3F:→ mikebenq:我kmalloc一塊記憶體將資料複製進去是成功的 04/30 18:38
4F:→ mikebenq:但是這麼做感覺很浪費時間 04/30 18:39
5F:→ mikebenq:可以用原本的資料不用經過複製的程序嗎? 04/30 18:40
6F:推 askacis:vmalloc的位置應該不能拿來用DMA? 我記得不保證連續 04/30 20:27
7F:推 askacis:只是說為什麼你不一開始用就kmalloc來保存你的資料? 04/30 20:31
8F:推 askacis:driver init時可以先kmalloc一塊記憶體出來 04/30 20:33
9F:→ askacis:如果資料來自userspace,可以用mmap讓userspace可以直接 04/30 20:34
10F:→ askacis:到kmalloc出來的buffer,不需要ioctl送資料進driver~ 04/30 20:34
11F:推 mayasky:實作你的IOREMAP,在DRIVER中MAP一段實體連續的給APP 05/02 01:40
12F:推 mayasky:說錯..實作mmap 05/02 01:41
13F:→ mikebenq:感謝askacis跟mayasky的回覆,這幾天上網爬文已經實作出 05/02 12:05
14F:→ mikebenq:mmap,不過他的感覺是在kernel映射一塊記憶體給user用 05/02 12:06
15F:→ mikebenq:所以我想運算的資料一定要寫在mmap回傳的address 05/02 12:07
16F:→ mikebenq:可是我想算的資料是一張圖用opencv的函式cvLoadImage以及 05/02 12:10
17F:→ mikebenq:webcam傳入,所以我無法指定要算資料的起始address 05/02 12:15
18F:→ mikebenq:請問各位高手這種問題要如何解決?小弟是第一次寫driver 05/02 12:17
19F:推 alongalone:把輸入的資料複製到mmap回傳的記憶體位置勒? 05/02 21:21
20F:→ mikebenq:是用memcpy()嗎? 我現在就是使用這種方法,想請問一下還 05/02 21:30
21F:→ mikebenq:有更快的方法嗎?因為這樣感覺把記憶體複製感覺會慢很多 05/02 21:31
22F:→ mayasky:所以IMAGE的ADDRESS是LIBRARY決定的? 05/03 02:35
23F:推 mayasky:如果OPENCV是OPEN SOURCE...我會改OPENCV的配置MEM方式 05/03 02:37