关键寄存器介绍:


寄存器

含义

r0-r3

用作函数传参,例如函数A调用函数B,如果A需要向B传递参数,则将参数放到寄存器r0-r3中,如果参数个数大于4,则需要借用函数的栈空间。

r4-r11

变量寄存器,在函数中可以用来保存临时变量。

r9(SB)

静态基址寄存器。

r10(SL)

栈界限寄存器。

r11(FP)

帧指针寄存器,通常用来访问函数栈,帧指针指向函数栈中的某个位置。

r12(IP)

内部过程调用暂存寄存器。

r13(SP)

栈指针寄存器,用来指向函数栈的栈顶。

r14(LR)

链接寄存器,通常用来保存函数的返回地址。

r15(PC)

程序计数器,指向代码段中下一条将要执行的指令,不过由于流水线的作用,PC会指向将要执行的指令的下一条指令。

 

内核中的函数栈

内核中,一个函数的代码最开始的指令都是如下形式:

            mov   ip, sp
stmfd sp!, {r0 - r3} (可选的)
stmfd sp!, {..., fp, ip, lr, pc}
……

从其中两条stmfd(压栈)指令可以看出,一个函数的函数栈的栈底(高地址)的结构基本是固定的,如下图:

了解linux 内核代码dump_stack()执行流程_代码段