Kernel version:2.6.32
CPU architecture:ARM
Author:ce123(http://blog.csdn.net/ce123)
- memcpy是把src指向的目标中的size个字符复制到dest所指向的目标中,回来指向成果目标的指针.
- memmove也是把src指向的目标中的size个字符复制到dest所指向的目标中,回来指向成果目标的指针,但这两个函数在处理内存区域堆叠的方法不同.
内存堆叠问题是指意图地址的内存空间的首地址,包含在源内存空间中,这两段内存空间有了交集,因而在运用memcpy进行内存仿制操作时,这段堆叠的内存空间会被损坏.这种状况在应用程序级代码中一般不会呈现的,而在驱动或内核级代码中要非常当心,尽量运用memmove函数.
memcpy对内存空间有要求的,dest和src所指向的内存空间不能堆叠,不然仿制的数据是过错的.下面详细解说一下这个过错是怎么发生的.
假如内存空间布局入下图所示:
src所指向的内存空间后边部分数据被新复制的数据给覆盖了(也便是dest<=src+size).所以复制到最后,本来的数据必定不是本来的数据,复制的数据也不是想要的数据,运用memcpy函数能够得到过错的成果.
再者,假如内存空间布局入下图所示:
尽管本来的数据不再是本来的数据(dest+size>=src),但复制的数据是本来的数据,运用memcpy函数能够得到正确的成果.因而,在运用memcpy这个函数之前,还需要做一个判别,假如dest<=src你才干运用这个函数不过彻底没有必要,你直接运用memmove函数就能够了.memmove在复制之前就做了一个判别,假如dest <= src,就依照memcpy的思路复制,假如dest>src怎么办呢,看函数,它是从后边往前复制,这样就能正确复制数据了.依据上面的剖析,了解下面的代码应该是一件很简单的工作.
print?
- 551#ifndef__HAVE_ARCH_MEMCPY
- 552/**
- 553*memcpy-Copyoneareaofmemorytoanother
- 554*@dest:Wheretocopyto
- 555*@src:Wheretocopyfrom
- 556*@count:Thesizeofthearea.
- 557*
- 558*YoushouldnotusethisfunctiontoaccessIOspace,usememcpy_toio()
- 559*ormemcpy_fromio()instead.
- 560*/
- 561void*memcpy(void*dest,constvoid*src,size_tcount)
- 562{
- 563char*tmp=dest;
- 564constchar*s=src;
- 565
- 566while(count–)
- 567*tmp++=*s++;
- 568returndest;
- 569}
- 570EXPORT_SYMBOL(memcpy);
- 571#endif
- 572
- 573#ifndef__HAVE_ARCH_MEMMOVE
- 574/**
- 575*memmove-Copyoneareaofmemorytoanother
- 576*@dest:Wheretocopyto
- 577*@src:Wheretocopyfrom
- 578*@count:Thesizeofthearea.
- 579*
- 580*Unlikememcpy(),memmove()copeswithoverlappingareas.
- 581*/
- 582void*memmove(void*dest,constvoid*src,size_tcount)
- 583{
- 584char*tmp;
- 585constchar*s;
- 586
- 587if(dest<=src){
- 588tmp=dest;
- 589s=src;
- 590while(count–)
- 591*tmp++=*s++;
- 592}else{
- 593tmp=dest;
- 594tmp+=count;
- 595s=src;
- 596s+=count;
- 597while(count–)
- 598*–tmp=*–s;
- 599}
- 600returndest;
- 601}
- 602EXPORT_SYMBOL(memmove);
- 603#endif