首页 > 代码库 > 驱动学习之驱动和应用的接口
驱动学习之驱动和应用的接口
在前面讲过,驱动层是应用层是分离,驱动层的代码不能使用再应用层,应用层也不能直接操作驱动代码,那么应用层和驱动层之间是如何来实现数据间的交换的能,方法就是通过相应的接口函数。
(1)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; }
这个函数是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0,注意用户空间的数据不能直接通过memcpy复制到内核空间,原因是内核空间和用户空间的地址不在同一个映射区域里面。内核空间和用户空间的内存是不能直接访问的。
(2)copy_to_user
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) { might_sleep(); BUG_ON((long) n < 0); if (access_ok(VERIFY_WRITE, to, n)) n = __copy_to_user(to, from, n); return n; }
返回值和copy_from_user一样,成功返回0,失败返回没有拷贝成功的字节数。
参数to有个__user限定,这个在~/include/linux/compiler.h中有如下定义:
# define __user __attribute__((noderef, address_space(1)))
表示这是一个用户空间的地址,即其指向的为用户空间的内存。
__attribute__是gnu c编译器的一个功能,它用来让开发者使用此功能给所声明的函数或者变量附加一个属性,以方便编译器进行错误检查,其实就是一个内核检查器。
以上两个函数参考
http://blog.sina.com.cn/s/blog_55465b470100kdn9.html
本文出自 “11664570” 博客,请务必保留此出处http://11674570.blog.51cto.com/11664570/1872418
驱动学习之驱动和应用的接口
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。