5

系统调用的存根例程通过陷阱指令切换到内核模式。什么是防止用户进程独立使用trap指令切换到内核态,切换后执行恶意代码?

4

1 回答 1

3

陷阱指令不是简单地将 CPU 模式从用户切换到内核;它实际上做了以下事情:

它切换模式并将 CPU 指令指针跳转到内核中的指定中断处理程序,因此从技术上讲,一旦您调用陷阱指令,您的代码就不会被执行。

让我们以 x86 + FreeBSD 为例:
在所有操作系统中,都有一个叫做中断向量的东西,它基本上是一个中断处理程序列表,如果发生 IO,中断处理程序 0xwhatever 继续,如果你想将 CPU 陷入内核模式, 中断处理程序 0x80 应该被调用;它是如何被调用的?
int 0x80
完成此操作后,CPU 将执行处理程序#80(粗略地说),它会读取某些特定寄存器以确定下一步要做什么(通常,您设置希望内核为您执行的服务类型,然后寄存器中的参数)。

所以在这里,你可以切换到内核模式的唯一方法是通过int指令(也有指令切换,方式略有不同但概念成立),你必须指定一个特定的中断,以便 CPU 跳转到适当的代码,然后作为内核一部分的代码将完成它应该做的工作,并在将模式返回到用户模式后返回到您的代码;你可以int不带任何号码直接调用,但这不会只是将模式转移到内核中,默认情况下它会调用中断处理程序 0,不管它是什么。

其他操作系统/CPU 会使用不同的指令,但一般来说,机制是相同的。

于 2013-04-08T02:06:08.587 回答