简介
杂项设备是字符设备的一种
杂项设备自动生成设备节点(/dev/目录下的文件叫设备节点)
系统中的杂项设备可以通过cat /proc/misc来查看
杂项设备的主设备号是相同的,均为10,次设备号不同。主设备号相同就可以节省内核的资源。
设备号简介
设备号包括主设备号和次设备号。
cat /proc/devices可以查看主设备号
杂项设备结构体
//在kernel/include/linux/miscdevice.h头文件中
struct miscdevice {
int minor; //次设备号
const char *name; //设备节点名
const struct file_operations *fops; //文件操作集 //比较重要
struct list_head list;
struct device *parent;
struct device *this_device;
const struct attribute_group **groups;
const char *nodename;
umode_t mode;
};
//file_operations结构体里会有一些像read/write的成员,是应用层在操作设备节点read/write时会操作的。
extern int misc_register(struct miscdevice *misc); //注册杂项设备
extern void misc_deregister(struct miscdevice *misc); //注销杂项设备
注册杂项设备的流程
- 填充miscdevice结构体
- 填充file_operations结构体
- 注册杂项设备并生成设备节点
代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
struct file_operations misc_fops = {
.owner = THIS_MODULE
};
struct miscdevice misc_dev = {
.minor = MISC_DYNAMIC_MINOR, //自动分配从设备号
.name = "hello_misc", //设备节点名
.fops = &misc_fops //文件操作集
};
static int misc_init(void){
printk("misc enter!\n");
int ret = misc_register(&misc_dev); //注册杂项设备
if(ret < 0){
printk("misc regist failed\n"); //注册失败
return -1;
}
printk("misc regist succeed\n");
return 0;
}
static void misc_exit(void){
printk("misc exit!\n");
misc_deregister(&misc_dev); //卸载杂项设备
}
module_init(misc_init); //模块入口,加载驱动时执行参数内的函数
module_exit(misc_exit); //模块出口,卸载模块时执行参数内的函数
MODULE_LICENSE("Dual BSD/GPL"); //遵循BSD和GPL开源许可
MODULE_AUTHOR("TAXUE"); //模块作者
加载.ko文件后,在/dev/目录下可以找到代码中定义的设备节点名(即miscdevice结构体的name成员)。