免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1885 | 回复: 9
打印 上一主题 下一主题

[内存管理] 如何将一块指定用户空间memory写回内存? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-13 17:43 |只看该作者 |倒序浏览
输入是一个用户空间地址,及memory size.准备将这片memory做DMA, 有写入和读出两种情况。
因此在DMA前,想将memory内容先写回并置无效。
linux 有一个函数 dma_cache_wback_inv 可以按page来实现。
  
本人在这块很菜,求实现方法。或者linux有其他函数可以直接实现的吗?
  
先谢了。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-03-14 09:47 |只看该作者
用户空间估计比较麻烦~~,能否再详细描述下需求,为何要这样~

论坛徽章:
0
3 [报告]
发表于 2014-03-14 10:47 |只看该作者
回复 2# humjb_1983


    呵呵,这种怪异一般都是需求不够明确。
DMA本身有方向,不会存在DMA完之后还需要再写入读出的情况。
它可能需要的是mmap()出两片内存,做两个dma通道,或者双缓冲来完成所需的功能。

论坛徽章:
0
4 [报告]
发表于 2014-03-14 11:14 |只看该作者
场景是这样的,有个ioctl接口提供data transfer 功能。由用户空间提供一块memory,有时需要将memory的内容DMA到一个device里,有时需要将device的内容DMA到这块memory里。我遇到的问题是,现在device的内容DMA到这片memory里的数据不一致。

在查代码时,发现code 是下面的写法

dma_cache_wback_inv(用户空间地址,。。)
DMA data in/out

上网一查,发现这个写法不对。但目前也没找到正确的写法

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2014-03-14 12:30 |只看该作者
dma_cache_wback_inv(用户空间地址,。。)
这里应该是物理地址吧?
搜了下内核代码,发现x86中很少用到这个的,mips用的多,感觉不一定与此相关。

论坛徽章:
0
6 [报告]
发表于 2014-03-14 12:56 |只看该作者
是啊,那个参数本来应该是物理地址。这个问题是在mips芯片上碰到的。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2014-03-14 13:48 |只看该作者
那具体问题是啥?好像没看明白~

论坛徽章:
0
8 [报告]
发表于 2014-03-14 14:18 |只看该作者
现在知道用户空间地址,以及memory size。但怎样将这片memory写回并置无效?
前面说了 dma_cache_wback_inv(用户空间地址。。)这样的调用是错的 ?
那正确的应该怎样写呢?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
9 [报告]
发表于 2014-03-14 15:33 |只看该作者
不好意思,之前理解错了,
dma_cache_wback_inv()传入的应该是虚拟地址,这里传物理地址可能不对,你试试呢~
另外,x86架构中该函数的实现中根本就没有用到这个地址:
  1. static inline void flush_write_buffers(void)
  2. {
  3.         __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory");
  4. }

  5. #define dma_cache_inv(_start,_size)                flush_write_buffers()
  6. #define dma_cache_wback(_start,_size)                flush_write_buffers()
  7. #define dma_cache_wback_inv(_start,_size)        flush_write_buffers()
复制代码
x86中使用很少,mips代码不懂,各个平台实现也不一样,建议你研究下代码。

论坛徽章:
0
10 [报告]
发表于 2014-03-14 15:37 |只看该作者
回复 4# xhx321


    硬件做DMA要求物理地址连续。由用户空间申请到的内存经常是不连续的。
更常见的做法是用户空间通过mmap向设备申请一块可以做dma的内存。
用户空间控制dma的触发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP