【问题标题】:What prevents a user-space program from switching to higher levels? [duplicate]是什么阻止了用户空间程序切换到更高级别? [复制]
【发布时间】:2013-11-14 18:15:47
【问题描述】:

背景:
根据this description,用户空间程序无法执行处理器提供的所有操作。上面链接中的描述说cpu内部有不同的操作级别。

问题:
cpu 如何防止用户空间代码在特权级别执行?难道不使用系统调用就可以通过使用汇编语言切换到更高级别吗?

我很确定不是,但我不明白为什么。任何人都可以指出这一点或指出一些处理这个主题的资源吗?

【问题讨论】:

标签: c++ c assembly kernel low-level


【解决方案1】:

当 cpu 到达一条指令时,由于要执行的指令的标识、要访问的内存地址或某些其他条件在当前特权级别上是不允许的,则会引发 cpu 异常。这实质上保存了当前的 cpu 状态(寄存器内容等)并将执行转移到以内核特权级别运行的预设内核地址,该地址可以检查要执行的操作并决定如何进行。在实践中,如果要执行的操作不被允许,一般会以内核杀死进程结束。

【讨论】:

  • 技术上,至少在Linux/Unix下,这些情况大部分不会导致内核直接杀死进程。相反,内核向进程发送一个信号(例如 SIGSEGV),除非该信号被捕获,否则将终止该进程。在任何情况下,指令流都被中断,不允许的操作不允许继续进行。
【解决方案2】:

cpu 处理存储在 ram 中的代码。 内存保留标志。内存有一个特殊的布局。有所谓的描述符表,它将物理内存转换为虚拟内存。首先是读取 gdt 的描述符测试或段测试。 gdt 包含一个称为描述符特权级别的值。它包含调用进程必须满足的 ringlevel 的值。如果没有,则不授予访问权限。 然后是页面目录测试,它有一个主管位。这也必须满足一定的条件。如果它为零,则只有特权进程可以访问页目录中的此页表。 如果值为 1,则所有进程都可以访问当前检查的页面目录条目中的页面。 最后一个测试是页面测试。它的检查就像以前的检查一样。 如果进程成功通过了所有检查,则授予对内存页面的访问权限。 Cpu 寄存器 c3 应该在这里感兴趣。

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多