驱动学习之register_chrdev_region函数和cdev结构体
admin
2023-08-02 19:46:52
0

1:register_chrdev_region

int register_chrdev_region(dev_t from, unsigned count, const char *name)
{
    struct char_device_struct *cd;
    dev_t to = from + count;
    dev_t n, next;

    for (n = from; n < to; n = next) {
        next = MKDEV(MAJOR(n)+1, 0);
        if (next > to)
            next = to;
        cd = __register_chrdev_region(MAJOR(n), MINOR(n),
                   next - n, name);
        if (IS_ERR(cd))
            goto fail;
    }
    return 0;
fail:
    to = n;
    for (n = from; n < to; n = next) {
        next = MKDEV(MAJOR(n)+1, 0);
        kfree(__unregister_chrdev_region(MAJOR(n), MINOR(n), next - n));
    }
    return PTR_ERR(cd);
}

  register_chrdev_region函数和register_chrdev函数类似,也是用于字符设备驱动的注册,不同点在于register_chrdev函数在注册字符设备驱动的时候是一步完成的,而register_chrdev_region函数在注册字符设备驱动的时候是分两步完成的:

第一步:注册/分配主次设备号

第二步:注册字符设备驱动

此外有register_chrdev_region函数的源码可以发现,register_chrdev_region可以同时注册多个设备号

2:cdev结构体的定义

struct cdev {
    struct kobject kobj;    //每个cdev都是一个kobject
    struct module *owner;  //指向实现驱动的模块
    const struct file_operations *ops;   //操作这个字符设备的方法
    struct list_head list;  //与cdev对应的字符设备文件的inode->i_devices的链表头
    dev_t dev;     //起始的设备号
    unsigned int count;  //设备号的范围,也可以用于计数等,起始就是一个普通的变量
};

cdev结构体的定义在linux/cdev.h中,这个结构体的定义是用于描述一个设备驱动

注册函数相关的函数

cdev_alloc:给cdev结构体分配内存(指针实例化)

cdev_init:绑定cdev和file_operations

cdev_add:注册设备

cdev_del:注销设备

3:dev_t类型

    dev_t类型其本质就是一个unsigned int 类型的变量,这个变量用于存放主次设备号,比如高16位存放主设备号,低16位存放次设备号,具体哪些位用来存放主设备号,哪些位用来存放次设备号要看具体的定义。

4:设备号相关的三个宏

MKDEV:由主次设备号换算得到一个设备号

#define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))
ma:主设备号
mi:次设备号

MAJOR:从设备号中取出主设备号

#define MAJOR(dev)    ((unsigned int) ((dev) >> MINORBITS))

MINOR:从设备号中取出次设备号

#define MINOR(dev)    ((unsigned int) ((dev) & MINORMASK))


相关内容

热门资讯

拦得住AI眼镜作弊,护得住学生... 如果考场上的较量,比的不是谁学得好,而是比谁的装备更先进,那考试还剩下什么?“你的眼镜有问题,交卷走...
错失绝杀机会后,哥伦比亚球员收... 2026美加墨世界杯1/8决赛中,哥伦比亚队不敌瑞士队,止步十六强。据美国娱乐和体育电视台(ESPN...
中国工程院产生新“掌门” 中国工程院第十八次院士大会7月11日在北京闭幕。大会宣布,中国工程院产生新一届院领导班子,张玉卓任院...
“村民杀害村支书案”,维持死刑... 2024年7月,广东揭阳市普宁市马栅村发生一起血案,54岁村民黄某欢将时任村支书黄某其杀害,并捅伤一...
定频空调制热时外机频繁启动正常... 空调制冷或者制热时一旦达到设定的温度外就会停机,当温度下降后又重新启动,这是很正常的现象。但是这种情...
海信电视开机频繁启动 原因可能是电视的启动系统错误,可以将电视机的电源切断来解决;原因可能是电视的系统崩溃了,可以找专业的...
冰箱频繁启动不制冷是怎么回事 1、首先需要检查电源线连接是不是正常,这时可以打开冰箱的门,然后观察冰箱内的照明灯是否点亮,或者直接...
苹果手机如何越狱 苹果手机越狱... 苹果手机如何越狱相信有很多小伙伴对此存在疑惑,接下来就跟着小编一起了解一下苹果手机越狱方法说明! ...
苹果手机怎么把sim卡联系人导... 苹果手机怎么把sim卡联系人导入手机?苹果手机的 系统 和功能是很多用户都比较喜欢的,很多新用户都是...
新加坡前外长解读哈梅内伊葬礼:... 伊朗已故最高领袖哈梅内伊的葬礼已经结束,出席人数约4300万人,是人类史上最大规模的葬礼。有分析认为...