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

C++ 是什么阻止用户空间程序切换到更高级别?,c++,c,assembly,kernel,low-level,C++,C,Assembly,Kernel,Low Level,上下文: 根据用户空间,程序不能执行处理器提供的所有操作。上面链接中的描述表示cpu内部有不同的操作级别 问题: 如何防止cpu以特权级别执行用户空间代码?不使用系统调用就可以使用汇编语言切换到更高的级别吗 我很肯定不是,但我不明白为什么。任何人都可以指出这一点或指出一些与此主题相关的资源吗?当cpu到达一条指令时,由于要执行的指令的标识、要访问的内存地址或某些其他条件,在当前权限级别下不允许,将引发cpu异常。这实际上保存了当前的cpu状态(寄存器内容等),并将执行转移到以内核特权级别运行的预

上下文:
根据用户空间,程序不能执行处理器提供的所有操作。上面链接中的描述表示cpu内部有不同的操作级别

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


我很肯定不是,但我不明白为什么。任何人都可以指出这一点或指出一些与此主题相关的资源吗?

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

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

Cpu阻止了这一点。从技术上讲,至少在Linux/Unix下,这些条件中的大多数不会导致内核直接终止进程。相反,内核向进程发送一个信号(例如SIGSEGV),除非捕获到该信号,否则该信号将终止进程。在任何情况下,指令流都会中断,不允许继续进行不允许的操作。