linux内存管理-分页机制

来源:互联网 发布:涂色 app 源码 编辑:程序博客网 时间:2024/04/26 15:02
          分段机制将逻辑地址转换成线性地址后,还需要借助分页机制,将线性地址转换为物理地址;
   内存分页管理机制的基本原理是将整个线性内存区域划分成4KB为单位的内存页面;
   32位处理器可以支持的寻址空间为2^32 =4GB,以4KB作为一个页,称为page或者page frame(页框);
那么4GB的空间,总共就有4G/4K =1M个页面,每个页面属性需要4字节,整个页表所占空间就需要4MB;
访问物理内存前,首先要通过页表找到线性地址对应的物理地址,因此页表需要常驻内存,这样比较耗费
内存空间,尤其是对于内存资源紧张的嵌入式系统;因此将一级页表分成了两级页表,可理解为二维数组;
第一级页表称为页目录(page directory),每个元素代表一个页表(page table entry),每个元素4字节,总共1K个页表项,
占用一个page(4*1K);
每个页表也是由1K个页面属性构成,每个页面属性4字节,页面属性里面包含了页面的物理地址以及页面的属性信息;

两级页表结构总共就有1K*1K=1M个页面,可定义为PT[a][b],a=b=2^10;

页目录项

页目录项结构页目录项结构第31~12位是20位页表地址,由于页表地址的低12位总为0,所以用高20位指出32位页表地址就可以了。因此,一个页目录最多包含1024个页表地址。
第0位是存在位,如果P=1,表示页表地址指向的该页在内存中,如果P=0,表示不在内存中。
第1位是读/写位,第2位是用户/管理员位,这两位为页目录项提供硬件保护。当特权级为3的进程要想访问页面时,需要通过页保护检查,而特权级为0的进程就可以绕过页保护。
第3位是PWT(Page Write-Through)位,表示是否采用写透方式,写透方式就是既写内存(RAM)也写高速缓存,该位为1表示采用写透方式
第4位是PCD(Page Cache Disable)位,表示是否启用高速缓存,该位为1表示启用高速缓存。
第5位是访问位,当对页目录项进行访问时,A位=1。
第7位是Page Size标志,只适用于页目录项。如果置为1,页目录项指的是4MB的页面,请看后面的扩展分页。
第9~11位由操作系统专用,Linux也没有做特殊之用。

页面项

页面项结构页面项结构
80386的每个页目录项指向一个页表,页表最多含有1024个页面项,每项4个字节,包含页面的起始地址和有关该页面的信息。页面的起始地址也是4K的整数倍,所以页面的低12位也留作它用。
第31~12位是20位物理页面地址,除第6位外第0~5位及9~11位的用途和页目录项一样,第6位是页面项独有的,当对涉及的页面进行写操作时,D位被置1。
4GB的内存只有一个页目录,它最多有1024个页目录项,每个页目录项又含有1024个页面项,因此,内存一共可以分成1024×1024=1M个页面。由于每个页面为4K个字节,所以,存储器的大小正好最多为4GB。


    
线性地址转换过程:
第一级的页表,常驻内存,占1个page;32位线性地址,高10位(即位31~位22)用来表示一维数组的索引;计算之后获得第二级页表;再利用32位线性地址的中间10位(即位21~位12),获取二级页表具体某项页面属性;
该页面属性中即含有页面对应的物理地址的起始地址paddress;32位线性地址的最后12位代表了物理页面的偏移值offset,
paddress+offset 即可得到最终的物理地址;

过程如图:

两级页表结构


    

      为了支持64位系统的分页管理,linux采用了统一的分页管理模型:

Linux分页模型Linux分页模型

  • 页全局目录
  • 页顶级目录
  • 页中间目录
  • 页表

32位系统中可以将页顶级目录跟页中间目录置为0, 这样实际使用的就是二级页表;

64位系统可以根据需要采用三级或者四级页表管理;


0 0
原创粉丝点击