【學習筆記】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");
接下來把驅動編譯到內核便可
而後使用雜項設備生成了設備節點