ebp/栈帧/call stack

ebp/栈帧/call stack1 ESP 栈指针寄存器 extendedstac 其内存放着一个指针 该指针永远指向系统栈最上面一个栈帧的栈顶

大家好,欢迎来到IT知识分享网。

一.什么是ebp?

二.什么是栈帧?

1.栈帧——整个系统调用路径上的某个函数占用的一个系统栈片段(帧)。

2.下图展示了两个栈帧的系统栈。

ebp/栈帧/call stack3.从上图可知,当前函数对应的栈帧的栈底(第一个压栈值)实际上压入的正是ebp寄存器的值,而这个值正是其caller栈帧的栈底

4.ebp的值只会在发生函数调用的时候变化,并且是esp寄存器的一个快照。

ebp/栈帧/call stack

push ebp mov ebp,esp

上面两句话的意思是将ebp推入栈中,之后让ebp等于esp

为什么这么做呢?因为ebp作为一个用于寻址的固定值是有时间周期的。只有在某个函数执行过程中才是固定的,在函数调用与函数执行完毕后会发生改变。

在函数调用之前,将调用者的函数(caller)的ebp存入栈,以便于在执行完毕后恢复现场是还原ebp的值。

5.从上面main函数的反汇编也可以看出,栈帧的结构如下:

ebp/栈帧/call stack

三.再举个简单的例子

C代码:

#include<stdio.h> int func(int a, int b) { return a+b; } int main(int argc, char argv) { int c = 0; c = func(0x5, 0x6); return 1; }

对应的汇编代码:

func: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax addl 12(%ebp),%eax jmp .L1 .L1: leave //movl ebp,esp; popl ebp, 回到func函数栈base pointer,弹出main的ebp ret //popl eip(由call func那条指令压入的call func返回地址) main: pushl %ebp movl %esp,%ebp //main函数的栈base pointer subl $4,%esp //栈中预留func的返回值占用的4字节空间 movl $0,-4(%ebp) //将栈中预留func的返回值空间清0 pushl $6 //压入func参数,从最后一个参数到第一个参数依次压栈 pushl $5 call func //1.push eip; 2.跳转到func标号去执行 movl %eax,-4(%ebp) //func的返回值写入栈中预留的空间 movl $1,%eax //设置main的返回值为1 jmp .L2 .L2: leave //相当于以下两条指令,movl ebp,esp; popl ebp, 回到main函数栈base pointer,弹出main的调用者的ebp ret //popl eip

栈帧变化说明:

ebp/栈帧/call stack

 

四.通过栈帧追踪某个函数的call stack

1.功能实现函数

// Record the current call stack in pcs[] by following the %ebp chain. // 记录当前调用getcallerpcs的函数call stack的算法 void getcallerpcs(void *v, uint pcs[]) { uint *ebp; int i; ebp = (uint*)v - 2; // 获取caller's caller的起始栈帧 /* 一共记录10层调用栈 */ for(i = 0; i < 10; i++){ if(ebp == 0 || ebp < (uint*)KERNBASE || ebp == (uint*)0xffffffff) break; pcs[i] = ebp[1]; // saved %eip ———— 调用函数后返回地址 ebp = (uint*)ebp[0]; // saved %ebp } for(; i < 10; i++) pcs[i] = 0; }

2.假设有如下调用栈

kfree(char *v) acquire(&kmem.lock); //void acquire(struct spinlock *lk) getcallerpcs(&lk, lk->pcs);

3.getcallerpcs函数算法的实现原理展示在下图

ebp/栈帧/call stack

参考:

实例讲解 xv6 的锁 – 知乎

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126498.html

(0)
上一篇 2025-09-18 15:10
下一篇 2025-09-18 15:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信