保护指令在linux中的用户模式下使用它

时间:2012-07-15 09:23:37

标签: linux operating-system processors

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

我知道有一些名为代码段注册的内容可以跟踪当前优先级

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

PS:仅在基于x86的系统上有效。 请注释您看到保留说明列表的链接。