李庚睿的毕业论文(保护模式) - 图文 下载本文

标题 作者 说明 毕业论文 李超 ?所有版权作者保留 题目 时间 页数 80386保护模式与Linux内核引导分析 2005-4-1 共91页 路漫漫其修远兮,吾将上下而求所。

息都摘自于《IA-32 Intel? Architecture Software Developer’s Manual Volume 3: System Programming Guide》。

描述符

在介绍描述符的细节之前,我先讲一下我的讲述思路,让大家在思想上有一个准备,我想这是很有必要的。具体的讲述步骤如下:

·首先给出一张分析图,让大家先对要讲解的事务有个视觉的了解。 ·然后介绍图中一些概念。如什么是选择子,什么是描述符等。 ·最后再来详细的讨论一下它们之间的相互关系及其特点。

以后我所有的讲述都按照这种方式进行。我想,以这样一种方式进行讲解,由其是先给出图形化的东西,会更有助于对新概念或新事物的理解。俗话说,千言万语不如一张图。下面就让我们满怀激情开始我们真正的航程吧?!

段选子

段选子的结构

段选子的作用

段选子是用来在GDT或LDT中检索描述符的。

第33页

标题 作者 说明 毕业论文 李超 ?所有版权作者保留 题目 时间 页数 80386保护模式与Linux内核引导分析 2005-4-1 共91页 路漫漫其修远兮,吾将上下而求所。

段选子的组成

如图所示,它由INDEX(13位)、TI(1位)、RPL(2位)三部个组成。它们的意义如下:

·INDEX:用于在GDT或LDT中检索描述符。它由13位组成,因为描述符是由8个字节组成,所以它最多能够检索到213,即8K个表项。当然在一个真实的操作系统中根本不会用到这么多表项。这8K是怎么算的呢?INTEL将段选子设计的很巧妙,它将段选子的低3位作为属性使用,当进行检索时,它就将这三个忽略为0,那么在INDEX中的值每次加1,段选子就能自动的跳到下一个描述符去。是不是很巧妙?。

·TI位:我在图中已经给出了它的作用。它是用来区分是在GDT中进行检索还是在LDT中进行检索。如果TI=1,则要求它到GDT中查找描述符项。否则如果TI=0,则要求它到LDT中查找描述符项。

·RPL位:它代表当前代码段希望请求的段(目的段)的特权级要小于该特权级。关于特权,我将在下面给出。这里先作个简单的介绍。80386共分四个特权级从0到3,其中数字越小代表的权值越大。

全局描述符表与局部描述符表寄存器

全局描述符表寄存器

它共由48位组成。其中高32位用作段基址,低16位用做段界限。 ·GDTR的作用

它用于定义GDT在内存空间中的具体位置。GDT不是内存中的段,也就是说,它不是由段描述符指定的,这是由INTEL 规定的。在整个内存空间中只有一个GDT,只能通过GDTR寄存器才能找到GDT在内存的位置。除此以外没有任何方法。在Linux中,一旦进入到保护模式下,就已将GDTR的值设置好。 ·GDTR的说明

第34页

标题 作者 说明 毕业论文 李超 ?所有版权作者保留 题目 时间 页数 80386保护模式与Linux内核引导分析 2005-4-1 共91页 路漫漫其修远兮,吾将上下而求所。

它由两部分组成:32位段基址和16位表界限。其中的段基址用来指明

GDT在线性地址空间中的位置。而表界限指明了表的最大空间。因为每个描述符都是由8字节组成,所以它最多可以存放8K表项。这样正好与前面所讲的段选子相对应。

局部描述符表寄存器

局部描述符表寄存器由可见和不可见两部分组成。 ·LDTR的作用

它与GDTR有所不同,LDTR是由10个字节组成。其中的16段选子为可见部分,48位描述符为不可见部分。LDTR首先使用16位可见部分的选择子到GDT中找到相应的描述符项。之后,通过特权级检查看其是否有权力访问这个描述符。如果通过检查,则将这个描述符导入到LDTR寄存器的不可见部分中。 ·LDTR说明

为什么不将LDTR设计成与GDTR一样的结构呢?这当然是有原因的。下面我就来具体解释一下其中的蹊跷。INTEL将80386设计成,为每一个任务分配一个LDT。为什么要这样呢。主要就是为了保护的作用。因为这样就可以使得每个任务在其内存中都有其自己的一个空间,这样就减少了内存空间共享的机会(减少共享数据,就减少了访问共享数据出错的机率),从而对应用程序作了一层保护。

在一个多任务的操作系统中,同时运行着多个任务。任务之间的切换是很自然的事(就如家常便饭一样)。如果只有一个LDTR而不使用其它方法的话,那么一个任务切到另一个任务之后,它再想切换回来时,就会找不到自己原来的数据,因为原来存放数据的地方已经被别的任务使用了。怎样才能解决这个问题呢?当然最好的方法就是将各个任务的LDT基地址放到一个地方,形成一个表即全局描述符表。当什么时候需要时就将其中对应的表项导入到LDTR中,不就能解决了吗。

INTEL正是考虑到这一点,所以才将LDTR设计成现在的样子。它将每个

第35页

标题 作者 说明 毕业论文 李超 ?所有版权作者保留 题目 时间 页数 80386保护模式与Linux内核引导分析 2005-4-1 共91页 路漫漫其修远兮,吾将上下而求所。

任务的LDT的基地址放到GDT中,再通过段选子在GDT中找到对应的项,从

而将LDT的必要信息装到了LDTR中。

全局描述符表与局部描述符表

全局和局部描述符表结构

全局和局部描述符表说明

我们先来看一下GDT吧。上面的图展示了一个真实的GDT(全局描述符表),它一共由8K表项组成。这一点我已在全局描述符表寄存器中做了说明,如果不清楚请回去看一下。表中的每一个表项由64位组成。在描述符中的这64位都包括了那些信息呢,下面让我们来看一下吧。

·如图所示,第八字节与第三、四、五字节共32位,构成了段基地。它最大可以寻址4G,这个不难算出吧(232=4G)!就目前的情况来说,大部分用户无法提供这么大的实际物理内存,所以说32地址总线进行寻址足够用了(估计用不了多常时间,32位就不够用了,因为64位机已经上市了?)。在这里我不得不说明一下,为什么INTEL不将这32位连续存放,而是将其分成两部分。主要是考虑到向后兼容的问题。因为在80286时期,它的描述符表只使用了48位,它的

第36页