2

我正在学习如何编写内核驱动程序,我对函数 unregister_chrdev_region 的正确使用有疑问。

现在我有一个简单的测试模块,只有 init 和 exit 函数:

static dev_t devn; 

int __init my_dev_init(void)
{
    devn = MKDEV(0,0); 

    if(alloc_chrdev_region(&devn,0,1,"my_dev") != 0)
    {
        return -EBUSY; 
    }
    else
    {
        return 0; 
    }
}

void __exit my_dev_exit(void)
{
   unregister_chrdev_region(devn,1);  
 }

我的问题:如果注册失败,调用 unregister_chrdev_region 是否安全?我会假设没有,但无论初始化期间发生了什么,我看到的几乎所有示例代码都会调用 unregister_chrdev_region。

4

1 回答 1

4

注册很少失败。如果注册失败,则init函数失败,因此insmod命令将无法成功加载内核模块即test.ko,并且不会创建设备节点。所以不存在注销(rmmod)的问题。如果注册成功,那么只有我们可以取消注册驱动程序,即卸载内核、删除设备节点等...使用 rmmod。如果 init 函数注册成功而其他 API 失败则需要添加 goto 语句,跳转到相应的 goto 标签以取消注册并返回相应的错误值。希望我已经清除了您的疑问:-)

于 2013-08-06T09:18:25.877 回答