linux核心中memcpy和memmove函數的區別和實現

來源:互聯網
上載者:User

linux核心中memcpy和memmove函數的區別和實現

Kernel version:2.6.32

CPU architecture:ARM

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

嵌入式開發交流群:280352802,歡迎您的加入!

      • 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怎麼辦呢,看函數,它是從後面往前拷貝,這樣就能正確拷貝資料了.根據上面的分析,理解下面的代碼應該是一件很容易的事情.

      551 #ifndef __HAVE_ARCH_MEMCPY552 /**553  * memcpy - Copy one area of memory to another554  * @dest: Where to copy to555  * @src: Where to copy from556  * @count: The size of the area.557  *558  * You should not use this function to access IO space, use memcpy_toio()559  * or memcpy_fromio() instead.560  */561 void *memcpy(void *dest, const void *src, size_t count)562 {563         char *tmp = dest;564         const char *s = src;565 566         while (count--)567                 *tmp++ = *s++;568         return dest;569 }570 EXPORT_SYMBOL(memcpy);571 #endif572 573 #ifndef __HAVE_ARCH_MEMMOVE574 /**575  * memmove - Copy one area of memory to another576  * @dest: Where to copy to577  * @src: Where to copy from578  * @count: The size of the area.579  *580  * Unlike memcpy(), memmove() copes with overlapping areas.581  */582 void *memmove(void *dest, const void *src, size_t count)583 {584         char *tmp;585         const char *s;586 587         if (dest <= src) {588                 tmp = dest;589                 s = src;590                 while (count--)591                         *tmp++ = *s++;592         } else {593                 tmp = dest;594                 tmp += count;595                 s = src;596                 s += count;597                 while (count--)598                         *--tmp = *--s;599         }600         return dest;601 }602 EXPORT_SYMBOL(memmove);603 #endif

      聯繫我們

      該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

      如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

      A Free Trial That Lets You Build Big!

      Start building with 50+ products and up to 12 months usage for Elastic Compute Service

      • Sales Support

        1 on 1 presale consultation

      • After-Sales Support

        24/7 Technical Support 6 Free Tickets per Quarter Faster Response

      • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.