Linux内存管理解析(一) : 分段与分页机制

背景 : 在此文章里会从分页分段机制去解析Linux内存管理系统如何工做的,因为Linux内存管理过于复杂而本人能力有限。会尽可能将本身总结概括的部分写清晰。数组

从实模式到保护模式的寻址方式的不一样 : spa

  16位CPU的寻址方式 : 在 8086 CPU 中,提供了两类寄存器来进行寻址,分别为段寄存器(例如 CS,DS,SS)段偏移寄存器(例如 SI,DI,SP)。而这几种寄存器的长度都为16bit,寻址方式也很简单 : cs:ip = (cs << 4 + ip)。也就是说 cs寄存器的值左移4位加上ip的值获得的就是物理地址(物理地址就是内存中真实的值)。
3d

  32位CPU的寻址方式 : 在80X86 CPU 中,提供了分段与分页机制。对于CPU的寻址而言,再也不像 8086 CPU 那般将 段寄存器段偏移寄存器 直接运算获得结果。指针

  1)那么在32位CPU中是如何寻址的呢?blog

  i)如何开启分页分段模式?索引

    首先要介绍的就是 CR0 寄存器(以下图):ip

    

 

    对于CR0来讲,存在两个bit : 内存

    PE位 :  如若置位(1)则表示开启保护(分段)模式。it

    PG位 : 在PE位置位的前提下置位PG位表示开启分页模式。内存管理

  ii)分段机制如何进行寻址(获得线性地址)?

    简述 : 段寄存器(例如CS) 里面存在一个索引(index),它会根据GDTR寄存器找到一个表(GDT),而后这个表里面有元素,元素内部含有段基址。而这个段基址加上段变址寄存器的值就直接获得了线性地址的值。

    详述 :

    在开启分段模式以后,段寄存器里面的值的含义就再也不只是一个简单段基址了(也就是 (cs << 4)获得段基址),当下段寄存器加载的值称为段选择子,结构以下:

    

    能够看到这里有一个由几个bit组成的 描述符索引(也就是简述里所说的index),以及TI和RPL位(但目前不用管它)。

    GDTR : 

    

    能够看到GDTR和IDTR(这个实际上是另外一个相似于GDTR的寄存器)都是由线性基地址表长度组成,线性基地址也就是说这个表的头部所在的线性基地址(相似于数组名),表长度也就是这个表的长度啦。

    那么天然咱们就能获得一个相似于数组(由连续的地址组成)的表。

    对于这个"数组"来讲,它的元素则被称为 段描述符:

    

    能够看到段描述符很长(一共64bit)...可是不要紧,咱们当下只须要把其分为三个部分 : 段基地址,段限长,段属性。便可。(这里之因此基地址和段限长啥的分了几个部分主要是由于历史遗留问题,可是不要紧,他们只不过须要把几个分开的连在一块儿就能获得了真正的段基地址了)。

    那么获得了段基址,咱们天然将其与段变址寄存器内的值相加就获得了线性地址了!

    iii)分页机制如何进行寻址(获得物理地址)?

    如若咱们开始分页了,那么就表示咱们已经获得了一个线性地址(分页是在分段的基础上进行的)。

    简述 : 首先咱们把线性地址分为几个部分,目录(本质是页目录表的索引),页面(本质是页表的索引),页内偏移(本质是偏移量)

    由 CR3寄存器 做为 页目录表 的指针,经过CR3寄存器就能够获得一个表称为页目录表,页目录表内元素 称为 页目录项, 页目录项本质也是一个指针,指向一个 页表, 而页表内元素称为页表项,页表项内存在着 页基地址, 物理地址 = 页基地址(物理基地址) + 页内偏移(物理偏移地址)。

    简单来讲咱们能够把 页目录表和页表想象成一个二维的数组。页目录表元素是页表(一维数组),页表元素则是页基地址。 

    

    咱们只须要有两个元素(页目录表索引和页表索引)就能够获得一个物理(页)基地址,而后咱们再将 页内偏移加上物理基地址,就获得了真正的物理地址了!而一个页在80x86中是4K大小(页基址 至 页基址 + 4K 为一页)。因此内存管理的页也是4K大小。

    附图(寄存器数据) :

    

    由图我门能够知道,页基地址(页帧),是4K对齐的(2^12 = 4K),也就是说页表项内只有12 - 31位是页基地址,其余的位是页属性,每次经过页表项计算物理地址只须要将 0 - 11位复位(0),便可。

    对于页属性 : 表述这个页的权限之类的,由于有的页面是属于内核才能去使用的。更重要的一点是 : 这个页是否存在。

    页目录和页表的表项格式:

  

    如图所示 : 咱们能够知道当 P位 被置位则表示页面存在,当 P位复位(为0) 则表示页面不存在,如若页面不存在,那么就会产生缺页中断,执行缺页中断处理程序

相关文章
相关标签/搜索