深入理解计算机操作系统——第3章:程序编码,过程调用(程序栈)
3.1 linux采用平坦寻址的方式,及程序员将整个存储空间看做一个大的字节数组
3.2 程序编码
程序需要经过:
预处理器 :将#include还有#define宏进行处理(扩展)
编译器: 产生源代码的汇编代码code.s
汇编器: 目标代码(是机器码的一种形式),包含所有的指令的二进制形式,只是还没有填入地址全局值
链接器:将所有目标代码文件与所需库文件代码合并,最终得到可执行目标文件
机器级程序使用的存储地址是虚拟地址,机器代码只是将存储器看做一个很大的,按字节寻址的数组。
3.7 过程:
过程含义
(1)一个过程的调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另外一部分。
(2)必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。
这些都是通过程序栈来实现的:
(1)机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储
(2)为单个过程分配的那部分栈称为“栈帧“。
程序的调用过程
P:
(1)假设过程P(调用者)调用过程Q(被调用者),则Q的参数放在P的栈帧中。
(2)当P调用Q时,P的返回地址压入栈中,形成P的栈帧末尾。
返回地址:当程序从Q返回应该继续执行的地方。
Q:
(3)Q的栈帧从保存的帧指针的值开始(如上图的%ebp)
(4)这个帧指针开始后面保存的其他寄存器的值,如:局部变量等