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

copy_to_user copy_from_user返回值相关推荐

  1. 内核空间和应用空间的数据拷贝(copy_to_user copy_from_user)

    1.copy_to_user & copy_from_user long copy_to_user(void __user *to, const void *from, unsigned lo ...

  2. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

  3. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

  4. Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  5. [JS]请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

    请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组. 刚开始复习js题还不太习惯 CSDN上看了一个帖子,说是牛客上的标答, ...

  6. 微信小程序根据后台返回值设置自己想要的结果

    今天做微信小程序充值列表 其中微信或者支付后台返回的是1和2 , 那么就需要判断返回值是否为1或者是2然后在改变 简单的就是在xml中判断下就行了 <view class='recharge_t ...

  7. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  8. C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)

    先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...

  9. try-catch-finally对返回值的影响

    catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源. finally 块用于清理try块分配的任 ...

最新文章

  1. Depth graph
  2. ICRA 2021 | UPSLAM:联合全景SLAM
  3. ffmpeg图片压缩为视频
  4. SQL盲注之时间注入
  5. sqlserver常用函数点滴记录
  6. Zabbix linux agent 安装
  7. Pygal简介、画廊--各种图形绘图代码
  8. 中安网培***入门教程
  9. 在 WindowMobile 上的模拟LED 显示屏插件(转)
  10. 华为2019数字芯片岗笔试解析(多选部分)
  11. ASEMI-MBR60200PT肖特基二极管正向压降怎么测
  12. 将前端传过来的base64加密图片保存到本地,并且判断来自于哪个终端
  13. 免费试用一年微软云服务领取教程
  14. 《求职》第四部分 - 操作系统篇 - Linux基础
  15. (基因功能 基因表达调控)研究方案
  16. Windwos注册表案例(友尽百科)
  17. 跨境电商难做?你需要知道这5个“低成本低风险”跨境电商项目
  18. Windows查看进程命令
  19. Vue.js使用CSS美化
  20. Centos7中病毒排查[tsm][kswapd0]

热门文章

  1. 五一假期出行必备的高科技手册
  2. springboot+vue洗衣店管理系统
  3. 为什么要微服务(服务化)?
  4. javascript案例24——班级成绩求和、求平均值
  5. EFCore中所谓IQueryable
  6. 【找规律+公式推导+切西瓜问题】HDU-1290 献给杭电五十周年校庆的礼物
  7. linux hostname 和hostname -i问题
  8. 话题挑战赛第2期来啦,五千元现金+周边等你瓜分!
  9. 优雅的python_18式优雅你的Python
  10. 有点突然,锤子就这样终结了!而创始人在隔壁直播卖着红米...