文章目录
- 一.Linux进程地址空间的结构
- 二.Linux管理进程地址空间的方式
- 三.Linux进程使用物理内存的模型
- 四.进程地址空间的存在意义
本章理论基于
32
位平台的Linux
–kernel 2.6.32
版本内核
一.Linux进程地址空间的结构
-
为了保证内存安全,现代操作系统不允许应用程序(进程)直接访问物理内存空间
-
一般来说,操作系统和编译器会给每一个进程设置一个独立的虚拟内存空间和一张映射页表,虚拟内存空间称为进程地址空间,虚拟内存地址通过特定的映射关系与物理内存地址建立联系
-
Linux
的进程地址空间从0x00000000 ~ 0xffffffff
进行编号,结构如下: -
进程中的指令想要访问物理内存,就必须借助虚拟内存地址进行映射,进程的虚拟地址与物理内存通过页表进行映射:
-
在应用层视角中,应用程序代码中的变量和函数(数据)的内存地址以及指令本身的内存地址全部都是虚拟内存地址!!!所有的这些虚拟内存地址以及它们与物理内存地址的映射关系在应用程序编译时就已经确定了,因此进程的虚拟内存机制本质上是操作系统和编译器协同形成的一种内存管理机制
- CPU内部在执行指令的时候,其使用的内存地址也是虚拟内存地址
二.Linux管理进程地址空间的方式
- 每一个进程都有自己独立的进程地址空间和映射页表
Linux
内核中,进程地址空间由一个struct mm_struct
来维护,每个进程的PCB
结构体(进程控制块)都会指向一个struct mm_struct
结构体:struct mm_struct
结构体维护进程地址空间的具体方式类似于用指针来维护地址区间:- 当内存中加载了多个进程时,操作系统中就会存在多个
struct mm_struct
结构体和映射页表,因此Linux
进程地址空间的本质是操作系统中的struct mm_struct
结构体和映射页表构成的内核数据结构
三.Linux进程使用物理内存的模型
Linux
进程的PCB
(task_struct
)和进程地址空间(mm_struct
)的存在形式:
- 进程指令集访问物理内存的方式:
四.进程地址空间的存在意义
- 借助映射页表操作系统可以拒绝应用进程的非法访问内存的请求,保证了计算机系统的内存安全
- 在操作系统的设计意义上,虚拟内存机制使得操作系统的内存管理模块和进程管理模块完成了解耦合,当内存管理算法需要调整时,不会影响到进程管理模块的设计(只需修改映射页表中的物理地址即可),同样,当进程管理模块需要重新设计时,不会影响到内存管理模块
- 虚拟内存机制其实是一种物理内存的延迟分配策略,当进程
PBC
和指令集被加载到内存中后,操作系统不会立即为该进程中的对象分配物理内存(即使进程中每个对象都有一个虚拟地址),只有当进程对某个对象进行读写操作时,操作系统才会通过页表映射为对象分配物理内存,这种内存的延迟分配策略提高了各进程并发执行过程中计算机内存的使用效率 - 由于进程虚拟地址空间的存在,在应用程序的视角中,各对象的内存地址都是有序地,紧凑地排布的,使得开发人员可以更方便地进行内存操作,同时操作系统也可以更方便地对进程使用内存的情况进行监视和管理,实现物理内存的即时分配和释放.