22 January 2014

就算学过操作系统的相关知识,也许你也从来没有听说过实模式与保护模式。其实,实模式也好,保护模式也好,都是相对而言。286之后的CPU,采取了一种新模式,这种新模式提供了强大的特性。但是为了兼容之前CPU的旧模式,操作系统提供了两种模式,一种为实模式,即为了兼容286之前的CPU,一种是保护模式,即286之后的新模式。

那么实模式与保护模式到底有什么区别?对于实模式,它仅仅提供20位的地址总线,无疑寻址过程受到了很大的限制(当时可定是适合的)。在这种情况下,寻址过程是采用16位基地址的4位,与16位偏移(Offset)。

保护模式提供了更强大的寻址方式,但不是16位加16位这么简单,而是采取一种叫做描述符(Descriptor)加偏移的机制。

简单的介绍描述符,它是32位的数据结构,结构如下图:

|BYTE7|BYTE6|BYTE5|BYTE4|BYTE3|BYTE2|BYTE1|BYTE0|
|段基址|   属性等   |      段基址      |   段界限   |
      /           \
     /             \
    /               \
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| G |D/B| 0 |AVL|     段界限     | P |  DPL  | S |     TYPE      |

段基址和段界限就是一些地址,我们不主要关注,主要看属性这两个字节。这个属性段,定义了这个32位段的重要属性。比如P位决定了这段是否在内存中。DPL是符特权级等等。

实际上我们处理的并不是描述符,而是用宏将描述符映射为选择子(Selector)。怎么又搞出来个选择子?选择子是16位,事实上存在一个叫做GDT或LDT的表,这个表维护了所有的描述符,我们通过选择子来定位表中描述符,没错,选择子就像一个索引,指向了表中描述符的位置。我们寻址需要的的32位数据即16位选择子加16位的偏移量。

选择子的结构如下:

| 15| 14| 13| 12| 11| 10| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|                    描述符索引                       | TI|  RPL  |

TI位决定是使用GDT还是LDT,RPL表示特权级。本着入门的原则,我们只需要先掌握大致的概念。现在我们终于找到这个描述符了,通过描述符提供基址,加上偏移我们就能找到这个线性地址。

保护模式的寻址过程就是:

处理选择子 -> 在GDT/LDT中找到对应描述符 -> 通过描述符找到基址,加上偏移量找到线性地址

说了这么多也许你都不关心,似乎复杂了一些。事实上,我们的x86架构的电脑开机时都是在实模式下启动的,操作系统在开机后要做的第一个任务(也许是之一)就是切换到保护模式。基本上现代的操作系统都是运行在保护模式下的。

保护模式不仅提供了强大的寻址方式,而且提供了存储器保护机制和多任务机制等,相信这两点对于现代操作系统意义重大。



blog comments powered by Disqus