现在的位置: 首页 > 综合 > 正文

内核源码学习:段机制和描述符(二)

2017年11月27日 ⁄ 综合 ⁄ 共 2050字 ⁄ 字号 评论关闭

.3.3系统段描述符

以上介绍了用户段描述符。系统段描述符的一般格式如图2.14所示:

 

                    2.14系统段描述符的一般格式

可以看出,系统段描述符的第5个字节的第4位为0,说明它是系统段描述符,类型占4位,没有A位。第六个字节的第六位为0,说明系统段的长度是字节粒度,所以,一个系统段的最大长度为1M字节。

系统段的类型为16种,如图2.15所示:

 

图 2-15 系统段的类型

在这16种类型中,保留类型和有关286的类型不予考虑。            

门也是一种描述符,调用门、任务门、中断门和陷阱门四种门描述符

4 描述符表             

各种各样的用户描述符和系统描述符,都放在对应的全局描述符表、局部描述符表和中断描述符表中。

描述符表(即段表)定义了386系统的所有段的情况。所有的描述符表本身都占据一个字节为8的倍数的存储器空间,空间大小在8个字节(至少含一个描述符)64K字节(至多含8K)描述符之间。

1. 全局描述符表(GDT)

全局描述符表GDT(Global Descriptor Table),除了任务门,中断门和陷阱门描述符外,包含着系统中所有任务都共用的那些段的描述符。它的第一个8字节位置没有使用。

2. 中断描述符表IDT(Interrupt Descriptor Table),包含256个门描述符。IDT中只能包含任务门、中断门和陷阱门描述符,虽然IDT表最长也可以为64K字节,但只能存取2K字节以内的描述符,即256个描述符,这个数字是为了和8086保持兼容。

3. 局部描述符表(LDT)

局部描述符表LDT(local Descriptor Table),包含了与一个给定任务有关的描述符,每个任务各自有一个的LDT。有了LDT,就可以使给定任务的代码、数据与别的任务相隔离。

每一个任务的局部描述符表LDT本身也用一个描述符来表示,称为LDT描述符,它包含了有关局部描述符表的信息,被放在全局描述符表GDT中。

5 选择符与描述符表寄存器

在实模式下,段寄存器存储的是真实的段地址,在保护模式下,16位的段寄存器无法放
32位的段地址,因此,它们被称为选择符,即段寄存器的作用是用来选择描述符。选择符的结构如图2.16所示:            

 

          

 

            图 2.16选择符的结构

可以看出,选择符有三个域:第15~3位这13位是索引域,表示的数据为0~8129,用于指向全局描述符表中相应的描述符。第二位为选择域,如果TI=1,就从局部描述符表中选择相应的描述符,如果TI=0,就从全局描述符表中选择描述符。第10位是特权级,表示选择符的特权级,被称为请求者特权级RPL(Requestor Privilege Level)。只有请求者特权级RPL高于(数字低于)或等于相应的描述符特权级DPL,描述符才能被存取,这就可以实现一定程度的保护。

我们知道,实模式下是直接在段寄存器中放置段基地址,现在则是通过它来存取相应的描述符来获得段基地址和其它信息,这样以来,存取速度会不会变慢呢?为了解决这个问题,386的每一个段选择符都有一个程序员不可见(也就是说程序员不能直接操纵)88位宽的段描述符高速缓冲寄存器与之对应。无论什么时候改变了段寄存器的内容,只要特权级合理,描述符表中的相应的8字节描述符就会自动从描述符表中取出来,装入高速缓冲寄存器中(还有24位其他内容)。一旦装入,以后对那个段的访问就都使用高速缓冲寄存器的描述符信息,而不会再重新从表中去取,这就大大加快了执行的时间,如图2.17所示。
图 2.17 段描述符高速缓冲寄存器的作用

由于段描述符高速缓冲寄存器的内容只有在重新设置选择符时才被重新装入,所以,当你修改了选择符所选择的描述符后,必须对相应的选择符重新装入,这样,88位描述符高速缓冲寄存器的内容才会发生变化。无论如何,当选择符的值改变时,处理器自动装载不可见部分。

下面讲一下在没有分页操作时,寻址一个存储器操作数的步骤:

1. 段选择符中装入16位数,同时给出32位地址偏移量(比如在ESIEDI中等等)

2. 根据段选择符中的索引值、TIRPL值,再根据相应描述符表寄存器中的段地址和段界限,进行一系列合法性检查(特权级检查、界限检查),该段无问题,就取出相应的描述符放入段描述符高速缓冲寄存器中。

4. 将描述符中的32位段基地址和放在ESIEDI等中的32位有效地址相加,就形成了32位物理地址。

注意:在保护模式下,32位段基地址不必向左移4位,而是直接和偏移量相加形成32位物理地址(只要溢出)。这样做的好处是:段不必再定位在被16整除的地址上,也不必左移4位再相加。

寻址过程如图 2.18所示。


                                                                           2.18 寻址过程

抱歉!评论已关闭.