程序的加载过程
2025/8/10...大约 1 分钟C++
概览
在讨论内存管理之前,我们必须先了解一件事:C++ 程序是如何进入内存并开始运行的。
这不仅是操作系统与编译器的协作过程,也是理解内存布局的前提。
一个 C++ 程序从源文件到开始执行,大致要经历以下阶段:
1. 从源代码到可执行文件
C++ 代码并不是直接就能运行的。它首先要经过 编译(Compile) 和 链接(Link) 两个关键阶段,生成操作系统可识别的可执行文件。这里我们就不再详细介绍了,可以查看 编译过程 查看具体内容;
2. 操作系统加载程序
当你在命令行输入:
./program
操作系统会调用 装载器(Loader) 将可执行文件装入内存,主要步骤如下:
- 创建进程
- 分配进程控制块(PCB)
- 初始化进程的虚拟地址空间
- 读取可执行文件头
- 检查文件格式(ELF、PE 等)
- 解析各个段(
.text
、.data
、.bss
)的地址与大小
- 映射代码和数据
- 将代码段映射为只读可执行
- 将数据段映射为可读写
- 分配运行所需的内存区域
- 分配堆(Heap)和栈(Stack)空间
- 设置内存映射区域(动态库、文件映射等)
- 运行时初始化
- 调用 C++ 运行时库(CRT)完成:
- 全局/静态变量初始化
- 构造全局对象
- 最后调用
main()
函数开始执行
- 调用 C++ 运行时库(CRT)完成: