Linux cdev vs register_chrdev

我正在重新编写驱动程序,并在LDD3中遇到了cdev接口.阅读http://lwn.net/Articles/195805/后,我比开明更困惑.从那里的评论

  • In order the device to actually appear in the file system,you have to call device_create (class,parent_dev,devno,device_name).
  • In order to call device_create you need to have a device class object: either use one of the existing classes,or create your own with create_class (THIS_MODULE,class_name)

I think this is for sysfs only.

>那么,新界面是否尝试改变失败的东西,
因此建议继续使用device_create吗?
>如果建议使用cdev,我该如何创建sysfs条目?
>我从未完全理解拥有设备类的好处,是
有一个点,如果是这样,我该如何实现它
CDEV?

最佳答案
cdev是内核的char设备表示.一般的想法是将cdev与一组file_operations相关联.这些file_operations在设备节点上执行,通常存在于/ dev下. cdev_init()用于将cdev与一组file_operations关联/链接.最后,在设备上调用cdev_add()使其生效,这样用户就可以访问它们.

现在,虽然这样做了,但这并不意味着为您创建了设备节点.这是通过使用mknod实用程序手动完成的(如LDD3中所述).通常,驱动程序应该创建设备节点.这是使用device_create()函数实现的.设备节点通常与类相关联.因此,我们需要首先创建一个类(使用class_create()),然后使用该类创建设备节点.

让我通过一个例子解释一下.仅考虑init函数(此处避免错误处理以保持清晰度):

struct class *my_class;
struct cdev my_cdev[N_MINORS];    
dev_t dev_num;

static int __init my_init(void)
{
    int i;
    dev_t curr_dev;

    /* Request the kernel for N_MINOR devices */
    alloc_chrdev_region(&dev_num,N_MINORS,"my_driver");

    /* Create a class : appears at /sys/class */
    my_class = class_create(THIS_MODULE,"my_driver_class");

    /* Initialize and create each of the device(cdev) */
    for (i = 0; i < N_MINORS; i++) {

        /* Associate the cdev with a set of file_operations */
        cdev_init(&my_cdev[i],&fops);

        /* Build up the current device number. To be used further */
        curr_dev = MKDEV(MAJOR(dev_num),MINOR(dev_num) + i);

        /* Create a device node for this device. Look,the class is
         * being used here. The same class is associated with N_MINOR
         * devices. Once the function returns,device nodes will be
         * created as /dev/my_dev0,/dev/my_dev1,... You can also view
         * the devices under /sys/class/my_driver_class.
         */
        device_create(my_class,NULL,curr_dev,"my_dev%d",i);

        /* Now make the device live for the users to access */
        cdev_add(&my_cdev[i],1); 
    }

    return 0;
}

现在,逐一回答你的问题:

那么,新界面是否试图改变失败的东西,因此建议继续使用device_create?
这不是一个新的界面.这可以说是一种扩展,通常用于创建设备节点.它还为我们提供了创建sysfs属性的优势,它为访问内核资源提供了非常灵活的方法.函数device_create()返回一个指向struct device的指针,它在内核中具有非常强大的意义.看看LDD3中关于“Linux设备模型”的章节.

如果建议使用cdev,我该如何创建sysfs条目?
cdev和sysfs条目彼此独立.即使没有cdev,您也可以创建sysfs条目.再看一下LDD3中关于“Linux设备模型”的章节.您还可以查看此示例代码以创建sysfs条目:http://lxr.free-electrons.com/source/samples/kobject/kobject-example.c

我从来没有完全理解拥有一个设备类的好处,是否有一个点,我如何用cdev实现它?
我希望上面的代码回答这个问题.

通常,您可能不会在驱动程序中使用cdev. cdev是一个非常低级别的表示.使用cdev可以为设备类型构建许多强大的框架,例如input,tty,ALSA,IIO等.所有这些框架都是基于cdev构建的.所以,你可能不会直接使用cdev.相反,您可以注册这些框架并以更有效的方式访问您的设备.注册这些框架还可以为您创建设备节点和sysfs条目.

希望这有帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


查找全部容器的日志文件 $ sudo find /var/lib/docker/containers -name *.log 查看日志位置 $ docker inspect --format=&#39;{{.LogPath}}&#39; &lt;container_name&gt; 实时查询内容 $
Linux日志文件中列属性的详细解析
在Linux系统中没有duf命令,如何有效地管理磁盘空间?
深入探讨EncryptPad在Linux操作系统中的功能和优势
原理和应用场景:Linux中ttyload工具的工作原理和实际用途
深度解析SELinux的三种策略类型
评估Linux系统性能的ttyload工具使用效果
分享在Linux系统中检测SSH版本的方法
介绍Linux平台上的数据加密工具EncryptPad
在Linux系统中,如何查看和诊断块设备信息?
在Linux环境下如何查看块设备信息?
探索Linux操作系统下的数据加密工具EncryptPad
学会在Linux系统中查看硬盘信息
分析SELinux:原理与实践
掌握SELinux策略类别
技巧:有效解读和管理Linux日志文件
查看Linux系统中的所有用户
了解Linux系统中各种不同类型的日志文件
深入理解Linux PS命令
方法:在Linux操作系统中查看用户