HITEA 版 (精华区)

发信人: hfl (凤凰·风中轻舞), 信区: HITEA
标  题: VxD世界——关于“描述表”
发信站: 哈工大紫丁香 (2002年04月02日20:45:27 星期二), 站内信件


  前面我们提到了在保护模式下,内存中往往至少有三张表: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(虚拟机)的概念多少类似! 


--
           @..@
          (\--/)             注意:不要因为上网熬红了你的眼睛
         (.>__<.)
         ^^^  ^^^ 

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