当前位置:首页 > 嵌入式 > 嵌入式大杂烩
[导读]为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash,oops等棘手问题,一般大家都会用gdb,objdump或者addr2line等工具分析pc位置来定位出错的地方。但是这些分析工具背后的本质原理就不见得理解深刻了,而且有的时候面对一系列backtrace或者st...

为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash, oops等棘手问题,一般大家都会用 gdb, objdump 或者 addr2line等工具分析 pc 位置来定位出错的地方。但是这些分析工具背后的本质原理就不见得理解深刻了,而且有的时候面对一系列 backtrace 或者 stack 日志处于懵逼的状态。


今天和大家一起看下面对 crash 日志的时候,如何利用 stack 来分析其变化的来龙去脉。


Arm指令集介绍

崇尚简单粗暴的介绍方式,我们直接来看各个寄存器的大体用法,详细用法可百度,不,谷歌。
1.    r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。---如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。2.    r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。r11 是栈帧指针 fp。3.    r12 是内部调用暂时寄存器 ip它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。4.    寄存器 r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。5.    寄存器 r14 是链接寄存器 lr如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复6.    寄存器 r15 是程序计数器 pc它不能用于任何其它用途。

演示代码

假如现在你已经掌握了 arm 指令的用法,即便没有掌握也没关系,“书到用时回头翻”。这里以一段简单的 c 语言为例:
#include
int m = 8;int fun(int a,int b){ int c = 0; c = a b; return c;}int main(){ int i = 4; int j = 5; m = fun(i, j); return 0;}编译一下,然后反汇编:

$ arm-linux-gnueabi-gcc main.c -o main $ arm-linux-gnueabi-objdump -D -D main
00010400 : 10400: e52db004 push {fp} ; (str fp, [sp, #-4]!) 10404: e28db000 add fp, sp, #0 10408: e24dd014 sub sp, sp, #20 1040c: e50b0010 str r0, [fp, #-16] 10410: e50b1014 str r1, [fp, #-20] ; 0xffffffec 10414: e3a03000 mov r3, #0 10418: e50b3008 str r3, [fp, #-8] 1041c: e51b2010 ldr r2, [fp, #-16] 10420: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec 10424: e0823003 add r3, r2, r3 10428: e50b3008 str r3, [fp, #-8] 1042c: e51b3008 ldr r3, [fp, #-8] 10430: e1a00003 mov r0, r3 10434: e24bd000 sub sp, fp, #0 10438: e49db004 pop {fp} ; (ldr fp, [sp], #4) 1043c: e12fff1e bx lr
00010440
: 10440: e92d4800 push {fp, lr} 10444: e28db004 add fp, sp, #4 10448: e24dd008 sub sp, sp, #8 1044c: e3a03004 mov r3, #4 10450: e50b300c str r3, [fp, #-12] 10454: e3a03005 mov r3, #5 10458: e50b3008 str r3, [fp, #-8] 1045c: e51b1008 ldr r1, [fp, #-8] 10460: e51b000c ldr r0, [fp, #-12] 10464: ebffffe5 bl 10400 10468: e1a02000 mov r2, r0 1046c: e59f3010 ldr r3, [pc, #16] ; 10484
10470: e5832000 str r2, [r3] 10474: e3a03000 mov r3, #0 10478: e1a00003 mov r0, r3 1047c: e24bd004 sub sp, fp, #4 10480: e8bd8800 pop {fp, pc} 10484: 00021024 andeq r1, r2, r4, lsr #32

图解栈的变化过程

如何能让读者接受吸收的更快,我一直觉得按照学习效率来讲的话顺序应该是视频,图文,文字。反正我是比较喜欢视频类的教学。这里给大家画下栈变化的过程是什么样子的。这里的图是结合上面的代码来画的,希望有助于读者的理解。

1.程序在内存分布区域



2.全局变量m赋值



3.保存进入main之前的栈底, fp-sp之间是当前函数栈




4.函数main的栈已经准备好了



5.i入栈



6.j入栈




7.准备函数fun的调用, 形参反向入栈 先形参b入栈



8.形参a入栈



9.留空一个地址作为fun返回值, 待后面返回时填入



10.fun返回地址入栈, 通常是main函数当前pc指针的下一个



11.main函数的栈底地址入栈



12.pc指针跳转fun代码



13.c入栈



14.可以看到函数fun的数据 形参a,b 在上一层函数的栈中. 一部分在自己的栈上. 此步取值到加法器中进行加法运算,再赋值给c



15.c赋给返回值,填入上面的留空位置



16.栈底恢复上一层



17.lr赋值给pc, 实现了跳转



18.返回值赋值给全局变量m



19.前面函数调用的形参已经无用,回滚sp



20.函数返回,清理main的栈空间



总结

这么多图有没有看花?相信到这里你已经了解了栈背后的来龙去脉,下一篇我们一起根据实际的 stack 错误案例剖析错误的可能性。

往期推荐:

物联网通信协议大汇总!

极客感十足的电子胸牌 ART-Badge V2.0

在公众号聊天界面回复1024,可获取嵌入式资源;回复 ,可查看文章汇总。


点击阅读原文,查看更多分享

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

近日,美国参议院公布了一项引人注目的国防政策方案,其中包含的“2025年国家人工智能保障准入和创新法案”(简称GAIN AI法案)再次在全球科技领域掀起波澜。

关键字: AI GPU

重庆2025年9月6日 /美通社/ -- iChongqing新闻报道:2025世界智能产业博览会于9月5日在重庆开幕,550余家企业参展,展示了从自动驾驶和人工智能(AI)座舱到扩展现实(XR)影视和机器人咖啡厅的30...

关键字: 人工智能 新能源汽车 AI 机器人

慕尼黑2025年9月6日 /美通社/ -- 近日,广汽正式推出全新增程技术——"星源增程"(英文名为ADiMOTION),全面提升增程器效率、动力响应及NVH表现,同时配合AI能量控制平台,实现每一度...

关键字: 广汽 AI 增程器 电机

北京2025年9月5日 /美通社/ -- 近日,2025年中瑞商业大奖颁奖典礼在北京举行,SGS通标标准技术服务有限公司(以下称SGS通标)作为瑞士SGS在中国的分支机构荣获了传承奖的殊荣。SGS通标北京总经理...

关键字: 可持续发展 ST AI ABILITY

北京2025年9月5日 /美通社/ -- 9月2日,济南城市投资集团有限公司(简称"济南城投")与软通动力信息技术(集团)股份有限公司(简称"软通动力")正式签署战略合作...

关键字: AI 数字经济 智能化 人工智能技术

中国郑州2025年9月5日 /美通社/ -- 全球领先的电动客车制造商宇通客车("宇通",上交所代码:600066)全新升级的车联网系统Link+采用先进技术实现车队车辆与管理平台的智能互联。作为Vehicle+升级版,...

关键字: LINK 车联网 AI PS

大众汽车集团加速推进生产数字化转型 数字化生产平台(Digital Production Platform)成为大众汽车的"工厂云",在全球生产基地实现人工智能(AI)与前沿 IT...

关键字: 亚马逊 大众汽车 AI 数字化

北京2025年9月5日 /美通社/ -- 9月4日,在北京市人民政府新闻办公室举行的"一把手发布•京华巡礼"系列主题新闻发布会上,北京经开区对外发布,北京经济技术开发区(简称"北京经开区&q...

关键字: 人工智能 模型 开源 AI

RighValor现已基于Synaptics® Astra™ SL1600系列SOC运行,提供隐私至上的实时边缘智能。 加利福尼亚州帕洛阿尔托2025年9月5日 /美通社/ -- 边缘分布式代理AI先驱企业Righ今日...

关键字: 智能家居 SYNAPTICS AI ST

柏林2025年9月4日 /美通社/ -- 全球消费电子与家电领先品牌海信,将以AI Your Life为主题在IFA 2025呈现全线人工智能创新成果。从沉浸式娱乐、影院级画质到智能家居生活与气候智能健康,海信将展示AI...

关键字: 海信 AI RGB MINILED
关闭