Yuhang Zheng

第十节、注册字符类设备

N 人看过

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

注册杂项设备:

1
misc_register(&misc_dev);

注销杂项设备:

1
misc_deregister(&misc dev);

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

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

1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
8
9
10
11
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

1
2
3
4
5
6
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

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

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

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

格式:

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

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