动手制作操作系统——认识实模式与保护模式

来源:互联网 发布:开挂软件 编辑:程序博客网 时间:2024/06/05 03:06

因为计算机启动后按照实模式寻址,CPU只能访问1M的内存,所以为了访问1M内存后更大的空间,就需要进入到保护模式,保护模式不仅有更大的地址空间,还将程序分成了4个特权级(0~4),数字越小特权级越高,在涉及特权级的操作时,处理器将会对特权级进行比较,最终允许访问或者拒绝访问。

首先给出几个关键词


段基址:段的起始地址。

段界限:某个段可以寻址的相对段基址的最大偏移地址。

描述符:一个特殊的数据结构,包含段基址,段界限,属性,共8字节。

全局描述符表(GDT):由描述符组成的数组,在系统中只能有一个。

局部描述符表(LDT):由局部描述符组成的数组,在系统中可以有若干个。

CPL:当前执行程序的特权级。

RPL:描述符选择子的特权级。

DPL:段的特权级。

一致代码段:被拿出来共享的代码段,可以被低特权级用户直接访问,和非一致代码段共同是描述符中的一个属性。

非一致代码段:限制低特权级访问而被操作系统保护起来的代码段。

下面具体看一下保护模式下CPU是如何寻址的:

假设,描述符表中只有一个段基址为0(描述符中段基址位数为32位,由高到低位于描述符的第8,5,4,3字节),段界限为4GB(段界限位数为20位,由高到低位于描述符的第7字节前四位,1,0字节,但由于属性中有一位可以将段界限粒度变成4K,所以段界限最大可以达到4GB)的描述符,寄存器GDTR中保存描述符表的首地址,只在分段模式下,所有CPL,RPL,DPL都为0。


现在我们希望访问物理地址0x00500000(物理地址第5M+1个字节):

首先要选择从哪个段的基址访问,这里只有一个段,那么就选择描述符表中的第一个描述符,将第一个描述符的地址相对描述符表头的偏移量装入段寄存器,

然后第5M+1个字节 在相对基址0,偏移量为0x00500000处。

那么就将 EIP设置为0x00500000。

这就是保护模式的寻址方式。


然后看一看程序特权级是如何检查的:

访问数据段:

当程序访问数据段,TSS,要确保CPL和RPL<=数据段描述符的DPL。

直接转移:

1、当程序转移至非一致代码段时,若CPL与目标代码段描述符的DPL相等,且使用的选择子RPL小于等于DPL,则允许访问,CPL不变。

2、当程序转移至一致代码段时,若CPL大于等于目标代码段描述符的DPL,则允许访问,CPL不变。

通过门描述符的转移:

1、当程序通过调用门转移至一致代码段时,若CPL小于等于调用门描述符的DPL,且目标代码段描述符的DPL小于等于CPL,则允许访问,CPL不变。

2、当程序通过调用门转移至非一致代码段时,分成两种情况,一种是通过call转移,一种是jmp:

  call:同一致代码段;

  jmp:CPL小于等于调用门描述符的DPL,且目标代码段描述符的DPL等于CPL,则允许访问

转移后CPL等于目标代码段描述符DPL。


总结如下:

实模式:直接访问物理内存,寄存器CS×16+IP就是物理地址,地址空间只有1MB。

保护模式:寄存器GDTR中保存描述符表(GDT)的界限和第一个表项的地址,寄存器CS中为描述符表的索引,描述符中记录着表示对应段的段基址(物理内存段的起始地址)和段界限(此段最多能容纳的字节数),而EIP中为相对于这个描述符中的段基址的偏移,地址空间为4GB。

程序通过DPL,CPL,RPL3种特权级来控制程序是否可以转移,以及数据是否可以被使用,仅在保护模式中有效。


0 0