示例代码
#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> unsigned int major_id = 502; const char major_name[] = "test"; const struct file_operations major_fops = { }; static int __init my_chrdrv_init(void) { //一般都是申请资源 //申请设备号 int ret = register_chrdev(major_id, major_name, &major_fops); if (ret == 0){ printk("register ok\n"); } else{ printk("register failed"); return -EFAULT; } return 0; } static void __init my_chrdrv_exit(void) { //一般都是释放资源 //释放设备号资源 unregister_chrdev(major_id, major_name); } MODULE_LICENSE("GPL"); module_init(my_chrdrv_init); module_exit(my_chrdrv_exit);
效果展示:
[root@farsight ]# cat /proc/devices Character devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty ... 253 tpm 254 gpiochip [root@farsight ]# insmod chr_drv.ko [ 117.470884] chr_drv: loading out-of-tree module taints kernel. [ 117.476144] register ok [root@farsight ]# cat /proc/devices Character devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty ... 253 tpm 254 gpiochip 502 test [root@farsight ]# rmmod chr_drv.ko [root@farsight ]# cat proc/devices Character devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty 4 ttyS ··· 252 rtc 253 tpm 254 gpiochip
1,手动创建--缺点/dev/目录中文件都是在内存中,断电后/dev/文件就会消失
mknod /dev/设备名 类型 主设备号 次设备号 比如: mknod /dev/mychr0 c 502 0 [root@farsight ]# mknod /dev/mychr0 c 502 0 [root@farsight ]# ls /dev/mychr0 -l crw-r--r-- 1 0 0 502, 0 Jan 1 00:01 /dev/mychr0
2,自动创建(通过udev/mdev机制)
struct class *class_create(owner, name)//创建一个类 参数1: THIS_MODULE 参数2: 字符串名字,自定义 返回一个class指针 //创建一个设备文件 struct device *device_create(struct class * class, struct device * parent, dev_t devt, void * drvdata, const char * fmt,...) 参数1: class结构体,class_create调用之后到返回值 参数2:表示父亲,一般直接填NULL 参数3: 设备号类型 dev_t dev_t devt #define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) #define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi)) 参数4:私有数据,一般直接填NULL 参数5和6:表示可变参数,字符串,表示设备节点名字
销毁动作:
void device_destroy(devcls, MKDEV(dev_major, 0)); 参数1: class结构体,class_create调用之后到返回值 参数2: 设备号类型 dev_t void class_destroy(devcls); 参数1: class结构体,class_create调用之后到返回值
效果展示
[root@farsight ]# insmod chr_drv.ko [ 33.757337] VMEM_VDD_2.8V: disabling [ 34.262594] chr_drv: loading out-of-tree module taints kernel. [ 34.268058] register ok [root@farsight ]# rmmod chr_drv.ko [root@farsight ]#