
本章理论基于
32位平台的Linux–kernel 2.6.32版本内核
为了保证内存安全,现代操作系统不允许应用程序(进程)直接访问物理内存空间
一般来说,操作系统和编译器会给每一个进程设置一个独立的虚拟内存空间和一张映射页表,虚拟内存空间称为进程地址空间,虚拟内存地址通过特定的映射关系与物理内存地址建立联系
Linux的进程地址空间从0x00000000 ~ 0xffffffff进行编号,结构如下:
进程中的指令想要访问物理内存,就必须借助虚拟内存地址进行映射,进程的虚拟地址与物理内存通过页表进行映射:
在应用层视角中,应用程序代码中的变量和函数(数据)的内存地址以及指令本身的内存地址全部都是虚拟内存地址!!!所有的这些虚拟内存地址以及它们与物理内存地址的映射关系在应用程序编译时就已经确定了,因此进程的虚拟内存机制本质上是操作系统和编译器协同形成的一种内存管理机制
Linux内核中,进程地址空间由一个struct mm_struct来维护,每个进程的PCB结构体(进程控制块)都会指向一个struct mm_struct结构体:
struct mm_struct结构体维护进程地址空间的具体方式类似于用指针来维护地址区间:
struct mm_struct结构体和映射页表,因此Linux进程地址空间的本质是操作系统中的struct mm_struct结构体和映射页表构成的内核数据结构Linux进程的PCB(task_struct)和进程地址空间(mm_struct)的存在形式:

PBC和指令集被加载到内存中后,操作系统不会立即为该进程中的对象分配物理内存(即使进程中每个对象都有一个虚拟地址),只有当进程对某个对象进行读写操作时,操作系统才会通过页表映射为对象分配物理内存,这种内存的延迟分配策略提高了各进程并发执行过程中计算机内存的使用效率