copy_from_user 是不是修改用户指针?

Posted

技术标签:

【中文标题】copy_from_user 是不是修改用户指针?【英文标题】:Does copy_from_user modify the user pointer?copy_from_user 是否修改用户指针? 【发布时间】:2012-09-18 02:55:39 【问题描述】:

在 uaccess.h 中声明的 copy_from_user 函数是否修改了 (void __user *)from 指针? 指针在函数声明中没有声明为 const,只有它指向的内容。

我问的原因是我想使用 copy_from_user 两次,第二个 copy_from_user 从第一个完成的地方复制。

我正计划做这样的事情,它可以保证工作吗?

//buf is a user pointer that is already defined
copy_from_user(my_first_alloced_region, buf, some_size);
//do stuff
copy_from_user(my_second_alloced_region, buf + some_size, some_other_size);

提前致谢。

【问题讨论】:

【参考方案1】:

被调用函数不能修改指针本身,因为您只是将指针值作为参数传递给函数。如果参数被声明为指向const 类型的指针,那么被调用者也不能修改所指向的内容(至少在没有会抛弃指针的const-ness 的强制转换的情况下不能修改)。在调用者自身中修改指针值的唯一方法是向被调用者传递一个指向指针的类型。

【讨论】:

啊,是的,这对我来说是一个相当新手的疏忽。那么在函数声明中对指针使用 const 关键字是没有意义的? 如果您希望保护指针值本身,那么是的,这是没有意义的……const T* 是指向 const 类型为 T 的对象的指针,因此它可以保护指向的对象,而不是指针值。但是由于您只传递一个指针值,而不是按引用传递的指针,因此即使被调用者要修改指针变量本身,也不能在调用者中更改它。 我的意思是指针本身使用 const 类型T* const var_name @Michael:这与在函数声明中声明任何参数本身 const 一样无用 - 例如。 int foo(const int a); 在同一条船上。不过,它在函数定义中并非没用。

以上是关于copy_from_user 是不是修改用户指针?的主要内容,如果未能解决你的问题,请参考以下文章

copy_from_user的疑问

[转] copy_to_user和copy_from_user两个函数的分析

当有copy_from_user时应用get_user

007_Linux驱动之_copy_from_user函数

如何从 Linux 内核访问用户空间内存?

内核空间和应用空间的数据拷贝(copy_to_user & copy_from_user)