免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2450 | 回复: 5
打印 上一主题 下一主题

[内存管理] copy_from_user在那种情况下会出现拷贝数据不完全? [复制链接]

论坛徽章:
1
水瓶座
日期:2013-09-28 21:40:25
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-16 12:41 |只看该作者 |倒序浏览
本帖最后由 bensenq 于 2014-04-16 12:43 编辑

copy_from_user返回0表示拷贝玩成功,如果返回正值则表示还剩多少数据没有拷贝完。

那我想知道什么情况下会出现只拷贝一部分数据的情况(例如需要copy 4KB数据,但是最后返回1K,代表之拷贝了3KB数据)?
copy_from_user是可以处理正常的缺页的,那么我的问题就会变的更具体点:什么情况下会出现不能正常处理的缺页异常?
  1. static inline long copy_from_user(void *to,
  2.                 const void __user * from, unsigned long n)
  3. {
  4.         might_sleep();
  5.         if (access_ok(VERIFY_READ, from, n))
  6.                 return __copy_from_user(to, from, n);
  7.         else
  8.                 return n;
  9. }
复制代码

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2014-04-16 14:24 |只看该作者
当拷贝的指针不是正真的用户态地址时,就会返回出错。因为指会是从用户态传入的,没法保证一定是对的。

论坛徽章:
1
水瓶座
日期:2013-09-28 21:40:25
3 [报告]
发表于 2014-04-16 14:44 |只看该作者
回复 2# Tinnal

我现在的情况是:

1. access_ok已经检查通过,但是在拷贝的过程中发生了某些异常。

2. 已经拷贝了了一些数据,而不是全部没有拷贝。
   

论坛徽章:
1
水瓶座
日期:2013-09-28 21:40:25
4 [报告]
发表于 2014-04-16 16:26 |只看该作者
本帖最后由 bensenq 于 2014-04-16 16:27 编辑

回复 2# Tinnal

Check了一下access_ok代码,发现其只是粗略的检验了一下是否是用户地址区间,而并没有检查是否存在有效的vma。

那么我遇到的情况应该这样理解: 属于 (addr, addr+size)用户地址区间中只有一部分是合法的,所有在做真正的copy时如果遇到不合法的地址就没法正常处理缺页,只能走fixup流程返回了。

恩,应该就是这样。


   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
5 [报告]
发表于 2014-04-17 09:23 |只看该作者
回复 4# bensenq
是的,这是2.6内核的优化,因为每次都去检查太耗时,而这些检查基本上都是通过的,几个极个别情况下去出错。因此采用了出错于去补救的办法。

   

论坛徽章:
1
水瓶座
日期:2013-09-28 21:40:25
6 [报告]
发表于 2014-04-17 10:53 |只看该作者
回复 5# Tinnal

是这样的,谢谢!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP