免费注册 查看新帖 |

Chinaunix

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

[内存管理] 关于exact_copy_from_user()复制大小的不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-31 17:14 |只看该作者 |倒序浏览
  1. int copy_mount_options(const void __user *data, unsigned long *where)
  2. {
  3.         int i;
  4.         unsigned long page;
  5.         unsigned long size;
  6.        
  7.         *where = 0;
  8.         if (!data)
  9.                 return 0;

  10.         if (!(page = __get_free_page(GFP_KERNEL)))
  11.                 return -ENOMEM;

  12.         /* We only care that *some* data at the address the user
  13.          * gave us is valid.  Just in case, we'll zero
  14.          * the remainder of the page.
  15.          */
  16.         /* copy_from_user cannot cross TASK_SIZE ! */
  17.         size = TASK_SIZE - (unsigned long)data;
  18.         if (size > PAGE_SIZE)
  19.                 size = PAGE_SIZE;

  20.         i = size - [color=Blue]exact_copy_from_user((void *)page, data, [color=Red]size[/color]);[/color]
  21.         if (!i) {
  22.                 free_page(page);
  23.                 return -EFAULT;
  24.         }
  25.         if (i != PAGE_SIZE)
  26.                 memset((char *)page + i, 0, PAGE_SIZE - i);
  27.         *where = page;
  28.         return 0;
  29. }
复制代码
以上代码中调用了exact_copy_from_user((void *)page, data, size),其实这段代码是sys_mount中调用的,它的功能是将变量从用户空间复制到当前的内核空间,复制的变量应该没有多大的字节,充其量是几十个字节,因为我们平时使用的mount是输入的选项和参数也不过几个十几个而已。但不明白的是这段代码在指定需要复制数据的字节数时会使用一个PAGE_SIZE的空间大小,这是不是有些浪费?就好像用一个char buff[1024]的数组只为了保存“hello world”这样的字符串而已。后来想了一下,会不会是因为从内核层面上来访问内存的最小单位就是PAGE_SIZE,即它只能一个PAGE一个PAGE的访问,而不能一个BYTE一个BYTE的访问?烦请熟悉内情的朋友帮忙确定一下?先表示感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP