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变量中;

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值