函数调用时,系统底层做了什么?
来源:互联网 发布:广播系统 杰网络 编辑:程序博客网 时间: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
- 函数调用时,系统底层做了什么?
- 加载JDBC驱动程序时,底层都做了些什么
- 函数调用时发生了什么
- 函数调用时发生了什么
- 函数调用时发生了什么
- 函数调用时发生了什么
- UIApplicationMain函数做了什么
- UIApplicationMain函数做了什么
- Class.forName(String driverClassName)加载JDBC驱动程序时,底层都做了些什么???
- puts("Hello world!")系统做了什么?
- android 应用升级,系统做了什么?
- main函数之前做了什么?
- main函数之前做了什么?
- 进入main函数之前做了什么?
- free()函数具体做了什么
- openssl 初始化函数到底做了什么?
- 函数调用时,栈里到底发生了什么?
- iOS 【程序启动原理/手动创建UIWindow/UIApplicationMain做了些什么/makeKeyAndVisible底层实现】
- ubuntu 下 caffe 的安装
- 遍历一次实现单链表顺序反转
- IOPS和带宽对存储性能的影响?
- c++(4)
- VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask) UP BROADCAST MULTICAST 问题
- 函数调用时,系统底层做了什么?
- Js处理Json数据的几种方式
- 【Zookeeper】源码分析之请求处理链(二)
- 计算机系统学习1:CPU,内存,硬盘及指令之间的关系
- 【二分】Pie
- 选夫婿2
- js中“==“和“===“的区别
- HDU-2829 Lawrence 【斜率优化DP】【四边形不等式优化】
- jQuery实现用户输入自动完成功能