美文网首页
copy_to_user和copy_from_user

copy_to_user和copy_from_user

作者: Mr_White | 来源:发表于2020-08-28 14:44 被阅读0次

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

今天费神找到源码,通过注释可以看到他们的含义:
1.语义是:如果成功返回0;如果失败,返回有多少个Bytes未完成copy。
2.这两个函数都可能会睡眠,因此只能用在用户上下文。

  1. _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 函数的功能就不只是从用户空间拷贝数据那样简单了,它还要 做一些指针检查以及处理这些 问题的方法

相关文章

  • copy_to_user和copy_from_user

    内核空间与用户空间数据传递的通道是copy_to_user和copy_from_user,刚开始使用时对他们的返回...

  • mmp

    如果发现跨大量版本的linux驱动代码,例如2.6中的copy_to_user在4.10下运行,需要修改库的路径。

  • 进程间通信

    Binder是IPC进程间通信的一种机制 传统IPC1通过copy_from_user 复制到内核空间2再通过co...

  • -和 和 -

    产品介绍:和和是一款会员制共享平台;所有 经营者可在APP内注册和和商家成为会员供 应商(实体店、网店、微商、平台...

  • &和&&,|和||

    原文:https://blog.csdn.net/chinabestchina/article/details/7...

  • 和可和,非常和

    我年纪很小的时候,父亲有一本笔记本,上面只写了一句话:万物并育而不相害,道并行而不相悖。我当时很喜欢这句话,所以期...

  • kotlin中的空? 和 ?. 和 ?: 和 as? 和 !!

    ? 可空类型 kotlin和Java的类型系统之间的一个很重要的区别就是,Kotlin对可空类型的显示支持 也就是...

  • self. 和 _ 和 = 和 set

    声明了一个属性 @property (a,b) p1; 只有用self.调用时修饰关键词才起作用, 用_调用...

  • Observable和Observe和Subcriblers 和

    Observable事件源,被观察者。Subcriblers 观察者,事件订阅者Observer 同Subcrib...

  • ?. 和 ?: 和 let 和 with和 解构声明 使用说明

网友评论

      本文标题:copy_to_user和copy_from_user

      本文链接:https://www.haomeiwen.com/subject/fuslsktx.html