您的位置 首页 元件

linux内核中memcpy和memmove函数的差异和完成

Kernelversion:2632CPUarchitecture:ARMAuthor:ce123(http:blogcsdnnetce123)memcpy是把src指向的对象中的size个字符拷贝到

Kernel version:2.6.32

CPU architecture:ARM

Author:ce123(http://blog.csdn.net/ce123)

  • memcpy是把src指向的目标中的size个字符复制到dest所指向的目标中,回来指向成果目标的指针.
  • memmove也是把src指向的目标中的size个字符复制到dest所指向的目标中,回来指向成果目标的指针,但这两个函数在处理内存区域堆叠的方法不同.
留意memmove这个函数称号中有”move”这个单词,而实际上src处的数据仍然还在,并没有真的被”移动”了!这个函数称号有它的前史原因,是因为有了memcpy函数后,发现这个函数有问题,又发明晰另一个没有问题的memcpy函数,但为了爆出兼容性仍然保留了memcpy函数,而将新版本的memcpy函数改名为memmove函数.

内存堆叠问题是指意图地址的内存空间的首地址,包含在源内存空间中,这两段内存空间有了交集,因而在运用memcpy进行内存仿制操作时,这段堆叠的内存空间会被损坏.这种状况在应用程序级代码中一般不会呈现的,而在驱动或内核级代码中要非常当心,尽量运用memmove函数.

memcpy对内存空间有要求的,dest和src所指向的内存空间不能堆叠,不然仿制的数据是过错的.下面详细解说一下这个过错是怎么发生的.

假如内存空间布局入下图所示:

src所指向的内存空间后边部分数据被新复制的数据给覆盖了(也便是dest<=src+size).所以复制到最后,本来的数据必定不是本来的数据,复制的数据也不是想要的数据,运用memcpy函数能够得到过错的成果.

再者,假如内存空间布局入下图所示:

尽管本来的数据不再是本来的数据(dest+size>=src),但复制的数据是本来的数据,运用memcpy函数能够得到正确的成果.因而,在运用memcpy这个函数之前,还需要做一个判别,假如dest<=src你才干运用这个函数不过彻底没有必要,你直接运用memmove函数就能够了.memmove在复制之前就做了一个判别,假如dest <= src,就依照memcpy的思路复制,假如dest>src怎么办呢,看函数,它是从后边往前复制,这样就能正确复制数据了.依据上面的剖析,了解下面的代码应该是一件很简单的工作.

[plain]view plaincopy

print?

  1. 551#ifndef__HAVE_ARCH_MEMCPY
  2. 552/**
  3. 553*memcpy-Copyoneareaofmemorytoanother
  4. 554*@dest:Wheretocopyto
  5. 555*@src:Wheretocopyfrom
  6. 556*@count:Thesizeofthearea.
  7. 557*
  8. 558*YoushouldnotusethisfunctiontoaccessIOspace,usememcpy_toio()
  9. 559*ormemcpy_fromio()instead.
  10. 560*/
  11. 561void*memcpy(void*dest,constvoid*src,size_tcount)
  12. 562{
  13. 563char*tmp=dest;
  14. 564constchar*s=src;
  15. 565
  16. 566while(count–)
  17. 567*tmp++=*s++;
  18. 568returndest;
  19. 569}
  20. 570EXPORT_SYMBOL(memcpy);
  21. 571#endif
  22. 572
  23. 573#ifndef__HAVE_ARCH_MEMMOVE
  24. 574/**
  25. 575*memmove-Copyoneareaofmemorytoanother
  26. 576*@dest:Wheretocopyto
  27. 577*@src:Wheretocopyfrom
  28. 578*@count:Thesizeofthearea.
  29. 579*
  30. 580*Unlikememcpy(),memmove()copeswithoverlappingareas.
  31. 581*/
  32. 582void*memmove(void*dest,constvoid*src,size_tcount)
  33. 583{
  34. 584char*tmp;
  35. 585constchar*s;
  36. 586
  37. 587if(dest<=src){
  38. 588tmp=dest;
  39. 589s=src;
  40. 590while(count–)
  41. 591*tmp++=*s++;
  42. 592}else{
  43. 593tmp=dest;
  44. 594tmp+=count;
  45. 595s=src;
  46. 596s+=count;
  47. 597while(count–)
  48. 598*–tmp=*–s;
  49. 599}
  50. 600returndest;
  51. 601}
  52. 602EXPORT_SYMBOL(memmove);
  53. 603#endif

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/262426.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部