linux copy_to_user和copy_from_user函数的使用说明

来源:互联网 发布:java相对路径怎么写 编辑:程序博客网 时间:2024/05/19 14:35
copy_to_user和copy_from_user函数的使用说明


Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,
因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,
对应的数据可能不在内存中。用户空间的内存映射采用段页式,而内核空间有自己的规则;本次主要的讨论
linux运行的内用空间与内核空间进行数据传递(主要是应用在linux的驱动程序中)常用函数copy_to_user
和copy_from_user。下面是对这两个函数进行的详解


1.函数copy_to_user的函数原型
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
{
if (likely(access_ok(VERIFY_WRITE, to, n)))
n = __copy_to_user(to, from, n);
return n;
}
参数详解:
参数1( void __user *to): 拷贝内核空间的地址指针
参数2(const void *from): 用户空间的地址指针
参数3(unsigned long n):  内核拷贝到用户空间的字节数
返回值: 成功返回 0,失败是返回还没有拷贝的字节数




2.copy_from_user 函数
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
{
if (likely(access_ok(VERIFY_READ, from, n)))
n = __copy_from_user(to, from, n);
else
memset(to, 0, n);
return n;
}
参数详解:
参数1( void __user *to): 拷贝内核空间的地址指针
参数2(const void *from): 用户空间的地址指针
参数3(unsigned long n):  用户空间到内核空间的字节数
返回值: 成功返回 0,失败是返回还没有拷贝的字节数


总结:在两个函数中,都有对地址空间的有效性进行了检测。

原创粉丝点击