HITEA 版 (精华区)

发信人: hfl (凤凰·风中轻舞), 信区: HITEA
标  题: VxD世界——分页机制
发信站: 哈工大紫丁香 (2002年04月02日20:46:12 星期二), 站内信件


  关于分页机制


  在这种机制下,内存被划分为固定长度的“页面”。在保护模式下,“页面”是受

  到保护的,并可以被“虚拟”(说穿了,“虚拟”的东西就是说,本来没有的,而

  应用程序却误以为有。比如说,你只有64MB内存,而你的程序却傻乎乎地认为它可

  以有4GB的内存用,这就是“虚拟”)。


  还记得前面讲过的保护模式下“段”的概念吗?在保护模式下,段的长度是可以变

  化的,而这里,“页面”的大小是不能变的,虽然它俩都受到保护模式的“保护”

  和“虚拟”。那么“页面”的大小是多少呢?答案是4KB。


  假如现在有个32位的线性地址,我们来看一下怎么由这个线性地址获得物理地址。


  图1 线性地址通过页面映射为物理地址


  请记住图1表示内容,因为它实在是太重要了。图中的CR3是指寄存器CR3的值。如

  果你装了Softice for Win95,那就按下Ctrl+D激活Softice,然后敲指令:


  CPU;这时会看到CR3的值。


  线性地址转换为物理地址的例子


  假设现有线性地址8000DD88h,我们来看一下它到底指向何处物理地址。性线地址

  8000DD88h应作如下解析:


  800 0D D88

  Page Table Index Page Index Page Offset

  (页面表索引) (页面索引) (页面偏移地址)


  现在我们需要知道页面表目录的起始地址。于是我们查看寄存器CR3。假设寄存器

  CR3=891000h,那么891000h + 200h4 = 891800h(想一想为什么要4,答案

  在文章后注释[1]处),现在我们要查看一下线性地址891800h处的值,在Softice中


  ,敲如下的指令:


  : d 891800


  假设得到的是493227h,这个值与0FFFFF000h作“与”运算,就得到了我们要找

  的Page Table的起始物理地址493000h,那么493000h + 40Dh = 49302Ch(想

  一想为什么要4,见注释[2]),然后我们要知道物理地址49302Ch处的值,但是在


  Softice中,我们无法直接获得存放在物理地址处的值,只能通过其对应的线性地址


  来查看。在Softice中,敲如下指令:


  : phys 49302C


  假设得到的是线性地址89302Ch(有时你会得到两个不同的值,我们取第一个值。

  想一想为什么会有两个不同的值?答案在注释[3]),现在我们查看一下线性地址

  89302Ch处的值,这也是物理地址49302Ch处的值。在Softice中,敲如下指令:


  : d 89302C


  假设得到的是3F5000h,这就是我们要找的Page(页面)的物理地址。然后,

  3F5000h + 0D88h = 3F5D88h,这就是线性地址8000DD88h对应的物理地址。我

  们想在Softice中查看物理地址3F5D88h处的值,那就得找到其相应的线性地址。在

  Softice中,敲如下指令:


  : phys 3F5D88


  假设我们得到线性地址7F5D88h,让我们看一下这个线性地址7F5D88h处的值。在

  softice中,敲如下指令:


  : d 7F5D88


  让我们记下结果,然后再看一下线性地址8000DD88h处的值。


  : d 8000DD88


  你会发现线性地址7F5D88h与线性地址8000DD88h所指向的值是完全一样的。


  一般来说,为了提高地址转换的效率,在CPU里都会有一个页面转换缓冲区(TLB

  ),里面存放着最近页面转换的信息。


  MMU(Memory Management Unit)


  从386开始,CPU都带有一个内存管理单元(Memory Management Unit,简称

  MMU)。


  MMU负责提供的功能:虚拟内存、重组段、进程分隔、页面保护、地址转换。


  我们在上面的例子中所进行的线性地址到物理地址的转换就是由MMU来完成的。


  模式转换


  我们简单提一下保护模式与实模式之间的切换过程,有个概念就可以了。


  由实模式切换到保护模式:检测一下当前CPU是否有能力运行于保护模式下;检测

  保护模式环境(DPMI或VCPI);建立IDT;建立GDT;禁止中断,包括NMI;加载

  GDTR;设置IDTR;设置CR0的bit 0;清空指令队列;加载段寄存器;允许中断。


  由保护模式切换到实模式:禁止中断,包括NMI;禁止页面转换;设置数据段寄存

  器的值为准实模式下的选择器;重置CR0的bit 0;清空指令队列;设置IDTR=0000

  :03FF;允许中断。


  [1]因为在Page Table Directory中,每一个表项占4个字节。


  [2]因为在Page Idex Table中,每一个表项占4个字节。


  [3]因为线性地址到物理地址的映射关系不是一对一的,这就是说同一处物理地址,


  可能有多处线性地址指向它。



--
            . . . . o o o o o
                   _____      o       _______
          ____====  ]OO|_n_n__][.     |Go to|
         [________]_|__|________)<    | HITEA|
         oo    oo  'oo OOOO-| oo\\_   ~~~|~~~
      +--+--+--+--+--+--+--+--+-$1-+--+--+--+--+     

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.253]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.429毫秒