您的位置:首页 > 运维架构 > Linux

Linux进程的栈和进程中函数的栈帧及其结构

2015-03-05 23:21 330 查看
主要理解了Linux进程的栈和函数的栈帧的区别和联系



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

进程的栈中存放的是函数调用的栈帧

即另一个概念是上文中提到的函数的栈帧的概念及其与Linux进程栈的关系
函数的栈帧就在进程中的栈的结构和分配的地址空间及实际内存中
函数的栈帧整体的理解是:
1)ebp是函数栈帧的栈底
2)esp是栈顶(一个函数的活动记录就在ebp(高地址)和esp(低地址)之间)
3)一个进程的所有的函数的栈帧在调用此函数的时候建立,返回调用者后,被调函数的栈帧不再存在
4)所有的函数的栈帧的建立和消失是随着进程的执行而变化的一个动态过程
5)栈帧中存放的内容是什么呢?



栈帧中存放的内容一般包括以下几个方面的内容:
1)函数的返回地址和参数
2)临时变量:包括函数的非静态局部变量和编译器自动生成的其他变量
3)保存的上下文:包括在函数调用前后需要保证不变的寄存器值

进程中的函数在进程提供的栈中要解决的是调用者和被调者的关系
1)如何从调用者进入被调者?call
2)如何从被调者返回调用者?ret
3)调用者如何支配被调者(被调函数参数传递)?参数
4)被调者的价值如何体现(返回值的传递)?寄存器eax、edx



其中还有两个问题值得去看
1)被调函数返回值的传递方式
2)函数的调用惯例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: