Linux驱动层应用层数据传递

Linux驱动层应用层数据传递

  • Fang XS.
  • 1452512966@qq.com
  • 如果有错误,希望被指出

前言

  • Linux中,内核空间的地址和用户空间的地址是隔绝的,必须使用专门的拷贝函数。
  • 对于大数据的拷贝,通常使用 copy_to_user函数和copy_from_user函数。
  • 对于单个数据拷贝,通常使用get_user宏和put_user宏。

头文件

#include <linux/uaccess.h>			// 提供数据拷贝函数和宏

对于大数据拷贝

copy_to_user函数
  • 函数原型
unsigned  long  copy_to_user(void *to,  const void  __user  *from,  usigned long  n);
函数名copy_to_user
功能将内核空间的数据拷贝到用户空间
形参to 用户空间的数据目标指针
形参from 内核空间的数据源指针
形参n 数据的长度
返回值数据拷贝成功,则返回零;否则,返回没有拷贝成功的数据字节数
copy_from_user函数
  • 函数原型
unsigned  long  copy_from_user(void __user *to,  const void *from,  usigned long  n);
函数名copy_from_user
功能将用户空间的数据拷贝到内核空间
形参to 内核空间的数据目标指针
形参from 用户空间的数据源指针
形参n 数据的长度
返回值数据拷贝成功,则返回零;否则,返回没有拷贝成功的数据字节数

对于单个数据拷贝

get_user
  • 宏原型
#define __get_user(x, ptr)						\
({												\
	int __gu_err = 0;							\
	__get_user_error((x), (ptr), __gu_err);		\
	__gu_err;									\
})

#define get_user	__get_user
宏名get_user
功能将用户空间的数据拷贝到内核空间
形参x 驱动程序中的变量
形参ptr 用户空间的地址
返回值数据传递成功,返回 0,否则返回-EFAULT。
描述从驱动程序中的x变量地址处,拷贝sizeof(*ptr)个字节数据到ptr用户空间地址处
拷贝的数据大小由指针类型决定
put_user
#define __put_user(x, ptr)						\
({												\
	int __pu_err = 0;							\
	__put_user_error((x), (ptr), __pu_err);		\
	__pu_err;									\
})

#define put_user	__put_user
宏名put_user
功能将内核空间的数据拷贝到用户空间
形参x 驱动程序中的变量
形参ptr 用户空间的地址
返回值数据传递成功,返回 0,否则返回-EFAULT。
描述从用户空间ptr处读取sizeof(*ptr)个字节数据方法赋值给驱动程序的x变量
拷贝的数据大小由指针类型决定

总结

  • copy_to_user函数和copy_from_user函数通常用于readwrite函数,来拷贝较大数据;
  • get_user宏和put_user宏通常用于ioctl函数,来拷贝单个数据,相较于较大数据的拷贝而言,get_user宏和put_user宏拷贝速度较快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值