上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构。在介绍这一跳转之前,这篇文章我们来介绍两个概念:一致代码段和非一致代码段。
首先,我们先来看几个问题:
一致代码段和非一致代码段是什么?
为什么要有一致代码段和非一致代码段?
系统提供怎样的机制来使用户程序访问内核数据?
程序如何在段与段之间跳转?
接下来,我们将讨论上述这些问题。
特权级
为了更好的理解之后的问题,我们先来讨论一个概念:特权级。
特权级是一种机制来保护数据和防止恶意行为,特权级分4种:0,1,2,3。0为最高特权级,4为最低。(在 Linux 中只使用了0和3)
这些特权级是通过三个标志来表示的:CPL,DPL,RPL
- CPL 是存放于如 CS、SS 寄存器中的,表示当前特权级
- DPL 是在 GDT(全局描述符表)/LDT(局部描述符表)中的,静态的
- RPL是代码中根据不同段跳转而确定,用于刷新 CPL
CPL(Current Privilege Level)是表示当前执行程序的特权级,它被存放在CS 和 SS 的第0位和第1位。通常情况下,CPL等于代码的段的特权级。在遇