- 论坛徽章:
- 0
|
- int copy_mount_options(const void __user *data, unsigned long *where)
- {
- int i;
- unsigned long page;
- unsigned long size;
-
- *where = 0;
- if (!data)
- return 0;
- if (!(page = __get_free_page(GFP_KERNEL)))
- return -ENOMEM;
- /* We only care that *some* data at the address the user
- * gave us is valid. Just in case, we'll zero
- * the remainder of the page.
- */
- /* copy_from_user cannot cross TASK_SIZE ! */
- size = TASK_SIZE - (unsigned long)data;
- if (size > PAGE_SIZE)
- size = PAGE_SIZE;
- i = size - [color=Blue]exact_copy_from_user((void *)page, data, [color=Red]size[/color]);[/color]
- if (!i) {
- free_page(page);
- return -EFAULT;
- }
- if (i != PAGE_SIZE)
- memset((char *)page + i, 0, PAGE_SIZE - i);
- *where = page;
- return 0;
- }
复制代码 以上代码中调用了exact_copy_from_user((void *)page, data, size),其实这段代码是sys_mount中调用的,它的功能是将变量从用户空间复制到当前的内核空间,复制的变量应该没有多大的字节,充其量是几十个字节,因为我们平时使用的mount是输入的选项和参数也不过几个十几个而已。但不明白的是这段代码在指定需要复制数据的字节数时会使用一个PAGE_SIZE的空间大小,这是不是有些浪费?就好像用一个char buff[1024]的数组只为了保存“hello world”这样的字符串而已。后来想了一下,会不会是因为从内核层面上来访问内存的最小单位就是PAGE_SIZE,即它只能一个PAGE一个PAGE的访问,而不能一个BYTE一个BYTE的访问?烦请熟悉内情的朋友帮忙确定一下?先表示感谢。 |
|