Linux 内核中的 "copy_from_user" 示例(只是将指针复制到 int)

Example of "copy_from_user" in Linux Kernel (just copying a pointer to an int)

我知道有很多关于此的帖子,但大多数都非常复杂,我希望有人可以通过我的简单示例帮助我。

我正在编写一个系统调用,我正在编写的函数具有以下形式:

SYS_CALLDEFINE4(calc, int, param1, int, param2, char, operation, int*, result) 
{
//Do system call stuff here
} 

我知道指向 int 的指针会是个问题,因为用户space 应用程序可能已经传递了一个指向重要系统 space 的指针(我们不想弄乱那)。所以我需要使用 copy_from_user 函数。

有人可以举例说明如何在确保您可以正确访问该指针的情况下正确使用这两个函数吗?

替代

*result = <value>;

会是

int local_value = <value>;
if (copy_to_user(&local_value, result, sizeof(*result)))
{
    // 'result' points to inaccessible memory.
}
// assigning 'result' has been successful.

或者,因为 result 的大小很小(在你的情况下是 int),你可以使用 put_user,这样更简单也更有效:

if (put_user(<value>, result) < 0)
{
    // 'result' points to inaccessible memory.
}
// assigning 'result' has been successful.