【问题标题】:protection of instructions from using it in user mode in linux保护指令在 linux 的用户模式下使用它
【发布时间】:2012-07-14 12:06:20
【问题描述】:

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

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

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

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

【问题讨论】:

  • 实际上还有很多。希望我有时间写一个答案,希望有人会向您解释这一点。 :)
  • @DanielKamilKozar:请在有空的时候回答这个问题,我在任何地方都找不到答案:)

标签: linux operating-system processors


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 2014-02-18
      • 1970-01-01
      • 2020-10-14
      • 2016-11-21
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多