• file、inode在应用层和驱动层之间的联系_转


    转自:http://blog.csdn.net/dreaming_my_dreams/article/details/8272586

    应用层和驱动的衔接,一直是一个老大难问题,若弄不清楚,总觉得驱动写起来似是而非的。下面就说说我对他们的理解,还有就是如何实现一个驱动支持多个上设备的问题。

    最主要涉及两个机制:inode和file。

    在驱动中:

    (1)、我们先找到一个设备号devno,可以动态申请,也可以静态设定,假设静态设定为major,minor,通过宏MKDEV(major,minor)来生成devno

    (2)、构建对设备的操作函数file_opreation结构体,里面包含了的设备的操作:open、read、write、release、ioctl等

    (3)、构建cdev结构体,里面填充两个主要成员dev(设备号)、file_operation(对设备的操作)

    (4)、把cdev添加的cdev链表中:cdev_init、cdev_add

    应用程序中:

    fd=open("/dev/hello",O_RDWR)来打开设备文件,此设备节点对应有一个设备号,这是我们识别驱动和设备的桥梁。

    打开 /dev/hello时,根据设备号,在cdev链表中找到cdev这个结构体,cdev里面包含了file_operation结构体,有设备的各种操作,打开时就调用里面的.open 函数。在这里要完成几件事:

    (1)inode节点 每一个文件都对应有一个inode节点,inode结构体里.i_fop由cdev的file_operation填充,i_dev由cdev的设备号填充

    (2)file结构体中的file_operation也同样由cdev中对应项填充,还有一项fd,对应于打开文件的文件描述符,fd和file一一对应,文件每打开一次,就有一个file结构体。所以file里面的.private就很重要,下面会说到。

    还有一个问题,那就是多个相同的设备,会公用同一个驱动,所以要把每一个设备的私有数据封装起来,构成一个私有数据结构体。对设备的每一次读写,都通过操作设备的私有数据结构体中的资源来完成。也就是说,驱动在加载的时候,会申请多个设备私有资源结构体,每个结构体中包含了设备的所有私有资源,虽然公用一个驱动,可是通过设备号找到此设备号对应设备的私有资源,说的有点拗口。这可以通过file结构体的.private来指向。

    例如封装私有数据的结构体为:

    struct hello_device{

    char buf[128]; //设备的私有资源,譬如buf

    struct cdev cdev;//设备结构体,里面有devno和file_operation

    ……

    };

    前面应经提到inode中的i_cdev会指向cdev结构,所以可以由Container宏来得到hello_device的地址。

    所以,在驱动的open函数中有两个参数,inode和file

    int open(structc inode *inode,struct file *file){

    struct hello_device   *p =container(inode->i_cdev,hello_struct,cdev)

    file->private=p;

    }

    这样file中就包含了设备的私有数据。

    驱动read函数中:

    ssize_t read(fd,char __user *buf,count)

    fd和file一一对应,每打开一次设备,虽然有不同的fd,但他们的file.private是一样的。

    前面主要说了一个驱动如何可以支持多个设备的问题,以及应用层和驱动之间的联系。还有一个问题就是,如何处理过个进程访问同一个设备的问题。

  • 相关阅读:
    BZOJ 1051: [HAOI2006]受欢迎的牛
    BZOJ 3668: [Noi2014]起床困难综合症
    BZOJ 4395: [Usaco2015 dec]Switching on the Lights
    BZOJ 2763: [JLOI2011]飞行路线
    Bzoj 3196 Tyvj 1730 二逼平衡树
    BZOJ 2407: 探险/4398: 福慧双修
    BZOJ 3040: 最短路(road)
    BZOJ 2809: [Apio2012]dispatching
    BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
    BZOJ 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/6512471.html
Copyright © 2020-2023  润新知