
函数调用与栈
Stack frame 的重要性和作用体现在两个方面:
第一,它使调用者和被调用者达成某种约定。这个约定定义了函数调用时函数参数的传递方式,函数返回值的返回方式,寄存器如何在调用者和被调用者之间进行共享;
第二 ,它定义了被调用者如何使用它自己的 stack frame 来完成局部变量的存储和使用;
流风回雪1988
这个作者很懒,什么都没留下…
展开
-
XIP是什么?
1、XIP是什么?XIP(executed in place)本地执行。操作系统采用这种系统,可以不用将内核或执行代码拷贝到内存,而直接在代码的存储空间直接运行。XIP是一种能够直接在闪速存储器中执行代码而无须装载到RAM中执行的机制。2、XIP机制实现的原理XIP的原理很简单,即指操作系统或应用程序直接从非易失性存储器中执行。3、XIP机制作用减少了内核从闪速存储器拷贝到RAM的时间,并采用非压缩映像减少了内核自解压的时间。由于闪速存储器访问速度低于RAM,采用XIP技术的同时,根转载 2022-03-03 14:01:55 · 6717 阅读 · 0 评论 -
嵌入式中主动触发hardfault
通常在嵌入式产品的开发过程中,我们需要和各种死机的现场打交道,分析pc指针,backtrace等;但是有的时候呢,我们也需要在程序中在适当的时机来主动发生crash,比如主动触发hardfault,以此来验证某些功能是否完善.诸如,看门狗是否好用? hardfault后设备能否成功复位?或者hardfault后dump出来的信息是否足够丰富等等.如下是一个通过向空指针来写数据来主动产生hardfault的示例:+ if (msg->id == 0x2002) {...原创 2021-09-16 17:51:31 · 1444 阅读 · 0 评论 -
arm上backtrace的分析与实现原理
前言我们往往在进行嵌入式开发的过程中,需要借助一些调试手段进行相关调试,比如在调试stm32的时候,可以在keil中利用jtag或者stlink进行硬件上的仿真与调试,一些高频的arm芯片也会使用jtag之类的硬件调试工具,还有trace32等等,但是这些往往需要借助一些硬件工具进行分析。当然,我们可以进行软件层面的分析。定位问题的方式通常有以下三点:1.通过串口打印信息进行业务逻辑的梳理,结合代码设计进行分析2.在程序死机的时候,输出的函数调用栈关系进行分析,结合符号文件进行跟踪定位3.在转载 2020-09-04 18:38:29 · 3402 阅读 · 2 评论 -
也谈栈和栈帧(四)
这次来看看PowerPC体系架构CPU的栈帧布局和操作方法。PowerPC用得不多,有不对的地方大家拍砖啊~~1. PowerPC的栈帧 先来看看PowerPC的栈帧布局图: 上图描述的是PowerPC的栈帧布局方式,PowerPC的栈生长方向也是由高到低,caller是调用者,current是被调用者。压栈的顺序依次是FPR、GPR、CR、Local Variable、Function Parameters、Padding、LR和Back Chain Word。具体涵义如下...转载 2020-09-03 21:59:37 · 534 阅读 · 0 评论 -
也谈栈和栈帧(三)
这次讲ARM的栈帧布局和操作方法。1. ARM的栈帧 先来看看ARM的栈帧布局图: 上图描述的是ARM的栈帧布局方式,main stack frame为调用函数的栈帧,func1 stack frame为当前函数(被调用者)的栈帧,栈底在高地址,栈向下增长。图中FP就是栈基址,它指向函数的栈帧起始地址;SP则是函数的栈指针,它指向栈顶的位置。ARM压栈的顺序很是规矩(也比较容易被黑客攻破么),依次为当前函数指针PC、返回指针LR、栈指针SP、栈基址FP、传入参数个数及指针、本地变...转载 2020-09-03 21:45:51 · 390 阅读 · 2 评论 -
也谈栈和栈帧(二)
谈x86的栈帧之前,补充一下堆和栈的认识。1. 堆和栈的关系 我们平时说的堆栈其实是指栈,而实际上堆和栈是两种不同的内存分配。简单罗列一下各方面的异同点。 1).堆需要用户在程序中显式申请,栈不用,由系统自动完成。申请/释放堆内存的API,在C中是malloc/free,在C++中是new/delete。申请与释放一定要配对使用,否则会造成内存泄漏(memory leak),久而久之系统就无内存可用了,出现OOM(Out Of Memory)错误。一般在return/exit或br...转载 2020-09-03 21:42:37 · 265 阅读 · 0 评论 -
浅谈栈和栈帧(一)
一个码农要是没遇见过coredump,那他就是神仙了。core file(coredump的转储文件)中保存的最重要内容之一,就是函数的call trace。还原这部分内容(栈回溯),并与原代码对应上,尽快找出程序崩溃的位置和原因,是码农们一生的责任。当然,你如果有良好的开发环境和开发习惯,保留了现场环境(core file and lib file等)和unstrip的原程序,那么恭喜,也许你不用太费神,直接用GDB的backtrace功能,就可以找到症结所在。当然如果栈被冲掉了一部分,backtrace转载 2020-09-03 21:18:24 · 1664 阅读 · 0 评论 -
函数调用栈空间以及fp寄存器
1. ARM的栈帧 先来看看ARM的栈帧布局图: 上图描述的是ARM的栈帧布局方式,main stack frame为调用函数的栈帧,func1 stack frame为当前函数(被调用者)的栈帧,栈底在高地址,栈向下增长。图中FP就是栈基址,它指向函数的栈帧起始地址;SP则是函数的栈指针,它指向栈顶的位置。ARM压栈的顺序很是规矩,依次为当前函数指针PC、返回指针LR、栈指针SP、栈基址FP、传入参数个数及指针、本地变量和临时变量。如果函数准备调用另一个函数,跳转之前临时变量区...转载 2020-09-03 11:38:26 · 1670 阅读 · 0 评论 -
stm32 堆和栈(stm32 Heap & Stack)
关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的。 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个int main(){while(1);}BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632 编译后,就会发现转载 2017-08-30 11:00:48 · 572 阅读 · 0 评论 -
STM32堆栈区
三、STM32堆栈区预备知识:一个由C/C++编译的程序占用的内存分为以下几个部分:l 栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。l 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。l 全局区(静态区)(static):转载 2017-08-30 09:22:35 · 1666 阅读 · 2 评论 -
函数入栈顺序
(转载)函数入栈顺序转载http://soft.chinabyte.com/database/138/12116138.shtml 栈,我想大家都知道。栈,是硬件。主要作用表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。下面介绍C语言中函数参数的入栈顺序是怎样的。 对技术执着的人,比如说我,往往对一些问题,不仅想做到"知其然",还想做到"知其所以然".C语转载 2017-08-29 11:56:28 · 1442 阅读 · 1 评论