程序14-15 linux/include/asm/memory.h


  1 /*

  2  *  NOTE!!! memcpy(dest,src,n) assumes ds=es=normal data segment. This

  3  *  goes for all kernel functions (ds=es=kernel space, fs=local data,

  4  *  gs=null), as well as for all well-behaving user programs (ds=es=

  5  *  user data space). This is NOT a bug, as any user program that changes

  6  *  es deserves to die if it isn't careful.

  7  */

    /*

     * 注意!!!memcpy(dest,src,n)假设段寄存器ds=es=通常数据段。在内核中使用的

     * 所有函数都基于该假设(ds=es=内核空间,fs=局部数据空间,gs=null,具有良好

     * 行为的应用程序也是这样(ds=es=用户数据空间)。如果任何用户程序随意改动了

     * es寄存器而出错,则并不是由于系统程序错误造成的。

     */

    //// 内存块复制。从源地址src处开始复制n个字节到目的地址dest处。

    // 参数:dest - 复制的目的地址,src - 复制的源地址,n - 复制字节数。

    // %0 - edi(目的地址dest)%1 - esi(源地址src)%2 - ecx(字节数n)

  8 #define memcpy(dest,src,n) ({ \

  9 void * _res = dest; \

 10 __asm__ ("cld;rep;movsb" \                // ds:[esi]复制到es:[edi],并且esi++edi++

                                              // 共复制ecx(n)字节。

 11         ::"D" ((long)(_res)),"S" ((long)(src)),"c" ((long) (n)) \

 12         :"di","si","cx"); \

 13 _res; \

 14 })

 15