驱动内核开发报错记录

问题: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值