如何卸载linux内核中的驱动,linux3.x内核如何强制卸载模块?

当Linux内核模块在insmod时遇到问题导致oops,rmmod无法卸载。本文通过分析《精通Linux设备驱动程序开发》中的vms驱动示例,展示了如何编写force_rmmod模块强制卸载。force_rmmod通过修改模块状态和引用计数,以及注销内核变量解决卸载问题,使得vms模块可以正常安装和卸载。
摘要由CSDN通过智能技术生成

一、问题现象:

在insmod时调用的init函数代码执行过程中出现oops,导致rmmod卸载失败,此时不得不重启目标板?

二、下面是《精通linux设备驱动程序开发》中模拟鼠标的输入设备驱动的内核模块vms.c代码:

#include

#include

#include

#include

#include

#include

static struct platform_device *vms_dev;

static struct input_dev *vms_input_dev;

static ssize_t write_vms(struct device *dev, struct device_attribute *attr, const char *buffer, size_t count)

{

int x, y;

sscanf(buffer, "%d%d", &x, &y);

printk("(x,y)=(%d,%d)\n", x, y);

input_report_rel(vms_input_dev, REL_X, x);

input_report_rel(vms_input_dev, REL_Y, y);

input_sync(vms_input_dev);

return count;

}

DEVICE_ATTR(coordinates, 0644, NULL, write_vms);

static struct attribute *vms_attrs[] = {

&dev_attr_coordinates.attr,

NULL

};

static struct attribute_group vms_attr_group = {

.attrs = vms_attrs,

};

static int __init vms_init(void)

{

int err;

printk("vms_init===========\n");

vms_dev = platform_device_register_simple("vms", -1, NULL, 0);

if (IS_ERR(vms_dev)) {

printk("############################platform_device_register_simple failed\n");

return PTR_ERR(vms_dev);

}

printk("vms_dev = 0x%x\n", vms_dev);

err = sysfs_create_group(&vms_dev->dev.kobj, &vms_attr_group);

if (err) {

printk("=============================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值