linux之cpu特权级切换(操作系统镜象还原 笔记)

cpu只有通过“门结构”才能由低特权级转移到高特权级。

门结构是什么呢?就是记录一段程序起始地址的描述符。 有一种称为“门描述符”的结构,用来描述一段程序。进入这种神奇的“门”,处理器便能转移到更高的特权级上。 门描述符同段描述符类似,都是 8 字节大小的数据结构,用来描述门中通向的代码。 一共有 4 种门结构。这4种门结构如下图所示:

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
从上图的 4 种门描述符可知,它们与段描述符最大的不同是除了任务门外,其他三种门都是对应到一段例程,即对应一段函数,而不是像段描述符对应的是一片内存区域。任何程序都属于某个内存段,所以程序确切的地址必须用“代码段选择子+段内偏移量”来描述,可见,门描述符基于段描述符,被调用的程序是用段描述符来给出基址的,所以门描述符中要给出代码段的选择子(用来确定段描述符的东西),但光给出基址远远不够,还必须给出程序在目标代码段的偏移量,这就是门描述符中记录的是段选择子和偏移量的原因。

任务门描述符可以放在 GDT(全局描述符表,可以认为放在一个数组中)、 LDT 和 IDT (中断描述符表,这些描述符表都可以视为数组)中,调用门描述符可以位于 GDT、 LDT 中,中断门和陷阱门描述符仅位于 IDT 中。 任务门、调用门都可以用 call 和 jmp 指令直接调用,原因是这两个门描述符都位于描述符表中,要么 是 GDT, 要么是 LDT,访问它们同普通的段描述符是一样的,也必须要通过选择子,因此只要在 call 或 jmp 指令后接任务门或调用门的选择子便可调用它们了。陷阱门和中断门只存在于 IDT 中,因此不能主动调用,只能由中断信号来触发调用。

任务门有点特殊,它用任务 TSS 的描述符选择子来描述一个任务, 除任务门之外,另外的三个门描述符都是用代码段选择子及偏移地址来描述一段程序例程的。但是,无论是哪种门描述符,它们中所记录的信息都已经可以确定所描述的对象(例程或任务)了,所以在被调用时, CPU 都会忽略调用指令中的偏移量。例如:假设某调用门描述符位于 GDT 中第 1 个位置,这样的指令“call 0x0008: 0x1234飞",在调用此调用门时,偏移量 0x1234 会被 CPU 忽略。 提供了4种门的原因是它们都有各自的应用环境,但它们都用来实现从低特权级的代码段转向高特权级的代码段,我们这里也只讨论有关特权级的功用。

1.调用门
call 和jmp 指令后接调用门选择子为参数,以调用函数例程的形式实现从低特权向高特权转移,可用来实 现系统调用。 call 指令使用调用门可以实现向高特权代码转移, jmp 指令使用调用门只能实现向平级代码转移。
2. 中断门
以 int 指令主动发中断的形式实现从低特权向高特权转移, Linux 系统调用便用此中断门实现。
3. 陷阱门
以 int3 指令主动发中断的形式实现从低特权向高特权转移,这一般是编译器在调试时用,本书中咱们 不用过多关注。
4. 任务门
任务以任务状态段 TSS 为单位,用来实现任务切换,它可以借助中断或指令发起。当中断发生时, 如果对应的中断向量号是任务门,则会发起任务切换。也可以像调用门那样,用 call 或jmp 指令后接任务 门的选择子或任务 TSS 的选择子。 坦白说,现代操作系统很少用到调用门和任务门,在我们的系统中也只用到了中断门,而陷阱门是供调试器用的。

不知道大家有没有想过,为什么可以使用门结构进入高特权级呢? 这肯定是 CPU 硬件电路中写好的规则,具体我也不清楚, 也不需要搞清楚,但我是这样理解的,举个例子,用门提升特权级,就像站在高处的台子上往蹦床上跳一样,人会被蹦床弹得比台子还高。关键点:台子的高度 位于蹦床和目标高度之间,至少得和蹦床一样高,这样人才能被弹得更高。 实际上,门也是按照这个蹦床原理实现的,我们把"门“分成门槛和门框来比喻。

门的“门槛”是访问者特权级的下限,访问者的特权级再低也不能比门描述符的特权级 DPL 低, 否则访问者连门都进不去, 更谈不上使用调用门。门描述符的特权级 DPL级要低于或等于当前特权级 CPL,即数值上 CPL<= 门的 DPL,此处可见,门描述符相当于数据段描述符 一样,只允许比自己特权级高或相同特权级的程序访问。 门的“门框”是访问者特权级的上限,访问者的特权级再高也不能比门描述符中目标程序所在代码段 的 DPL 高,否则本身的特权级就比目标代码特权级还高的话,还使用门干吗?而且真要是这样的话,这 意味是特权级由高向低转移了,这绝对是被禁止的。也就是说,门中包含的目标程序所在的段的特权级 DPL 要高于或等于当前特权级 CPL,即数值上 CPL>=目标代码段 DPL,进门之后,处理器将以目标代码段 DPL 为当前特权级 CPL,因此cpu在进门之后,就能获得更高的特权级。

猜你喜欢

转载自blog.csdn.net/qq_35985044/article/details/86692120