编译 链接 运行原理

一、虚拟地址空间的认识

我们通常在说计算机的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寄存器中

 

 

猜你喜欢

转载自blog.csdn.net/YANG_1605/article/details/84501320