Kernel 为什么内核会复制系统调用参数?

Kernel 为什么内核会复制系统调用参数?,kernel,Kernel,为什么内核复制系统从用户空间调用参数到内核空间 为什么内核不能直接从用户堆栈访问系统调用参数?因为内核空间堆栈不同于用户空间堆栈。将控制权从用户空间转移到内核空间的代码理解这一点。它通过复制东西来隐藏以下代码的复杂性。如果变量要留在用户空间中,那么所有其他内核代码也需要“理解”这一点——在用户空间堆栈中可以找到这样或那样的变量,而在内核堆栈中可以找到其他一些变量 如果参数是在用户空间内存中分配的,则系统调用将参数复制到内核内存。原因是安全性和可靠性 假设内核没有自己复制在用户空间内存中分配的参数

为什么内核复制系统从用户空间调用参数到内核空间


为什么内核不能直接从用户堆栈访问系统调用参数?

因为内核空间堆栈不同于用户空间堆栈。将控制权从用户空间转移到内核空间的代码理解这一点。它通过复制东西来隐藏以下代码的复杂性。如果变量要留在用户空间中,那么所有其他内核代码也需要“理解”这一点——在用户空间堆栈中可以找到这样或那样的变量,而在内核堆栈中可以找到其他一些变量

如果参数是在用户空间内存中分配的,则系统调用将参数复制到内核内存。原因是安全性和可靠性

假设内核没有自己复制在用户空间内存中分配的参数。这意味着,可能存在于用户空间内存中的数据可以在系统调用的中间被修改。这不利于安全性和可靠性。为了防止这种情况发生,内核将立即将用户空间参数复制到内核内存中。用户空间无法访问内核内存


内核有无限的能力去做它想做的任何事情,所以系统调用将执行检查,以确保传入的参数是“安全的”而不是恶意的。但是,如果内核没有自己进行安全复制,那么从理论上讲,用户空间程序可以在内核检查后突袭进来,修改内存,操纵内核做不好、不安全和不可靠的事情。

我不认为这就是复制参数的原因。我不相信它们是因为习俗而被复制的。内存到内存的拷贝很昂贵。系统调用也会定期发生。尽管如此,如果内核正在复制参数,那么一定有很好的理由。