動態申請字元類裝置號
阿新 • • 發佈:2019-01-13
字元裝置函式在檔案 include/linux/fs.h 中
alloc_chrdev_region() 是動態分配主次裝置號
巨集定義MAJOR提取dev_t資料中的主裝置號
編寫,編譯
測試原始碼:
#include <linux/init.h> /*包含初始化巨集定義的標頭檔案,程式碼中的module_init和module_exit在此檔案中*/ #include <linux/module.h> /*包含初始化載入模組的標頭檔案,程式碼中的MODULE_LICENSE在此標頭檔案中*/ /*定義module_param module_param_array的標頭檔案*/ #include <linux/moduleparam.h> /*定義module_param module_param_array中perm的標頭檔案*/ #include <linux/stat.h> /*三個字元裝置函式*/ #include <linux/fs.h> /*MKDEV轉換裝置號資料型別的巨集定義*/ #include <linux/kdev_t.h> /*定義字元裝置的結構體*/ #include <linux/cdev.h> #define DEVICE_NAME "ascdev" #define DEVICE_MINOR_NUM 2 #define DEV_MAJOR 0 #define DEV_MINOR 0 MODULE_LICENSE("Dual BSD/GPL"); /*宣告是開源的,沒有核心版本限制*/ MODULE_AUTHOR("SKYFALL"); /*宣告作者*/ int numdev_major = DEV_MAJOR; int numdev_minor = DEV_MINOR; /*輸入主裝置號*/ module_param(numdev_major,int,S_IRUSR); /*輸入次裝置號*/ module_param(numdev_minor,int,S_IRUSR); static int scdev_init(void) { int ret = 0; dev_t num_dev; printk("%s,%d\n",__func__,__LINE__); printk(KERN_EMERG "numdev_major is %d!\n",numdev_major); printk(KERN_EMERG "numdev_minor is %d!\n",numdev_minor); if(numdev_major) { num_dev = MKDEV(numdev_major,numdev_minor); ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME); } else { /*動態註冊裝置號*/ //int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name) ret = alloc_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME); /*獲得主裝置號*/ numdev_major = MAJOR(num_dev); printk("%s,%d\n",__func__,__LINE__); printk(KERN_EMERG "adev_region req %d !\n",numdev_major); } if(ret<0){ printk(KERN_EMERG "register_chrdev_region req %d is failed!\n",numdev_major); } printk(KERN_EMERG "scdev_init!\n"); /*列印資訊,KERN_EMERG表示緊急資訊*/ return 0; } static void scdev_exit(void) { printk(KERN_EMERG "scdev_exit!\n"); unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM); } module_init(scdev_init); /*初始化函式*/ module_exit(scdev_exit); /*解除安裝函式*/
相應的Makefile檔案參考相關博文即可。
載入執行
– 使用命令“cat /proc/devices”檢視
– 動態載入模組之後再檢視裝置號