驱动学习之驱动和应用的接口

简介:

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

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

以上两个函数参考

http://blog.sina.com.cn/s/blog_55465b470100kdn9.html



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

相关文章
|
6月前
|
关系型数据库 MySQL API
安装驱动
安装驱动。
88 3
|
6月前
驱动常用技巧
。。。未完,待续。。。
48 0
|
6月前
2023驱动保护学习 -- 通过驱动保护进程
2023驱动保护学习 -- 通过驱动保护进程
41 0
|
6月前
|
芯片
8259A驱动编写
8259A驱动编写
81 0
|
索引
CAN驱动程序编程
CAN驱动程序编程
131 0
|
IDE 前端开发 数据可视化
ZenUML与服务驱动设计
ZenUML与服务驱动设计
ZenUML与服务驱动设计
|
测试技术 程序员
我的场景驱动设计
我的场景驱动设计
我的场景驱动设计
|
敏捷开发 消息中间件 缓存
什么是领域驱动
领域驱动的概念
211 0
【驱动详解】如何理解驱动程序
【驱动详解】如何理解驱动程序
353 0
【驱动详解】如何理解驱动程序