系统调用的存根例程通过陷阱指令切换到内核模式。什么是防止用户进程独立使用trap指令切换到内核模式,然后在切换后执行恶意代码?
答案 0 :(得分:2)
trap指令不是简单地将CPU模式从用户切换到内核;它实际上做了以下事情:
它将模式和JUMPS CPU指令指针切换到内核中的指定中断处理程序,所以从技术上讲,一旦调用了trap指令,你的代码就不会被执行了。
我们以x86 + FreeBSD为例:
在所有操作系统中,都有一个称为中断向量的东西,它基本上是一个中断处理程序列表,如果IO发生,中断处理程序0xwhatever正在进行,如果你想将CPU陷入内核模式,应该调用中断处理程序0x80;怎么叫它?
int 0x80
一旦完成,CPU将执行处理程序#80(粗略地说),然后将读取某些寄存器以确定下一步做什么(通常,您设置服务类型你希望内核为你和寄存器中的参数做。)
所以在这里,你可以切换到内核模式的唯一方法是通过int
指令(也有指令切换,但方式略有不同但概念保持不变),你必须指定一个特定的中断因此,CPU将跳转到相应的代码,然后该代码(它是内核的一部分)将执行它应该执行的工作,并在返回模式后返回到用户模式的代码;你可以在没有任何数字的情况下调用int
,但这不仅仅是将模式转移到内核中,它默认调用中断处理程序0,无论可能是什么。
其他操作系统/ CPU会使用不同的指令,但一般来说,机制是相同的。