Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232298
  • 博文数量: 59
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 493
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-26 17:46
个人简介

做技术要:鹰击长空,鱼翔浅底。

文章分类

全部博文(59)

文章存档

2017年(1)

2016年(3)

2015年(27)

2014年(28)

分类: 嵌入式

2015-01-26 17:31:05

原文地址:copy_to_user copy_from_user 作者:青竹玉简

copy_to_user

内核空间与用户空间数据传递的通道是copy_to_user和copy_from_user,刚开始使用时对他们的返回值非常困惑。
按照”常理”,返回值应该是copy成功了多少个Bytes。但是在kernel里面,他们的语义是相反的。

今天费神找到源码,通过注释可以看到他们的含义:
1.语义是:如果成功返回0;如果失败,返回有多少个Bytes未完成copy。
2.这两个函数都可能会睡眠,因此只能用在用户上下文。
3. _copy_from_user如果失败,会在已拷贝的数据后面用0填充,直到指定的数量n。
4.access_ok:  在_copy_from_user和copy_to_user中,都首先通过此宏判断[用户空间地址]的有效性。
前者判断地址是否可读,后者判断地址是否可写。其实,可写是可读的超集,可写的地址段一定可读。
但是通过查看access_ok的定义发现,并没有使用者两个类型。而只是通过另一个宏[__range_not_ok]来确定地址和长度是否越界。

copy_from_user 函数的目的是从用户空间拷贝数据到内核空间,失败返回没有 被拷贝的字节数,成功返回 0. 这么简单的一个函数却含盖了许多关于内核方面的知识,比如内核关于异常出错 的处理.从用户空间拷贝 数据到内核中时必须非常小心,如果用户空间的数据地址是个非法的地址,或是 超出用户空间的范围,或是 那些地址还没有被映射到,都可能对内核产生很大的影响,如 oops,或者被造 成系统安全的影响.所以 copy_from_user 函数的功能就不只是从用户空间拷贝数据那样简单了,它还要 做一些指针检查以及处理这些 问题的方法


阅读(1435) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~