Linux内核中的“ copy_from_user”示例(只需将指针复制到int)

时间:2019-01-28 02:10:23

标签: linux kernel system-calls

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

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

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

我知道指向int的指针将是一个问题,因为用户空间应用程序可能已将指向重要系统空间的指针传递给了我们(我们不希望这样)。因此,我需要使用copy_from_user函数。

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

1 个答案:

答案 0 :(得分:1)

替换

*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.