linux 根据sp和fp查调用栈

来源:互联网 发布:windows程序设计第7版 编辑:程序博客网 时间:2024/06/02 07:10

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:   0x80F53CA4  0x80F53C90   0x80052280    0x8006297C

S:0x80F53C90:   0x00000000    0x96D73EFC  0x80F53CDC  0x80F53CA8

S:0x80F53CA0:  0x8005BC38 0x80052270    0x81A88900   0x00000001

S:0x80F53CB0:  0x60070193    0x96D73F04   0x600F0193   0x00000000

S:0x80F53CC0:  0x00000001    0x00000003    0x81097384    0x00000000

S:0x80F53CD0:  0x80F53D0C  0x80F53CE0  0x8005D9A0 0x8005BBE8

S:0x80F53CE0:     0x00000000    0x8003D108   0x810A5BC0  0x96D73F00

S:0x80F53CF0:   0x8C251088   0x00000000    0xFFFFFFFF  0x96D73EC0

S:0x80F53D00:   0x80F53D24   0x80F53D10   0x808A8D54 0x8005D964

S:0x80F53D10:   0x8C2AB840  0x96CB1200   0x80F53D3C  0x80F53D28

S:0x80F53D20:   0x808B61B4   0x808A8D04  0x96D73880   0x96D73EC0

S:0x80F53D30:   0x80F53D5C  0x80F53D40   0x808C23EC 0x808B614C

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

 

0 0
原创粉丝点击