问题:linux模块加载和模块卸载时出现的问题
在编写驱动程序的时候有时候会出现这种情况,模块加载之后不能卸载或卸载之后不能在加载,cat/proc/devices后发现设备还占用着设备号,这种情况下,再次加载驱动模块肯定不会成功,必须重新启动才可以解决。最近仔细看书后发现自己在驱动程序的卸载函数中少写了两个函数调用,以至于在加载模块的时候申请或添加的设备没有被释放或删除。
解决:抛弃老版本register_chrdev()注册方式,使用register_chrdev_region( )方式实现注册
删除 /dev/
中的设备文件:rm -f /dev/your_device_name
检查设备文件是否创建:sudo mknod /dev/traffic_light c MAJOR_NUMBER 0
其中,MAJOR_NUMBER
是通过 cat /proc/devices
命令查看的设备的主设备号。
实现代码:
// virtual_traffic_light.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/cdev.h>
#define DEVICE_NAME "traffic_light"
static int major_number;
static struct cdev cdev;
static int light_status = 0; // 0: 红灯亮,1: 绿灯亮
static int device_open(struct inode *inode, struct file *file) {
return 0;
}
static int device_release(struct inode *inode, struc