上一篇文章初步进入保护模式的学习。首先学习了全局描述符表GDT。点击链接查看上一篇文章:全局描述符表

本篇文章继续学习,GDT中存放的条目:描述符,确切的说是段描述符。学习段描述符的作用以及段描述符的格式。

1、段描述符的格式

实模式和保护模式,在内存访问上是由区别的,在保护模式下,你不能说访问哪个段就访问哪个段,在访问之前,必须在GDT内定义要访问的内存段。这个定义就是段的描述符。

描述符不是用户自己建立的,而是用户程序***作系统加载时,有操作系统根据用户程序的结构而建立的。用户程序是无法自己修改和建立GDT的。用户程序只能老老实实的在自己的地盘上工作。这个时候操作系统为用户程序建立了几个段(定义了几个段描述符),用户程序就只能在这些段内工作,超出这个范围,或者未按预定的方法访问这些段,都将被处理器阻止。

一旦确定了GDT在内存中的位置,下一步就是确定要访问的段,并在GDT中为这些段定义各自的段描述符。

如下图,每个段描述符都是8字节大小。图中下面是低32位,上面是高32位。

很明显,描述符制定了32位的段起始地址(段基地址),以及20位的段边界。

在32位模式下,段地址与实模式下的段地址不一样。在实模式先段地址不是真正的物理地址,它还需要左移4位。而保护模式下,段地址是32位的线性地址,它就是真实的物理地址(未开启分页功能,分页功能后面学习)。

描述符中段基址和段界限不是连续的。这是历史的问题与兼容的问题。

20位的段界限是用来限制段的扩展范围。

下面来介绍段描述符各个字段的意思。

2、段描述符各个字段的意义

下面的表格列出了上述段描述符的各个位的意思,如果现在不理解这些位也无所谓,后面的学习会慢慢深入理解。

G: 粒度位 用于解释段界限的含义。当G位是0时,段界限以字节为单位。此时段的扩展范围是从1字节到1M字节,因为描述符中的界限值是20位的。相反,如果该位是1,那么段界限是以4KB位单位。这样段的扩展范围是4KB到4GB
S: 类 型 位 当该位是0时,表示是一个系统;为1时,表示是一个代码段或者数据段(栈段也是特殊的数据段)。系统段将在后面的文章中学习
DPL 特权级 这两位用于指定描述符的特权级。共有4中处理器支持的特权级别,分别是0、1、2、3 ,其中0是最高的特权级,3是最低的特权级别。刚进入保护模式时执行的代码具有最高特权级0(可以看成是从处理器那里继承来的)这些代码通常是操作系统代码,因此它的特权级最高。每当操作系统加载一个用户程序,它通常都会制定一个低的特权级,比如3特权级。不同特权级的程序是互相隔离的,其访问是严格限制的,而且有些处理器指令只能由0特权级的程序来执行,为的就是安全。在这里,描述符的特权级是用于指定访问该段所必须具有的最低特权级。
P: 段存在位 P位用于指示描述符所对应的段是否存在。一般来说,描述符所对应的段是在内存中。但是当内存空间紧张时,有可能指示建立了描述符,对应的内存空间并不存在,这时就应当把描述符的P位清零,表示段并不存在。另外,同样是在内存空间紧张的情况下,会把很少用到的段换出到硬盘中,腾出空间给当前急需内存的进程使用,这时同样要把P位清零,当再次轮到它执行时,再将其装入内存,然后P位置1。 **P是由处理器负责检查的。**每当通过描述符访问内存段时,如果P位是0,处理器就会产生一个异常中断。通常,该中断处理过程是由操作系统提供的,该处理过程的任务是将该段从硬盘换回内存,并将P位置1。在多用户、多任务的系统中,这是一种常用的虚拟内存调度策略。
D/B: 默认的操作数大小 设置该标志位,主要是为了能够在32位处理器上兼容运行16位保护模式的程序。 该标志位对不同的段有不同的效果。对于代码段,此位称为D位,用于指定指令中默认的的偏移地址和操作数尺寸。D=0时表示指令中的偏移地址或者操作数是16位的。D=1时,表示32位的偏移地址和操作数。对于栈段来说,该位是B位,用于在进行隐式的栈操作中(push,pop,call等),是使用SP寄存器还是使用ESP寄存器。当B=0时,在访问哪个段时,使用SP寄存器,否则就使用ESP寄存器。同时,B位的值,也决定了栈段的上边界。如果B=0,那么栈的上边界是0xFFFF;如果B=1,那么栈段的上边界是0xFFFFFFFF。
L:64位代码段标志 保留此位给64位处理器使用。目前我们将它置0即可
TYPE:描述符子类型 对于数据段来说,这4位分别是X,E,W,A,对于代码段来说这4位分别是X,C,R,A。他们具体的含义见下面的表格。
AVL:软件可以使用的位 通常由操作系统来用,处理器并不使用它。

下面表格是代码段和数据段的TYPE字段

X E W A 描述符类别 含义
0 0 0 X 数据段 只读
0 0 1 X 数据段 读、写
0 1 0 X 数据段 只读,向下扩展
0 1 1 X 数据段 读、写,向下扩展
  • X 表示是否可执行。对于数据段,总是不可执行。所以为0
  • E 表示段的扩展方向。E=0是向上扩展的。E=1是向下扩展的
  • W 指示段的读写属性,W=0是不允许写入的,W=1是可以正常写入的
  • A 是已访问位,用于指示它所指向的段最近是否被访问过。
X C R A 描述符类别 含义
1 0 0 X 代码段 只执行
1 0 1 X 代码段 执行、读
1 1 0 X 代码段 只执行、依从的代码段
1 1 1 X 代码段 执行、读、依从的代码段
  • X 表示是否可执行。代码段总是可执行,所以为1
  • C 指示段是否为特权级依从的。C=0时,表示非依从的代码段,这样的代码段是可以从与它特权级相同的代码段调用,或者通过门调用;C=1时表示允许从低特权级的代码转移到该段执行。
  • R 指示代码段是否允许读出。代码段总是可以执行的,但是为了防止程序破坏,它是不允许写入的。至于是否有读出的可能,由R位决定。R=0时表示不能读出。R=1时,则代码段是可以读出的。
  • A 是已访问位,用于指示它所指向的段最近是否被访问过。

3、总结

今天学习段描述符的格式,以及段描述符各个字段的含义。

笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。

学习探讨加个人:
qq:1126137994
微信:liu1126137994