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