Linux字符驱动--结构分析

1、aloc_cdev分配、init_cdev初始化、add_cdev设备注册

2、三个结构体node、file_operation、file,前两个在驱动中自已定义,最后一个在打开时内核帮你定义的(我觉得是)。

3、open打开时需要提取次设备号并将次设备对应的描述结构体的指针赋给file->private,然后下面的读写就知道是针对哪个具体的设备来操作了

4、先分析初始化函数、然后file_operation结构

 

内核中所有已分配的字符设备编号都记录在一个名为chrdevs散列表里,该散列表的每一个元素都是一个char_dev_struce结构,它的定义如下:

static struct char_device_struct{

    struct char_device_stuct *next; //指向散列链表中的下一个元素的指针

    unsigned int major;                   //主设备号

    unsigned int baseminor;         //起始设备号

    init minorct;                            //次设备号的范围大小

    char name[64];                     //处理该设备编号范围内的设备驱动的名称

    struct file_operation *fops    //没有使用

    struct cdev *cdev                  //指向字符设备驱动程序描述符的指针

   }*chrdevs[CHRDEV_MAJOR_HASH_SIZE];

内核提供了三个函数来注册一组字符设备编号,分别是register_chrdev_region()、alloc_chrdev_region、

register_chrdev()。这三个函数会调用一个共同的_register_chrdev_region()函数来注册一组设备编号范围

(即一个char_device_struct结构)

静态分配

register_chrdev_region(dev_t first, unsigned int count, char *name)

first: 设备编号范围的初始值(次设备号常为0);

count: 连续编号范围;

name: 编号相关联的设备名称(/proc/devices);

 

动态分配

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)

 

register_chrdev()是一个老式分配设备编号范围的函数,它分配一个单独主设备号和0~255的次设备号范围。如果申请的主设备号为0,则动态分配一个。

共同调用的函数

static struct char_device_struct * __register_chrdev_region(unsigned int major, unsigned int baseminor, int minorct, const char *name)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值