4

我试着写一个简单的字符设备驱动程序,现在,即使我打电话unregister_chrdev_region我仍然看到我的设备留在里面/proc/devices,像这样:

248 chardev
249 chardev
250 chardev

现在我无法插入任何模块,每次使用insmodshell 时都会告诉我:

Error: could not insert module test.ko: Device or resource busy

我在问如何/proc/devices. 我已经用过rmmod,而且rm已经chardev/dev. 但他们还在那里,被困在/proc/devices.

4

3 回答 3

1

确保您在拨打电话时拥有正确的设备主号码unregister_chrdev_regiondev_major我有一个类似的问题,我用同名的局部范围变量覆盖我的全局变量,导致我将 0 传递给unregister_chrdev_region.

于 2014-10-10T19:52:10.797 回答
0

你可以做这样的事情。这工作正常。头文件被省略,所有文件操作都在其中实现。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include "my_char_device.h"

MODULE_AUTHOR("alakesh");
MODULE_DESCRIPTION("Char Device");


static int r_init(void);
static void r_cleanup(void);

module_init(r_init);
module_exit(r_cleanup);


static struct cdev r_cdev;
static int r_init(void)
{
    int ret=0;
    dev_t dev;
    dev = MKDEV(222,0);
    if (register_chrdev_region(dev, 2, "alakesh")){
        goto error;
    }
    cdev_init(&r_cdev, &my_fops);
    ret = cdev_add(&r_cdev, dev, 2);
    return 0;
error:
    unregister_chrdev_region(dev, 2);
    return 0;
}


static void r_cleanup(void)
{
    cdev_del(&r_cdev);
    unregister_chrdev_region(MKDEV(222,0),2);
    return;
}
于 2013-06-26T01:20:31.130 回答
0

在编写初始 char 派生程序时,我也遇到了类似的问题。问题是由于在函数 unregister_chrdev_region(dev_t div_major, unsigned count) 中传递了无效的主编号。

我在退出例程中添加了一段代码来删除未从 /proc/devices 中删除的设备文件。

lets say these are the devices we need to remove.
248 chardev
249 chardev
250 chardev

static void r_cleanup(void)
{
    cdev_del(&r_cdev);
    unregister_chrdev_region(MKDEV(222,0),2);

    //My code changes. 
    unregister_chrdev_region(MKDEV(248,0), 1);
    unregister_chrdev_region(MKDEV(249,0), 1);
    unregister_chrdev_region(MKDEV(250,0), 1);

    return;
}

上述退出例程中的参考代码更改将删除主编号为 248、249 和 250 的字符设备。

于 2018-03-26T15:11:35.863 回答