linux fp寄存器,linux 根据sp和fp查调用栈

本文介绍了在Linux系统中,如何利用寄存器FP(帧指针)和SP(栈指针)来追踪函数调用栈。通过保存的FP、SP、LR(链接寄存器)和PC(程序计数器)值,可以解析出函数的调用关系。示例展示了具体的栈帧结构,并指出在内核的dump_stack函数中,也是利用这些信息来获取调用栈的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值