memcpy函数大家再熟悉不过了,是用来拷贝内存中的内容到目标地址所处的内存中。kernel中的函数实现是用汇编来写的,而其他的拷贝函数也有引用到此实现方式。本篇主要解读kernel中是如何实现的,代码是kernel 5.4版本源码。
/*
* Copy a buffer from src to dest (alignment handled by the hardware)
*
* Parameters:
* x0 - dest
* x1 - src
* x2 - n
* Returns:
* x0 - dest
*/
//设置寄存器对应的变量,其中x0、x1、x2分别代表三个参数
dstin .req x0
src .req x1
count .req x2
tmp1 .req x3
tmp1w .req w3
tmp2 .req x4
tmp2w .req w4
dst .req x6
A_l .req x7
A_h .req x8
B_l .req x9
B_h .req x10
C_l .req x11
C_h .req x12
D_l .req x13
D_h .req x14
mov dst, dstin //保存临时变量
cmp count, #16 //比较count是否小于16
b.lo .Ltiny15 //拷贝长度小于16,不做地址对齐,直接拷贝,跳转到tiny15
neg tmp2, src //对src取补数后赋值到tmp2
ands tmp2, tmp2, #15 //看tmp2的地址是否时16字节对其的,只保留后4 bit
b.eq .LSrcAligned //如果字节对齐跳转到SrcAligned 做对齐拷贝
sub count, count, tmp2 //没有对其就减去未对其的部分
//对未对其的部分做拷贝,根据对应bit位来确定总字节数
tbz tmp2, #0, 1f
ldrb1 tmp1w, src, #1 //单字节拷贝
strb1 tmp1w, dst, #1
1:
tbz tmp2, #1,