copy_to_user 和 copy_from_user

转载:http://blog.csdn.net/joker0910/article/details/6608266

<asm/uaccess.h>

copy_from_user函数目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0。从用户空间拷贝数据到内核中时必须非常小心,如果用户空间的数据地址是个非法的地址,或是超出用户空间的范围,或是那些地址还没有被映射到,都可能对内核产生很大的影响。copy_from_user函数的功能就不只是从用户空间拷贝数据那样简单了,它还要做一些指针检查以及处理这些问题的方法。

unsigned long
copy_from_user(void *to, const void __user *from, unsigned long n)
{
   might_sleep();
   if (access_ok(VERIFY_READ, from, n))
       n = __copy_from_user(to, from, n);
   else
       memset(to, 0, n);
   return n;
}

首先这个函数是可以睡眠的,它调用might_sleep()来处理,#define access_ok(type,addr,size) (likely(__range_ok(addr,size) == 0)),进一步调用__range_ok函数来处理,它所做的测试很简单,就是比较addr+size这个地址的大小是否超出了用户进程空间的大小,在做完地址范围检查后,如果成功则调用__copy_from_user函数开始拷贝数据了,如果失败的话,就把从to指针指向的内核空间地址到to+size范围填充为0。

copy_to_user函数则是从内核空间拷贝内容到用户空间,用户空间的进程无法直接访问内核空间的内容。这个函数做了数据合法判断。然后进行拷贝。

   copy_to_user(void __user *to, const void *from, unsigned long n)
     {
     if (access_ok(VERIFY_WRITE, to, n))
     n = __copy_to_user(to, from, n);
     return n;
  }
时间: 2024-11-03 22:22:42

copy_to_user 和 copy_from_user的相关文章

系统调用(二)

(五):系统调用的实现 1:实现系统调用 实现一个系统调用就是考虑他的用途,每个系统调用都有一个确定的用途,在Linux中不提倡採用多用途的系统调用(一个系统调用通过传递不同的參数值来选择完毕不同的工作). 2:參数验证 系统调用必须细致检查他们全部的參数是否合法有效.最重要的一项检查就是检查用户提供的指针是否有效. 在接收一个用户空间的指针之前.内核必须保证: ?1:指针指向的内存区域属于用户空间,进程决不能洪骗内核去读内核空间的数据 ?2:指针指向的内存区域在进程的地址空间里. 进程决不能哄

互斥锁与自旋锁

1.互斥锁原理 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象. 互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源.可以保证以下三点: (1)原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果一个线程锁定了一个互斥量,没有其他线程在同 一时间可以成功锁定这个互斥量. (2)唯一性:如果一个线程锁定了一个互

linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件.#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件.#include <mach/***.h> 是在linux-2.6.29/arch/ar

【转】朱兆祺带你一步一步学习嵌入式(连载)

原文网址:http://bbs.elecfans.com/jishu_357014_2_1.html#comment_top  从最初涉及嵌入式Linux开始到现在,深深的知道嵌入式的每一步学习都是举步维艰.从去年11月份开始,我就着手整理各种学习资料,希望推动嵌入式学习的前进贡献自己微不足道的一份力量.从去年到现在,将C语言的学习经验整理成<攻破C语言笔试与机试陷阱及难点>(现在仍在更新),这份资料已经在电子发烧友论坛的单片机论坛连载(http://bbs.elecfans.com/jish

linux驱动面试题整理

资料来自网上,简单整理,答案后续补充...... 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也叫手动创建设备文件.还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后.那么在系统启动期间还有devfs创建了设备文件.一共有三种方式可

Linux驱动开发常用头文件

头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下: 1.主目录 <a.out.h>:a.out头文件,定义了a.out执行文件格式和一些宏.<const.h>:常数符号头文件,目前仅定义了i节点中i_mode字段的各标志位.<ctype.h>:字符类型头文件,定义了一些有关字符类型判断和转换的宏.<errno.h>:错误号头文件,包含系统中各种出错号.(

《android深入探索》第六章心得

看了本书第六章,我学到了: linux系统下每个驱动都映射成一个文件(设备文件/驱动文件),都保存在/dev目录下.回掉函数的功能是使linux驱动能响应应用程序,使设备文件和应用程序交互的接口. 编写linux驱动程序(大体框架): ①   装载驱动:module_init()   卸载驱动:module_exit() ②   注册设备文件:misc_register()  注销设备文件:misc_deregister() ③   指定与驱动相关信息:MODULE_AUTHOR.MODULE_

Samsung_tiny4412(笔记)--&gt;字符设备驱动基本操作及调用流程

/*********************************************************************************** * * Samsung_tiny4412(笔记)-->字符设备驱动基本操作及调用流程 * * 声明: * 以下所有的shell命令都是在root权限下运行的; * * 2015-3-7 阴 深圳 尚观 Sbin 曾剑锋 *******************************************************

linux服务端的网络编程

常见的Linux服务端的开发模型有多进程.多线程和IO复用,即select.poll和epoll三种方式,其中现在广泛使用的IO模型主要epoll,关于该模型的性能相较于select和poll要好不少,本文也主要讨论该模型而忽略另外两种IO复用模型. 多线程相较于多进程开销比较小,但是要主要主线程往子线程传递数据的时候要注意变量互斥访问来保证线程安全. epoll模型在Linux2.6内核中引入的,改进了select中的一些明显设计上的缺点,具有更高的效率.主要体现在以下几个方面: 1. epo