程序员人生 网站导航

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

栏目:服务器时间:2015-03-18 09:29:14

主要理解了Linux进程的栈和函数的栈帧的区分和联系


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

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

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

栈帧中寄存的内容1般包括以下几个方面的内容:
1)函数的返回地址和参数
2)临时变量:包括函数的非静态局部变量和编译器自动生成的其他变量
3)保存的上下文:包括在函数调用前后需要保证不变的寄存器值
进程中的函数在进程提供的栈中要解决的是调用者和被调者的关系
1)如何从调用者进入被调者?call
2)如何从被调者返回调用者?ret
3)调用者如何安排被调者(被调函数参数传递)?参数
4)被调者的价值如何体现(返回值的传递)?寄存器eax、edx

其中还有两个问题值得去看
1)被调函数返回值的传递方式
2)函数的调用惯例

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐