免费注册 查看新帖 |

Chinaunix

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

请教 使用DMA实现memcpy函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-02 16:47 |只看该作者 |倒序浏览
本帖最后由 mayjojo 于 2010-11-02 16:48 编辑

hi there~

我有一个需求,实现一个memcpy函数,但是在数据拷贝的时候不能经过CPU,以防止数据拷贝时对Cache的污染。
  1. void * memcpy(void * dest, void * src, unsigned int len)
复制代码
我希望通过一个驱动程序实现这样的功能,我在Linux kernel中找到async_memcpy函数可以实现这样的功能,声明在include/linux/Async_tx.h。函数签名如下:

  1. struct dma_async_tx_descriptor *
  2. async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
  3.              unsigned int src_offset, size_t len,
  4.              struct async_submit_ctl *submit)
复制代码
async_memcpy函数需要struct page结构指针作为参数,我遇到的困难是
1,不知道如何将用户空间的虚拟地址转换成struct page结构
2,page是4K吗?如果是,当len大于4K的时候,我应该使用循环解决,还是有其他方案。

我的环境是Linux Kernel 2.6.35, X86-64平台,内存8GB以上。

PS:
1,如果有第三方库(非商用,开放源码最佳)实现了如此功能,请告知。
2,如果有其他解决方案,请指出。

谢谢。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-11-02 21:50 |只看该作者
回复 1# mayjojo

论坛徽章:
0
3 [报告]
发表于 2010-11-03 16:51 |只看该作者
据我所知,DMA对物理地址是有限制的,不是说你能找到用户空间的地址对应的page就一定可以DMA,用户空间的地址映射的不同的物理地址,这些物理地址不是都能DMA的。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:11数据库技术版块每日发帖之星
日期:2015-08-30 06:20:00
4 [报告]
发表于 2010-11-03 23:23 |只看该作者
... ... 既然是用户空间 ... 居然还要 DMA ..
LZ ,一旦你有这样的需要,请先问问自己,“我是不是哪里设计错了?一定有可以避免这样变态用法的,我一定是错误的设计了程序”

论坛徽章:
0
5 [报告]
发表于 2010-11-04 10:33 |只看该作者
回复 4# 蔡万钊


    你好,

    首先,我的需求并不“变态”。我已经表述的比较清楚了,我不希望在memcpy的时候污染Cache。我并没有将这种用法用于商业软件的生产中。

    我在一个研究工作中设计了一系列的算法,以提高内存数据处理时Cache的有效性,从而降低内存访问的延迟。我现在需要实验证明我的算法Cache有效性程度。我的算法实现需要memcpy函数,但是通常的memcpy实现会导致Cache的污染,从而影响对我算法的评价。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP