从一个.c/cpp到进程
预编译,汇编,汇编,链接,运行
编译阶段
(预编译,编译,汇编,链接)在一个编译单元处理(一个源文件)
一,预编译(产生.i文件)
1,删除#define并作文本替换
2,#include递归展开头文件
3,#if,#endif,#elif的处理
4,删除注释
5,添加行号,文件标识
6,保留#prangma
二,编译
1,词法分析
变量:数字,字母,下划线。(数字不能做首字母)
2,语法分析
3,语义分析
4,代码优化
5,生成汇编指令
三,汇编(生成.o的文件(ELF格式),即目标文件或可重入二进制文件)
1,翻译指令
a,为什没bss信息不存在,信息从哪里来?
因为在section header(目录文件)可以找到
b,bss少了一个字节,少了一个变量
少了一个弱符号
强弱符号:全局变量存在强弱符号,弱符号放在COM,静态(局部变量)不存在
————————————
编译阶段结束
当.c到.o每一个文件都是单独生成的
若有外部符号,将外部符号时先放到**“UND”区
在函数中有外部的符号引用或者是函数的引用,先给一个虚拟地址**
链接
目标文件和可执行文件是ELF格式文件(Windows是PE)
一,合并段和符号表
(处理强弱符号)
a,找到强符号-——删除弱符号——使用强符号
b,找不到——'COM‘——.bss
二,符号解析
符号引用的地方找到符号定义的地方
“UND”找到符号定义区
三,分配虚拟地址空间
四,符号的重定位
a,真实地址和偏移替换
b,虚假地址和偏移
——————————————
链接结束
合并的文件的和虚拟地址空间做了映射,但虚拟地址空间和真实物理空间还没映射
运行
一,建立虚拟地址空间和物理内存空间的映射
创建内核映射结构体,创建页表页目录
二,加载指令和数据 loader
三,main入口地址写入下一行指令寄存器
机械原理——存储器
空间越大—— io越差——越便宜
空间越小——io越好——越昂贵
操作系统
1,内存管理模块
2,进程管理模块
3,文件管理模块