Yuhang Zheng

第十节、注册字符类设备

N 人看过

本节用于介绍如何注册字符类设备

注册杂项设备:

misc_register(&misc_dev);

注销杂项设备:

misc_deregister(&misc dev);

cdev结构体:描述字符设备的一个结构体

文件位置路径:include/linux/cdev.h

struct cdev {
        struct kobject kobj;
        struct module *owner;                //属于哪一个模块    
        const struct file_operations *ops;    //文件操作集
        struct list_head list;                //链表的节点
        dev_t dev;                            //设备号
        unsigned int count;                    //次设备号的数量
} __randomize_layout;

步骤一、定义一个cdev结构体

步骤二、使用cdev_init函数初始化cdev结构体成员变量

文件位置路径:include/linux/cdev.h

实际函数位置路径:fs/char_dev.c

void cdev_init(struct cdev *, const struct file_operations *);
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
        memset(cdev, 0, sizeof *cdev);
        INIT_LIST_HEAD(&cdev->list);
        kobject_init(&cdev->kobj, &ktype_cdev_default);
        cdev->ops = fops;//可以发现这个函数就是把文件操作集写给cdev的成员变量ops
}
//参数
//cdev:要初始化的cdev
//fops:文件操作集

步骤三、使用cdev_add函数注册到内核

文件位置路径:include/linux/cdev.h

实际函数位置路径:fs/char_dev.c

int cdev_add(struct cdev *, dev_t, unsigned);
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
//参数
//p:cdev的结构体指针
//dev:设备号
//count:设备号的数量

注销字符设备

文件位置路径:include/linux/cdev.h

实际函数位置路径:fs/char_dev.c

void cdev_del(struct cdev *);
void cdev_del(struct cdev *p)
//参数
//p:cdev的结构体指针  

字符设备注册完之后不会自动生成设备节点。

我们需要使用mknod命令创建一个设备节点

格式:

mknod 名称 类型 主设备号 次设备号

root@localhost:~# mknod /dev/chrdev c 235 0