Content #
为了让特权级低的应用程序可以调用特权级高的操作系统例程,处理器也提供了相应的解决办法。
将高特权级的代码段定义为依从的(conforming) #
保护模式段描述符给出了段描述符的TYPE 字段。代码段描述符的TYPE 字段有C 位,如果C=1,则这样的代码段称为依从的代码段,可以从特权级比它低的程序调用并进入。不过,这是有条件的。当前特权级CPL 必须低于,或者和目标代码段描述符的DPL 相同。即,在数值上, CPL >= 目标代码段描述符的DPL
使用门 #
门(Gate)是另一种形式的描述符,称为门描述符,简称门。和段描述符不同,段描述符用于描述内存段,门描述符则用于描述可执行的代码,比如一段程序、一个过程(例程)或者一个任务。事际上,根据不同的用途,门的类型有好几种。不同特权级之间的过程调用可以使用调用门;中断门/陷阱门是作为中断处理过程使用的;任务门对应着单个的任务,用来执行任务切换。这里的重点是调用门(Call Gate)。
所有描述符都是64 位的,调用门描述符也不例外。在调用门描述符中,定义了目标过程(例程)所在代码段的选择子,以及段内偏移。要想通过调用门进行控制转移,可以使用jmp far 或者call far 指令,并把调用门描述符的选择子作为操作数。
使用 jmp far指令,可以将控制通过门转移到比当前特权级高的代码段,但不改变当前特权级别。但是,如果使用call far 指令,则当前特权级会提升到目标代码段的特权级别。也就是说,处理器是在目标代码段的特权级上执行的。
但是,除了从高特权级别的例程(通常是操作系统例程)返回外,不允许从特权级高的代码段将控制转移到特权级低的代码段,因为操作系统不会引用可靠性比自己低的代码。