什么阻止用户空间程序切换到更高级别?

时间:2013-11-14 18:15:47

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

上下文
根据{{​​3}},用户空间程序无法执行处理器提供的所有操作。上面链接中的描述说cpu中有不同的操作级别。

问题:
用户空间代码如何防止cpu在特权级别执行?在不使用系统调用的情况下使用汇编语言切换到更高级别是不是可能?

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

2 个答案:

答案 0 :(得分:10)

当cpu到达一条指令时,由于要执行的指令的标识,要访问的内存地址或某些其他条件,在当前权限级别不允许,会引发cpu异常。这基本上保存了当前的cpu状态(寄存器内容等),并将执行转移到以内核权限级别运行的预设内核地址,该内核地址可以检查要执行的操作并决定如何继续。实际上,如果不允许执行的操作,它通常会以内核终止进程结束。

答案 1 :(得分:0)

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