函数的执行、调用、堆栈与递归

前提

本文将从下层的角度来叙述C程序的运行流程,这是一般C程序员不太需要关心的部分(Java则更不用关心了),但是却是基础的、重要的部分。能够从内存访问角度上理解,才能理解一些更多的优化的方法。而从上层到下层理解整个函数的调用,涉及的内容基本上可以作为一个主干流程来从大体上了解整个操作系统了。
我们知道基本的计算机结构:CPU–内存–外存。从最简单的角度来看,外存来存放程序代码与数据,将其读入内存,从而允许CPU根据内存地址来进行程序代码和数据的访问与修改。当然在每一个步骤的实现上都涉及到了许多的细节。

程序的预编译、编译、连接,可重入性

进程、进程地址空间,内存分段(代码区、数据区、堆栈区)

程序的调用:Unix内核态与用户态,执行入口与获得程序代码的起始逻辑地址,逻辑地址、线性地址与物理地址地址转换、页表查询、缺页中断

程序编译完成之后,当内核通过exec函数来执行C程序时,在调用main前会先调用一个特殊的启动例程,该例程将会将

数据的传递:栈、通用寄存器、引用、指针

【3】 p116

int a = 4; int b = exchange(&a,3);

int exchange(int *xp,int y){
	int x = *xp;
	*xp = y;
	return x;
}

这里有个有意思的解释,在p118中,说“C操作符&,称为取址操作符 用于创建一个指针”,将该指针指向保存局部变量a的位置。

栈的底层实现:寄存器SS,SP

【3】p117

进程的退出:

参考

【1】 UNIX环境高级编程
【2】 汇编语言,第三版
【3】 深入理解计算机系统,第三版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值