ARM寄存器的别名
寄存器名字
Reg#
APCS
意义
R0
a1
工作寄存器
R1
a2
"
R2
a3
"
R3
a4
"
R4
v1
必须保护
R5
v2
"
R6
v3
"
R7
v4
"
R8
v5
"
R9
v6
"
R10
sl
栈限制
R11
fp
桢指针
R12
ip
内部过程调用寄存器
R13
sp
栈指针
R14
lr
连接寄存器
R15
pc
程序计数器
linux中,函数的入口都会保存{fp,sp,lr,pc},比如:
80b25a34 <_raw_spin_lock>:
80b25a34: e1a0c00d mov ip, sp
80b25a38: e92dd800 push {fp, ip, lr, pc}
80b25a3c: e24cb004 sub fp, ip, #4
sp是上级函数即调用者的堆栈首地址,fp是上级函数的堆栈结束地址,所以根据sp和fp就可以一级一级得出调用关系。
LR是当前函数的返回地址,地址位于上级函数中。PC-8即为上级函数的入口。
下面是一个例子,当前CPU寄存器的SP为80f53c38,FP为80f53c44,所以这四个word即为当前函数的栈帧。蓝色部分为返回地址。
S:0x80F53C30: 0x80F53D24 0x80062704 0x80F53C7C(FP) 0x80F53C48(SP)
S:0x80F53C40: 0x80062704(LR) 0x80B25A40(PC) 0x00B40000 0x80F50900
S:0x80F53C50: 0x80F53C84 0x9149BE04 0x80052264 0x00000000
S:0x80F53C60: 0x96D73F08 0x00000000 0x00000000 0x00000003
S:0x80F53C70: 0x80F53C8C 0x80F53C80 0x8006298C 0x8006268C
S:0x80F53C80: 0x80F53CA40x80F53C90 0x800522800x8006297C
S:0x80F53C90: 0x000000000x96D73EFC 0x80F53CDC 0x80F53CA8
S:0x80F53CA0: 0x8005BC380x80052270 0x81A88900 0x00000001
S:0x80F53CB0: 0x60070193 0x96D73F04 0x600F0193 0x00000000
S:0x80F53CC0: 0x00000001 0x00000003 0x81097384 0x00000000
S:0x80F53CD0: 0x80F53D0C 0x80F53CE0 0x8005D9A00x8005BBE8
S:0x80F53CE0: 0x00000000 0x8003D108 0x810A5BC0 0x96D73F00
S:0x80F53CF0: 0x8C251088 0x00000000 0xFFFFFFFF 0x96D73EC0
S:0x80F53D00: 0x80F53D24 0x80F53D10 0x808A8D540x8005D964
S:0x80F53D10: 0x8C2AB8400x96CB1200 0x80F53D3C 0x80F53D28
S:0x80F53D20: 0x808B61B40x808A8D04 0x96D738800x96D73EC0
S:0x80F53D30: 0x80F53D5C 0x80F53D40 0x808C23EC0x808B614C
S:0x80F53D40: 0x96D73D00 0x8C2C05AC 0x00000000 0xFFFFFFFF
S:0x80F53D50: 0x80F53D84 0x80F53D60 0x808C2C14 0x808C22C4
S:0x80F53D60: 0xBEA96080 0x81267DB0 0x00000001 0x8C2C065C
S:0x80F53D70: 0x00000001 0x81098D60 0x80F53DD4 0x80F53D88
S:0x80F53D80: 0x808BAD14 0x808C2AD4 0x80077780 0xC6B332E0
S:0x80F53D90: 0x80F53DDC 0x00005180 0x8C2C0400 0x00000000
在内核的dump_stack中,也是这样来得到调用栈的。
4 struct stackframe {
5 unsigned long fp;
6 unsigned long sp;
7 unsigned long lr;
8 unsigned long pc;
9 };
在内核的dump_stack中,也是这样来得到调用栈的。
4 struct stackframe { 5 unsigned long fp; 6 unsigned long sp; 7 unsigned long lr; 8 unsigned long pc; 9 };