每一个进程在运行的时候,系统会为其分配一个以上构造的4G的虚拟地址空间:
3G为用户空间(私有)1G为内核空间(共享)

代码段:存放程序的执行代码,大小在运行前已经确定,也包含一些只读的常数变量,例字符串常量等。
数据段:存放程序中已初始化的全局变量(静态分配内存)。
堆区:用于存放进程运行中被动态分配的内存段,大小不固定,可动态扩张或缩减。
栈区:用于存放程序临时创建的局部变量,即函数括弧"{}"中定义的变量。

.o文件符号表里的符号,还没分配地址
3.链接过程

(1)所有.o文件的段进行合并,其中包含合并符号表,进行[符号解析]
符号解析:未定义的符号,找到其定义的地方
运行时:代码段、数据段
4.IA32体系虚拟地址映射

为什么不直接分配物理内存?
如果直接分配物理内存,有可能最终分配的地址被别人占用了
因为不知道哪块物理内存空闲。

第1次页面映射一定失败(在操作系统里)-->缺页异常
缺页异常处理完成之后-->重启地址映射-->成功
文章来源: 程序的编译,链接,运行和地址映射