Linux内存管理之分页机制

前面一篇文章讲到逻辑地址到线性地址的转换,也就是分段机制的实现.分段机制虽然能够让程序员方便

地管理程序的各个段,并且可以动态调整段的大小,而且对内存的碎片率也大大减小.但是还是没有解决

程序大小比物理内存还大的问题,这时候就出现了分页机制,分页机制的出现最大的体现就是虚拟内存,虚

拟内存的实现可以让大的程序装入内存.分页机制的实现还导致了部分程序装入,按需分配内存,代码共享

等.

根据上图,逻辑地址通过分段机制变成线性地址,线性地址通过分页机制变成物理地址。那么怎么奖线性

地址转换成物理地址呢?首先,对于没有启用分页机制的系统(通过一个寄存器的某一个比特判断)。则直

接把线性地址映射到物理地址,物理地址传入到地址总线上。若是启用了分页机制,CPU会把线性地址进行

拆分。

这里引入先页的概念,OS把虚拟内存切割,每部分的大小都是一样的(一般可以根据硬件指定),每

部分就叫做页(Page),每张页都对应物理内存中的页框(Page Frame,其实就是依次个对应的关系)。

但是线性地址中某个标号为N的页,在物理内存中标号可以是M(N!=M)。也就说可以每个线性地址页都

在物理内存中有相对应的页框。而页和页框的对应关系是存在页表里面的,这里可以这样理解,页是一个函

系统的输入,页框是一个系统的输出,而页表就是这个系统.但是一张页表要处理整整4G(32位)的大小

,光光这张页表就需要很大了.所以就引入二级页表的概念,也可以说成是页目录,页目录的原理和前面页

表的作用一样,只不过页目录这个系统的输入是页号,而输出是页表的地址.

好了,理解了上面的基本概念之后,我们就开始线性地址到物理地址的转换.对于一个线性地址,前面的10

bits当作页目录项,找到页目录项后就找到对应的页表起始地址,根据线性地址的中间后面10bits(页表的

偏移)+页表起始地址,找到物理内存中的页框地址,内存中的页框地址+线性地址低12位就是实际的

物理地址.

同样的,上述过程在访问最终的物理内存之前,要进行两次内存访问,两次查表,效率肯定就低了.现代

计算机会把页表和页目录也用硬件进行缓存,当然是一部分常用的项.

综上,分页机制大概就是这么个流程.

标签:Linux, OS

评论已关闭