LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1820|回复: 9

memcpy 的效率如何?

[复制链接]
发表于 2004-8-24 22:58:59 | 显示全部楼层 |阅读模式
memcpy 比起dma 的效率究竟差别又多大啊? 不知道memcpy实现时用没用到dma。
发表于 2004-8-25 08:31:31 | 显示全部楼层
这是两个完全不同的概念,你怎么能把它们混为一谈呢?
memcpy顾名思义就是指在内存中的进行数据的复制,而dma是指为了减轻cpu的负担,让DMA芯片在cpu的控制下完成从硬盘(或者其它设备)上批量读取数据到内存的手段。前者是软件,后者是硬件。前者是不涉及I/O处理,后者要涉及I/O处理。完全是两个不同层次的东西。
发表于 2004-8-25 10:08:13 | 显示全部楼层
/usr/src/linux/include/asm-i386/string.h

static inline void * __memcpy(void * to, const void * from, size_t n)
{
int d0, d1, d2;
__asm__ __volatile__(
        "rep ; movsl\n\t"
        "testb $2,%b4\n\t"
        "je 1f\n\t"
        "movsw\n"
        "1:\ttestb $1,%b4\n\t"
        "je 2f\n\t"
        "movsb\n"
        "2:"
        : "=&c" (d0), "=&D" (d1), "=&S" (d2)
        :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
        : "memory");
return (to);
}
 楼主| 发表于 2004-8-25 14:24:38 | 显示全部楼层
小弟是新手 。。。
不过dma 也可以用在内存 到 内存 的拷贝 吧
发表于 2004-8-25 19:18:09 | 显示全部楼层
理论上可以,可是Linux有没有给用户提供这样的接口?俺不知。如果你是编内核模块那是可以的。
发表于 2004-8-27 10:07:53 | 显示全部楼层
最初由 cymometer 发表
小弟是新手 。。。
不过dma 也可以用在内存 到 内存 的拷贝 吧

我觉得不行吧,似乎也没有必要。cpu的指令中专门有用于串复制的指令。
http://www.lslnet.com/linux/docs/linux-3889.htm
发表于 2004-8-27 15:44:18 | 显示全部楼层
楼上推荐的资料不错

如果不考虑操作系统的存储保护的话,用DMA实现内存到内存的拷贝是可以的(这是DMA的重要功能之一,不过一般系统上很少这么用)
 楼主| 发表于 2004-8-27 16:23:01 | 显示全部楼层
多谢两位兄台,我又长见识了
发表于 2004-8-29 00:23:13 | 显示全部楼层
最初由 doubleelec 发表
楼上推荐的资料不错

如果不考虑操作系统的存储保护的话,用DMA实现内存到内存的拷贝是可以的(这是DMA的重要功能之一,不过一般系统上很少这么用)

这么说我是少见多怪了,呵呵。。。
发表于 2004-8-30 09:28:00 | 显示全部楼层
楼上客气了,这种细节问题不知道很正常,楼上找的那个html上好像缺了几张关于控制字格式的图,如果有图就能看到DMA控制器有允许或不允许“内存到内存操作”的设置
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表