本章目标
1、通过演示如何创建一个任务,并使之投入运行来学习任务的概念及组成要素,包括任务的全局空间和局部空间、TSS、LDT、特权级等。
2、必须了解特权级不是指任务的特权级,而是组成任务的各个部分的特权级。比如:任务的全局部分一般是0、1和2特权级别的,任务的私有部分一般是3特权级别的。
3、必须清楚CPL、DPL和RPL的含义,以及不同特权级别之间的控制转移规则。
4、熟悉调用门的用法。
5、掌握一些在Bochs下调试程序的新手段。
6、学习一些新的x86处理器命令,包括lldt、ltr、pushf/pushfd、popf/popfd、ret n/retf n、arpl等。同时了解像jmp和call这样的传统指令是如何被赋予一些新的功能的。
14.1 任务的隔离和特权级保护
14.1.1 任务、任务的LDT和TSS
-
任务:程序是记录在载体上的指令和数据,其正在执行的一个副本,叫做任务(Task)。
-
LDT:为了有效地在任务之间实施隔离,处理器建议每个任务都应当具有自己的描述符表,称为局部描述符表(Local Description Table)。
-
TSS:为了保存任务的状态,并在下次重新执行时恢复它们,每个任务应当用一个额外的内存区域保存相关信息,这叫做任务状态段(Task State Segment)。
-
LDTR:处理器使用局部描述符表寄存器(LDT Register:LDTR)来追踪和访问这些LDT
-
TR:处理器用TR寄存器来指向当前任务的TSS。
14.1.2 全局空间和局部空间
每个任务实际上包括两个部分:全局部分和局部部分。全局部分是所有任务共有的,含有操作系统的软件和库程序,以及可以调用的系统服务和数据;私有部分则是每个任务各自的数据和代码,与任务所要解决的具体任务问题有关,彼此并不相同。
因此,全局地址空间是用全局描述符GDT来指定的,而局部地址空间则是由每个任务私有的局部描述符表LDT来定义的。
14.1.3 特权级保护概念
1、处理器特权级设置
-
Intel处理器可以识别4个特权级别,分别是0到3,较大的数值意味着较低的特权级别
-
DPL:描述符特权级,代表着其所描述的段的特权级别
-
CPL:当处理器正在一个代码段中取指令和执行指令时,那个代码段的特权级叫做当前特权级(Current Privilege Level,CPL)。正在执行的这个代码段,其选择子位于
段寄存器CS
中,其最低两位
就是当前特权级数值
2、特权指令
那些只有在当前特权级CPL为0时才能执行的指令,称为特权指令(Privilege Instructions)
典型的特权指令:lgdt、lldt、ltr、mov、停机指令hlt等
- 处理器还允许对各个特权级别所能执行的I/O操作进行控制,通常这指的是端口访问的许可权。位13和位12是IOPL位,也就是输入输出特权级,它代表着当前任务的I/O特权级别。