Linux - 函数的栈帧

  栈帧(stack frame),机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储。为单个过程(函数调用)分配的那部分栈称为栈帧。栈帧其实是两个指针寄存器,

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

所有信息的。栈帧结构如下所示:

  下面,我们通过一个简单的程序来了解栈帧:

  简单的函数分析,如下图:

  该函数的栈帧情况:

当*p=bug,修改栈帧中保存返回值的位置,使得函数不是正常返回,而是进入bug函数,当遇到exit函数,程序终止,不在跳回到main函数中终止。

时间: 2024-10-27 10:05:56

Linux - 函数的栈帧的相关文章

Linux进程的栈和进程中函数的栈帧

主要理解了Linux进程的栈和函数的栈帧的区别和联系 上图中刻画的是一个Linux进程的结构图,其中本文想要关注的栈如上图所示是栈底在0xc0000000地址递减的一块进程内存区域 Linux系统中为每个进程分配的实际大小未做深究 Linux进程的栈的整体认知就是这么多,即 1)栈底在0xc0000000(并不需要栈底指针,函数的栈帧才需要栈底指针) 2)栈的增长方向,地址递减方向 3)栈顶指针esp 4)大小未知(不是本文关注的重点) 5)里面存放的内容是什么呢? 另一个概念是上文中提到的函数

浅谈main函数的栈帧

要理解什仫是栈帧首先就要理解什仫是栈? 那仫什仫是栈呢?在数据结构中有一种结构叫栈,它的定义为:仅在表尾进行插入和删除的操作 我们允许插入和删除的一端称为栈顶(esp),另一端则为栈底(ebp),所以栈又被称为后进先出的线性表(LIFO).而且我们知道在内存中空间的分配是从高地址向低地址增长的; 好了说了这仫多的栈那仫什仫是栈帧呢?其实说白了栈帧实际上就是用来记录函数调用过程的信息,是编译器用来实现函数调用过程的的一种数据结构.下图是我对栈帧分布的一点理解,以下都是在VC++6.0版本下测试的:

Linux 下函数栈帧分析

1.关于栈 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可执行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行 栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,非常非常重要,可读可写可执行.如下图所示: 首先必须明确一点也是非常重要的一点,栈是向下

Linux下栈帧分析

我们知道C语言中,每个栈帧对应着一个未运行完的函数.栈帧中保存了该函数的返回地址和局部变量.栈帧也叫过程活动记录,是编译器用来实现函数调用的一种数据结构.那么在Linux下gcc编译器栈帧是怎么实现的呢? 首先来看下面这段代码: 这段代码的运行结果是会导致虚拟机重启.通过代码可以看到我们在fun函数中写了让系统重启的代码然而我们在main函数中并没有调用fun函数,却仍旧导致了系统重启. 首先要我们知道栈是从高地址向低地址生长的,每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需

函数的调用过程(栈帧)

1.什么是栈帧? 栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构.C语言中,每个栈帧对应着一个未运行完的函数.从逻辑上讲,栈帧就是一个函数执行的环境:函数调用框架.函数参数.函数的局部变量.函数执行完后返回到哪里等等.栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址). 2.Add()函数的调用过程 我们以Add()函数为例深入的研究一

C函数的调用过程   栈帧

C语言中,每个栈帧对应着一个未运行完的函数.栈帧中保存了该函数的返回地址和局部变量. 首先,栈是从高地址向低地址延伸的.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址). 先来看一个代码 #include <stdio.h> void fun() {     int tmp = 10;     int*p = (int*)(*(&tmp + 1));     *(p - 1) = 20; } int main() {     int a = 0;

C函数调用机制及栈帧指针

转载: http://bbs.csdn.net/topics/90317145 http://blog.chinaunix.net/uid-26817832-id-3347227.html 帧指针 和栈指针到底是什么,有什么联系吗 FP帧指针指向帧头 SP栈指针指向栈顶 大部分现代计算机系统使用栈来给进程传递参数并且存储局部变量.栈是一种在进程映象内存的高地址内的后进先出(LIFO)的缓冲区.当程序调用一个函数时 一个新的"栈帧"会被创建.这个栈帧包含着传递给函数的各种参数和一些动态的

一段程序,认识栈帧

一.认识栈帧 先来看一段神奇的代码: (windows下,代码如下) #include<stdio.h> #include<stdlib.h> #include<Windows.h> void fun() {  printf("You Are Done\n");  Sleep(2000);  printf("Suppose The Computer Will Shut Down~~~~\n");    //上面这行如果换成syst

栈和栈帧

[摘自Linux/Unix系统编程手册] 函数的调用和返回使栈的增长和收缩呈线性.X86-32体系架构上的Linux(和大多数其它Linux和Unix的实现),栈驻留在内存的高端并向下增长(朝堆的方向).专用寄存器--栈指针(stack pointer),用于跟踪当前栈顶.每次调用函数时,会在站上新分配一帧,每当函数返回时,再从栈上将此帧移去. 虽然栈向下增长,但仍将栈的增长端称为栈顶,因为抽象地来说,情况本就如此.栈的实际增长方向是个属于硬件范畴的实现细节.在HP PA-RISC的Linux实