前提
本文将从下层的角度来叙述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】 深入理解计算机系统,第三版