Programming 版 (精华区)

发信人: Sun (大灯泡), 信区: Programming
标  题: VxD世界——分页机制 
发信站: 哈工大紫丁香 (Tue Aug 31 12:36:26 1999), 转信

   
  孙喜明 


关于分页机制


在这种机制下,内存被划分为固定长度的“页面”。在保护模式下,“页面”是受
到保护的,并可以被“虚拟”(说穿了,“虚拟”的东西就是说,本来没有的,而
应用程序却误以为有。比如说,你只有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]因为线性地址到物理地址的映射关系不是一对一的,这就是说同一处物理地址,
可能有多处线性地址指向它。
     
     
--
〖小糊涂虫2000灌水机〗

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