put_user()函数和get_usr()函数介绍
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了put_user()函数和get_usr()函数介绍相关的知识,希望对你有一定的参考价值。
1、使用的场景
(1)内核地址空间和驱动地址空间是隔绝的,不能使用memcpy()函数,必须使用专门的拷贝函数;
(2)在拷贝大量数据时使用copy_to_user()和copy_from_user()函数,拷贝单个数据时,比如某个int型变量,则优先使用put_user()和get_user()函数;
补充:copy_to_user()和copy_from_user()函数参考博客:《内核空间和应用空间的数据拷贝(copy_to_user & copy_from_user)》;
2、put_user()函数
//x:驱动程序中的变量;
//ptr:用户空间的地址;
#define put_user(x, ptr) \\
( \\
void *__p = (ptr); \\
might_fault(); \\
access_ok(VERIFY_WRITE, __p, sizeof(*ptr)) ? \\
__put_user((x), ((__typeof__(*(ptr)) *)__p)) : \\
-EFAULT; \\
)
(1)从驱动程序中的X变量地址处,拷贝sizeof(*ptr)个字节数据到ptr用户空间地址处;
(2)拷贝的数据大小:由ptr指针类型决定,但是ptr必须是用户空间地址;比如ptr是个字符指针,则拷贝1个字节;
(3)access_ok()函数是检测用户空间的地址是否具有写权限;
3、get_user()函数
//x:驱动程序中的变量;
//ptr:用户空间的地址;
#define get_user(x, ptr) \\
( \\
const void *__p = (ptr); \\
might_fault(); \\
access_ok(VERIFY_READ, __p, sizeof(*ptr)) ? \\
__get_user((x), (__typeof__(*(ptr)) *)__p) : \\
((x) = (__typeof__(*(ptr)))0,-EFAULT); \\
)
理解方法和put_user()函数一样,不同的是数据的流向,get_user()函数是从用户空间ptr处读取sizeof(*ptr)个字节数据方法放到驱动程序的x变量中;
以上是关于put_user()函数和get_usr()函数介绍的主要内容,如果未能解决你的问题,请参考以下文章