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