【学习笔记】node
Linux杂项驱动出现的意义在于:有不少简单的外围字符设备,它们功能相对简单,一个设备占用一个主设备号对于内核资源来讲太浪费。
因此对于这些简单的字符设备它们共用一个主设备号,不一样的设备使用不一样的次设备号.linux
杂项设备是字符设备的一种,能够自动生成设备节点ide
系统中有不少杂项设备,能够输入cat/proc/misc命令来查看学习
杂项设备比字符设备代码简单this
杂项设备的主设备号是相同的,固定均为10,次设备号是不一样的,主设备号相同就能够节省内核的资源code
主设备号在Linux系统里边是惟一的,次设备号不必定惟一。blog
设备号是计算机识别设备的一种方式,主设备号相同就被视为同一类设备资源
主设备号能够看做是电话号码的区号,次设备号至关于电话号码get
主设备号能够经过命令cat /proc/devices来查看源码
定义在内核源码路径:include/linux/miscdevice.h
... #define MISC_DYNAMIC_MINOR 255 //表示会自动的分配次设备号:即动态分配 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; }; extern int misc_register(struct miscdevice *misc);//注册杂项设备 extern int misc_deregister(struct miscdevice *misc);//注销杂项设备 ...
file_operations文件操做集定义在include/linux/fs.h下面
里边的每个结构体成员都要对应一个调用。
(1)填充miscdevice这个结构体
(2)填充file_operations这个结构体
(3)注册杂项设备并生成设备节点
一个简单的杂项驱动代码
#include <linux/init.h> #include <linux/module.h> //增长两个头文件 #include <linux/miscdevice.h> #include <linux/fs.h> //第2步:填充文件操做集 struct file_operations misc_fops = { .owner = THIS_MODULE //这里简单的填充一个owner }; //第1步:填充杂项设备结构体 struct miscdevice misc_dev = { .minor = MISC_DYNAMIC_MINOR, //次设备号,动态分配 .name = "hello_misc", //设备节点的名字 .fops = &misc_fops //填充文件操做集 }; //第3步;注册到内核 static int misc_init(void){ int ret; ret = misc_register(&misc_dev);//存储注册的地址 //判断是否注册成功 if(ret < 0){ printk("misc registe is error\n"); return -1; } printk("misc registe is successful\n"); //内核里不能使用c语言库,因此不能用printf return 0; } //卸载驱动 static void misc_exit(void){ misc_deregister(&misc_dev); printk("misc bye bye\n"); } //入口和出口 module_init(misc_init); module_exit(misc_exit); //声明许可证 MODULE_LICENSE("GPL");
接下来把驱动编译到内核便可
而后使用杂项设备生成了设备节点