在介绍Linux虚拟内存管理之前,我们必须介绍 X86 CPU
的分段和分页机制(比较枯燥的知识点),因为Linux虚拟内存管理是建立在分段和分页机制的基础上的。
分段的本意是按不同的功能来把内存划分成不同的段进行管理,例如:一个进程按不同的功能,可以划分为数据段、代码段和堆栈段等等。数据段和堆栈段可以进行读写操作但不能执行,而代码段能够执行但不能写(因为如果代码段能进行写操作,那么一些恶意的程序就可以随意改动要执行的代码进行一些非法的操作)。
从本意来看,分段是一个不错的内存管理方案。但是,分段机制有个致命的问题,就是当内存不足时,需要把整个段交换到磁盘中。如果段占用的空间很大,那么交换的代价就非常大,以致后来开发出分页机制来弥补这个问题。
有了分页机制后,分段机制本应可以去掉的,但是 Intel 公司为了兼容旧版的CPU,保留了分段机制,所以新版的CPU也一直保留着分段机制。在安装有 X86 CPU
的电脑开机后,首先会进入 实模式
,所谓的 实模式
是指进程中访问的内存地址都是物理地址,而且内存地址通过 段寄存器:偏移量
的方式访问,X86 CPU
的段寄存器有6个,分别为: cs
、ds
、fs
、gs
、ss
和 es
。cs
是代码段寄存器,ds
是数据段寄存器,ss
是堆栈段寄存器,而 fs
、gs
和 es
是辅助段寄存器。