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 };
- linux 根据sp和fp查调用栈
- 为什么要使用堆栈? sp和fp的解释
- Linux下的fd和fp
- 基于DSP2407的对帧指针(FP)、栈指针(SP)的分析
- C语言栈区的讲解(基于ARM)以及ARM sp,fp寄存器的作用
- Linux根据端口查进程信息
- linux 根据ip查机器名
- linux根据uid反查用户名
- int *fp(); 和 int (*fp)(); 的区别
- 测试CDC和FP
- c#调用sp
- Linux如何根据IP地址反查hostname
- 根据浏览器和分辨率调用CSS代码
- 根据浏览器和分辨率调用CSS代码
- 根据浏览器和分辨率调用CSS代码
- Arm汇编学习笔记(六)——函数调用栈空间以及fp寄存器
- linux驱动调试之段错误分析-根据栈信息分析函数调用过程
- 根据端口查进程
- 华为老兵,聊聊我在华为的20年
- GDI+编程
- JSON入门指南
- static_cast, dynamic_cast, const_cast探讨
- 关于C语言头文件保护的一些认识
- linux 根据sp和fp查调用栈
- AIZU2303marathon match 概率
- light oj 1057 Collecting Gold(状态压缩dp)
- 在Netty中支持https服务器
- CvMat
- django orm基本使用策略
- 每日五题(java基础)
- 使用gzip优化web应用(filter实现)
- Swift中的问号?和感叹号!