Programming 版 (精华区)
发信人: Sun (大灯泡), 信区: Programming
标 题: VxD世界——关于“描述表”
发信站: 哈工大紫丁香 (Tue Aug 31 12:36:12 1999), 转信
孙喜明
前面我们提到了在保护模式下,内存中往往至少有三张表:GDT,LDT,IDT。聪明
的你可能要问:这几张表都在内存的什么地方呢?
图1 几个重要的寄存器的示意图
这三张表的位置是由三个寄存器记录的。这三个寄存器分别是:GDTR,LDTR,
IDTR。我们还要补充讲解一个寄存器,那就是TR(Task Register),这个寄存器
与保护模式的任务管理有关。在386中,这几个寄存器如图1所示。
我们可以看到GDTR和IDTR都分别包含32位的物理地址和16位的权限级别,总共48
位。GDTR和IDTR中的32位地址是线性地址,不是段:偏移(Seg:Offset)的组合
形式,它表明了段开始的地方,如果说系统还没有启动内存分页管理机制的话,那
这个线性地址就是物理地址,可是一旦系统启动了内存分页管理机制,GDTR和
IDTR中的32位线性地址就不再指向物理地址了。
CPU保留了GDT中的第一个描述符,任何试图通过GDT中的第一个描述符来访问内
存的操作都是非法的(还记得Win95下那可怕的蓝屏吗?)。如果指向GDT的段选
择器的Index域为0的话,那就指向空的段选择器。段选择器的示意如图2:
TI:Talbe Indicator
RPL:Requestor Privilege Level
图2 段选择器
这就是说,在保护模式下,far NULL指针是非法的。而在实模式下,NULL指针却是
有意义的。
在内存中(当然是指CPU工作在保护模式下啦),GDT和IDT都只有一份,也就是
说,它们是全局的,任何一个任务改变了这两张表,都会对别的任务产生影响。
下面我们谈谈IDT、IDT中的每一项,也就是每一个描述符,都定义了256个中断中
的一个。还记得实模式下MS-DOS环境中的中断向量表吧?在保护模式下,中断描
述表IDT代替了中断向量表。虽说中断描述表可以容纳8192个中断描述符,可是
CPU能利用的只有处于前面的256个。所以中断描述表的长度限制应该是7FFh(23
×28-1)。
T=0:Interrupt gate描述符
1:Trap gate描述符
图3 Trap/Interrupt gate描述符
其实中断描述表(IDT)中可以有两种描述符:Interrupt gate描述符、Trap gate描
述符。图3显示了Trap/Interrupt gate描述符的结构。这里提到了gate这个词,一般
译作“门”。 “中断门”形像地直接表示了中断调用的过程:中断调用就像经过一
扇门一样,这个门就是中断描述符,因为中断描述符中有DPL等权限盘查的标志,
所以要想通过这扇门调用相应的中断服务程序是需要一定的资格的。
Trap和Interrupt gate非常相似,一般来说Trap gate是用来捕获系统异常,而
Interrupt gate用来响应中断。在具体的实现上,只有一点不同:Interrupt gate会将
IF置为0,这样可以屏蔽硬件中断。但是Trap gate不会改变IF的值。
寄存器LDTR中存有LDT的位置。与GDT不同的是,内存中可以有多份LDT。每一个
任务都可以有自己的LDT。从图1中我们可以看到,LDTR不包含“地址 / 权限”位
。LDTR中所包含的是一个段选择器。这个段选择器指向GDT中的一项,但不是普
通的一项,这一项是指向某一LDT的描述符。你可能马上意识到,GDT中可以包含
指向不同LDT的描述符,不错,正是这样的。在Windows保护模式下,每一个MS-
DOS应用程序都有自己的LDT,而所有的Windows应用程序都共享一份LDT。是不
是想起些什么来了?对了,这与Windows中VM(虚拟机)的概念多少类似!
--
〖小糊涂虫2000灌水机〗
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: sun@hope.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.854毫秒