【问题标题】:How to create a device in /dev automatically upon loading of the kernel module for a device driver?如何在加载设备驱动程序的内核模块后自动在 /dev 中创建设备?
【发布时间】:2012-01-02 04:03:44
【问题描述】:

我正在尝试开发 Linux 设备驱动程序,作为我的第一次尝试,我正在尝试开发具有以下文件选项的 char 设备驱动程序,

struct file_operations fops{  
.open=open_fun,  
.release=release_fun,  
.write=write_fun,  
.read=read_fun,  
};  

当我使用insmod 加载驱动程序时,我看到/proc/devices 列出了字符设备下的驱动程序,但我在/dev 中找不到它。谷歌搜索建议使用mknod/dev 中创建一个设备并将其与驱动程序的主要和次要相关联。但是,即使以超级用户身份尝试这样做也会导致“权限被拒绝”错误。

在加载内核模块时,我应该怎么做才能使设备出现在/dev 中?我尝试了旧版本 (register_chrdev) 和新版本 (cdev_init & cdev_add) 来注册设备,但它们都不起作用。

谢谢,
米尔

【问题讨论】:

标签: linux-kernel linux-device-driver


【解决方案1】:
  • 包括头文件linux/device.hlinux/kdev_t.h

  • 静态结构类 c_dev;

  • 静态结构 dev_t dev;

在驱动程序的 __init 函数中添加以下 API

  • cl = class_create(THIS_MODULE,"x");

其中 x - 加载驱动程序时在 /sys/class/ 中显示的名称。

  • 使用 device_create() 内核 api 和 device_create(cl, NULL, dev, NULL, "d");

其中 d - 要在 /dev 下创建的设备文件。

其中 dev 是在使用 alloc_chrdev_region API 为驱动程序动态分配主设备号期间初始化的第一个设备号的变量

更多参考请点击链接http://opensourceforu.com/2011/04/character-device-files-creation-operations/

【讨论】:

    【解决方案2】:

    您可能需要create some udev rules 告诉系统您需要它创建哪些设备节点。

    【讨论】:

      【解决方案3】:

      通过在控制台运行以下命令创建节点后,我可以在/dev 中看到条目。

      sudo mknod -m 0666 /dev/msio c 22 0

      用户不是root,所以我不得不使用sudo。我的条目名称是msio,一个字符设备,主要和次要编号分别为22、0。

      我会告诉你这是否可以通过编程方式实现。

      【讨论】:

      • 是的,可以通过编程方式创建设备节点。您可以为此使用class_create()device_create。 @duskwuff 提到的 Udev 系统将负责其余的工作。
      • @Eugene 谢谢。这很有帮助。谢谢大家。
      • 根据kernel.org/doc/Documentation/admin-guide/devices.txt字符设备,主设备号为22,次设备号0为Digiboard串口卡,第一个端口。
      【解决方案4】:

      CONFIG_DEVTMPFS 非常好,如果你可以在你的发行版中使用它。您可以在启动时让内核自动挂载(CONFIG_DEVTMPFS_MOUNT)或手动挂载(mount -t devtmpfs none /dev)。

      【讨论】:

        【解决方案5】:

        /dev中创建设备文件有两种方式

        • 使用mknod手动创建设备文件
          $ mknod -m <permission> <name> <device_type> <major> <minor>
          这里
          name是设备驱动的名字,
          device_type是设备的类型(b->块设备,c->字符设备),
          ma​​jor & minor 是设备编号,
          permission 是可选的,您可以在创建后更改它,使用chmod
        • 使用 .
          进行动态创建
        dev_t dev=0;
        static struct class *devicefileClass;
        deviceFileClass=class_create(THIS_MODULE,"device_name");
        device_create( deviceFileClass , NULL , dev ,"device_name")
        


        注意 class_create , device_create 函数调用应该在您的 __init 函数中。 并包含<linux/device.h>,<linux/kdev_t>

        【讨论】:

          【解决方案6】:

          首先你必须使用: sudo mknod /dev/devicename c 81 0

          它在 /dev 中创建设备文件,但您必须授予它读/写权限。这样做,

          sudo chmod 777 /dev/设备名

          完成!!!

          【讨论】:

            猜你喜欢
            • 2017-10-06
            • 2017-12-13
            • 1970-01-01
            • 1970-01-01
            • 2017-02-14
            • 2013-07-27
            • 2012-08-06
            • 2017-03-02
            相关资源
            最近更新 更多