实模式与保护模式
就算学过操作系统的相关知识,也许你也从来没有听说过实模式与保护模式。其实,实模式也好,保护模式也好,都是相对而言。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