浅谈栈帧

来源:互联网 发布:在vb中val是什么意思 编辑:程序博客网 时间:2024/04/30 02:23
一、 什么是栈帧?
什么是栈帧,首先引用百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。

实际上,可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。也许这样感觉更复杂了,好吧,让我们从栈开始来理解什么是栈帧...

栈帧表示程序的函数调用记录,而栈帧又是记录在栈上面,很明显栈上保持了N个栈帧的实体,那就可以说栈帧将栈分割成了N个记录块,但是这些记录块大小不是固定的,因为栈帧不仅保存诸如:函数入参、出参、返回地址和上一个栈帧的栈底指针等信息,还保存了函数内部的自动变量(甚至可以是动态分配内存,alloca函数就可以实现,但在某些系统中不行),因此,不是所有的栈帧的大小都相同。


二,理解

我们拿一个实例来探讨一下


这是一个在linux下运行的程序,当程序走到*p=fun时会调用fun函数,最后执行reboot指令关机重启。这是为什么呢?我们就拿栈帧来看一下。

首先了解栈帧的基本结构。


栈帧其实是两个指针寄存器,寄存器ebp为帧指针,而寄存器esp为栈指针,当程序运行时,栈指针可以移动(大多数的信息的访问都是通过帧指针的)。总之简单一句话,栈帧的主要作用是用来控制和保存一个过程的所有信息的。

再来看一下我们当前程序的栈帧


因为fun1中*p=&a;即p中保存的a的地址,p指向a,  p--;会向下走,p指向了调用fun1函数的返回地址,然后再将fun的地址给了P,这时候p就不能正常返回了,而是当p要返回时却调用了fun函数,这时候就会执行reboot指令。


你听懂了吗微笑


0 0
原创粉丝点击