Chinaunix首页 | 论坛 | 博客
  • 博客访问: 374090
  • 博文数量: 105
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 826
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-16 13:58
个人简介

记录有意义的东西

文章分类

全部博文(105)

文章存档

2013年(105)

我的朋友

分类: LINUX

2013-04-28 03:15:30

今天重温Linux中的分页机制时的笔记。
分页机制中三个重要的寄存器:CR0,CR2,CR3;
CR0:中寄存器的第31位表示芯片上的分页部件允不允许工作,即允不允许分页。
CR2:是缺页线性地址寄存器,保存最后一次出现缺页的全32位线性地址。
CR3:是页目录基址寄存器,保存页目录的物理地址,页目录总是放在以4KB为单位的存储器边界上。因此,低12位为0,不起作用,即使写上内容,也不会被理会。

物 理页和虚拟页面大小都是4KB。页表是把线性地址映射到物理地址的一种数据结构,包括:页面物理地址和页的属性(是否在内存中,是否可读或可写)因为页面 大小是4KB,所以物理页面的基址的低12位为0,这12位就用来表示页面的属性,这样一个页表项就是32位,4G空间要分为1M个页面(1个4KB), 这样就需要4M空间来存放页表,而且要求是连续的,这样是不能接受的,所以采用二级页表的方法,即为页表再建立一个页表,称之为页目录。

  一个线性地址为32位,高10位是页目录中的索引,对于每个进程都保存着页目录的物理基地址,切换该进程时,即把这个值赋到CR3中。用这个值加上高10位乘以4得到页表基地址(因为每个页目录项的大小也为4KB),这个基地址加上线性地址中间10位(即页表中存放的页号的地址),得到物理页面基地址,然后用物理页面的基址加上线性地址的后12位得到实际物理地址。

页表项结构:高20位表示物理基址,低12位表示页面属性(0位:present=1表示已经装入内存;)

 页面高速缓存(cache)页表是放在内存中的,这使得CPU每次读取数据都要至少访问两次内存,从而大大降低了访问速度。为了提高速度,在IA32中 设置了一个记录最近存取页的高速缓存部件,它自动保留处理器最近使用的32项页表项,这样就覆盖了128KB的范围,先查缓存是否命中。
我们看一下虚拟地址到物理地址转换的时候操作系统是怎么执行的:

MMU由一个或一组芯片组成,其功能是把虚拟地址映射为物理地址,即进行地址转换!

阅读(1481) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~