2

我在一个教程中读到,x86 架构中的一些 15 条指令不允许在用户模式下使用。

我知道有一种叫做代码段寄存器的东西可以跟踪当前的特权级别

我的问题是
a)在执行每条指令之前,cpu 是否必须检查它正在运行的当前特权级别

b)如果用户程序中存在无法在用户模式下使用的指令,实际会发生什么?CPU在执行之前如何知道这一点?

4

2 回答 2

3

CPU 在执行某些指令或它们的某些部分之前会检查 CPL、RPL 和类似的东西(有许多指令具有非常复杂的逻辑,要执行的检查集取决于许多条件)。

如果一条指令不允许执行,CPU 会生成一个异常事件,然后将其分派给它的处理程序。异常处理程序本质上类似于中断处理程序,由操作系统定义。因此,当操作系统开始处理它无论如何都无法纠正的异常时,它会终止导致异常的程序。

“可纠正”异常的一个示例是已卸载到磁盘的虚拟内存的页面错误。操作系统将应用程序尝试使用的代码/数据从磁盘加载回内存。

于 2012-07-15T10:03:23.873 回答
0

当前特权级别保存在 CS 寄存器的一位中(在 x86 上技术上为 2 位)。
代码中不允许某些指令,Ex - 可以防止用户进行某些系统调用 .int X (在汇编(x86)中导致系统调用),其中 X 是 IDT(中断描述符表)的索引。这个索引指向系统调用。IDT的每个条目中还存储了一个名为DPL的字段。
以下是 int 指令所遵循的步骤:
• 从 IDT 中获取第 n 个描述符,其中 n 是 int 的参数。
• 检查%cs 中的CPL 是否<= DPL,其中DPL 是描述符中的特权级别。
• 如果是,则用户代码有足够的权限执行此系统调用,当前执行上下文被保存(寄存器等),因为我们现在切换到内核模式。
• 如果没有,那么用户没有足够的权限来执行它,并且将导致执行 int 13 指令(一般保护错误)
对于 1 类 DO NOT DO 指令,这是如何完成检查的,我不知道它是如何为其他指令完成的。
也用于通过 GDT(门描述符表)访问不同的段。方法是相同的。

PS:这仅在基于 x86 的系统上有效。请评论您看到保留指令列表的链接。

于 2012-07-17T01:58:47.077 回答