Linux内存管理机制
内存的表象层次依次为 逻辑地址------>线性地址----->物理地址
逻辑地址经过段机制转换成线性地址。
线性地址经过页机制转换成物理地址。
Linux将所有程序的段地址定为 0 - 4G(Linux中),所有虽然逻辑地址和线性地址不一样,但是在Linux中它们的值是一样的,可以认为是等价的。
问题:
-
进程空间地址如何管理?
-
进程地址如何映射到物理内存?
-
物理内存如何被管理?
进程内存空间
Linux使用虚拟内存管理技术,使得每个进程都有互不干涉的内存空间。该空间在32位操作系统上是4G的线性虚拟空间。用户所接触到的空间都是虚拟地址空间,无法看见实际的物理空间。使用这种技术不仅能保护操作系统,还可以获得比实际物理空间更大的地址。
-
4G虚拟地址空间被分为用户空间和内核空间。用户占0-3G,内核栈3G-4G。用户只能访问自己的虚拟地址空间,不能访问内核空间。之一用户进程进行系统调用(代表用户空间在内核态运行)才可以访问内核空间
-
用户空间对应进程,所以当进程切换时,用户空间就会变化。内核空间是内核负责映射的,并不会根据进程进行改变,是固定的。
内核空间有自己的页表(init_mm.pgd),用户进程有不同的页表
-
每个进程的用户空间都是完全独立、互不相干的。
进程内存管理
进程内存管理的对象是进程线性地址空间上的内存镜像,这些内存镜像起始就是进程使用的虚拟内存区域。统一管理这么大的空间非常不容易。为了方便管理,虚拟空间被划分程成许多大小可变的内存区域(一般是4K),这些区域在进程线性地址中像停车场一样有序排列。这些区域的划分原则是将访问的属性一致的(可读