函数调用时,系统底层做了什么?

来源:互联网 发布:广播系统 杰网络 编辑:程序博客网 时间:2024/06/13 02:58

去年面试的时候,曾经被问到过这样的问题:“你对汇编了解吗?那么调用一个C函数时系统底层做了什么?”
我仔细回想上课学到的内容,发现已经忘光了,重新去翻了翻《深入理解计算机系统》这本书,得到了解答。在此记下给自己加深印象。

首先要回想的是一些基础概念:
栈帧(stack frame):机器用栈来传递过程参数与返回信息,为单个过程分配的那部分栈称为它的栈帧。
%ebp:寄存器,在IA32模型中相对esp更靠近栈底,称为帧指针
%esp:同上,指向栈的顶部,称为栈指针
返回地址:指的是从函数返回后,所指向的要继续运行的代码
push x : 此操作指的是将栈顶指针%esp的值减4,并把x存入当前%esp位置。

假设过程P(调用者)调用过程Q(被调用者),则将调用参数从后往前的压入P的栈桢中,最后压入一个返回地址作为P的栈桢的末尾。
Q栈帧开头会push %ebp一次,把旧的ebp值(P栈桢的尾部)记录下来,以便之后退出时可以回调用之前的%ebp。并movl %esp, %ebp 使得此时%esp=%ebp,同时指向栈顶位置,于是Q的栈帧就这样可以开始使用了。
描述出来过于抽象,具体如图所示:
这里写图片描述

0 0