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 + 200h4 = 891800h(想一想为什么要4,答案
在文章后注释[1]处),现在我们要查看一下线性地址891800h处的值,在Softice中
,敲如下的指令:
: d 891800
假设得到的是493227h,这个值与0FFFFF000h作“与”运算,就得到了我们要找
的Page Table的起始物理地址493000h,那么493000h + 40Dh = 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毫秒