一、虚拟地址空间的认识
我们通常在说计算机的32位、64位操作系统,其实说的是 ALU的宽度,即一次性能处理最大数据长度(比特为单位);
在Windows操作系统下4G虚拟内存空间是,用户空间:内核空间是1:1
在Linux操作系统下4G虚拟内存空间是,用户空间:内核空间是3:1
Linux4G虚拟地址空间分配大致如下图:
二、
编译
预编译
生成.i文件 命令:gcc -E main.c -o main.o
1.删除#define
2.递归展开#include文件
3.删除#if0 #endif #elif
4.删除注释(// /**/)
5.添加行,文件表示
6.保留#pragma
编译
生成.s文件 命令:gcc -S main.i -o main.s
1.词法分析
2.语法分析
3.语义分析
4.代码优化
汇编
可重定位,可重入
生成.o文件或.obj文件 gcc -c main.s -o main.o
指令代码翻译成二进制
链接
生成.exe文件
1.合并段和符号表
2.符号解析(在符号引用的地方找到符号定义的地方(只关注全局符号))
3.分配地址和空间
4.符号重定位
三、运行原理
1.建立虚拟地址空间到物理内存的映射(创建内核映射结构体,创建页目录和页表)
2.加载指令和数据
3.把程序的入口地址写到PC寄存器中