CPY CPYM CPYP CPYE SET SETP SETM SETE,memcpy,memset
思考 1、memcpy/memset的底层是如何实现的?一个一个字节的操作吗? 可不可以四个四个字节操作呢? 2、若干年后再来回答问题1,是不是有新的方法了呢?
在大多数的[操作]系统中,memcpy()、memset()等函数的实现,其实都一个字节一个字节的处理。翻译成汇编后无非就算循环执行ldr 、str 指令
memcpy的底层实现:
_PTR
_DEFUN(memcpy, (dst0, src0, len0), _PTR dst0 _AND _CONST _PTR src0 _AND
size_t len0)
{
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
char *dst = (char *)dst0;
char *src = (char *)src0;
_PTR save = dst0;
while (len0--)
*dst++ = *src++;
return save;
}
memset的底层实现:
(optee_os/lib/libutils/isoc/newlib/memset.c)
_PTR _DEFUN(memset, (m, c, n), _PTR m _AND int c _AND size_t n)
{
char *s = (char *)m;
#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__)
......
#endif
while (n--)
*s++ = (char)c;
return m;
}
翻译成汇编后:
000000000e1469b8 <memset>:
memset():
/home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:125
e1469b8: d2800003 mov x3, #0x0
e1469bc: eb03005f cmp x2, x3
e1469c0: 54000041 b.ne e1469c8 <memset+0x10>
/home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:129
e1469c4: d65f03c0 ret
/home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:126
e1469c8: 38236801 strb w1, [x0, x3]
e1469cc: 91000463 add x3, x3, #0x1
e1469d0: 17fffffb b e1469bc <memset+0x4>
这些函数在一般的软件中会经常使用,所以它们的性能尤其重要。 在ARM最新的架构中(armv9)提出了优化这些性能的方式(FEAT_MOPS),即:增加了一些指令来做这件事
|