博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
驱动学习之驱动和应用的接口
阅读量:5986 次
发布时间:2019-06-20

本文共 1021 字,大约阅读时间需要 3 分钟。

  在前面讲过,驱动层是应用层是分离,驱动层的代码不能使用再应用层,应用层也不能直接操作驱动代码,那么应用层和驱动层之间是如何来实现数据间的交换的能,方法就是通过相应的接口函数。

(1)copy_from_user

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
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编译器的一个功能,它用来让开发者使用此功能给所声明的函数或者变量附加一个属性,以方便编译器进行错误检查,其实就是一个内核检查器。

以上两个函数参考

本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1872418

转载地址:http://jrylx.baihongyu.com/

你可能感兴趣的文章
iOS_40_核心动画
查看>>
WCF 客户端 BasicHttpBinding 兼容 HTTPS 和 HTTP
查看>>
字符串截取mysql
查看>>
IIS预编译提升加载速度
查看>>
什么是行式数据库,什么是列式数据库
查看>>
codeforces 558 E A Simple Task
查看>>
MySQL数据记录大小写敏感问题【转】
查看>>
漫谈iOS Crash收集框架
查看>>
《软件调试艺术》读后感七
查看>>
android YUV Sensor配置Camera应用的flash auto菜单
查看>>
php将数组或字符串写入文件
查看>>
C++ string类学习总结
查看>>
思维逻辑面试题
查看>>
jquery时间格式化插件
查看>>
PHP:第一章——PHP中的变量002
查看>>
Ubuntu设置环境变量并立即生效
查看>>
LINUX设备驱动程序笔记(三)字符设备驱动程序
查看>>
概率分布之间的相似度
查看>>
路由器不重启,是否ip就永远不变
查看>>
Asp.net MVC检测到有潜在危险的 Request.Form 值
查看>>