Linux kernel 如何在为设备驱动程序加载内核模块时在/dev中自动创建设备?

Linux kernel 如何在为设备驱动程序加载内核模块时在/dev中自动创建设备?,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在尝试开发Linux设备驱动程序,作为我的第一次尝试,我正在尝试开发一个具有以下文件选项的char设备驱动程序 struct file_operations fops{ .open=open_fun, .release=release_fun, .write=write_fun, .read=read_fun, }; 当我使用insmod加载驱动程序时,我看到/proc/devices在char devices下列出了驱动程序,但在/dev中找不到它。谷歌搜索建议使

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

struct file_operations fops{  
.open=open_fun,  
.release=release_fun,  
.write=write_fun,  
.read=read_fun,  
};  
当我使用
insmod
加载驱动程序时,我看到
/proc/devices
在char devices下列出了驱动程序,但在
/dev
中找不到它。谷歌搜索建议使用
mknod
/dev
中创建一个设备,并将其与驾驶员的大调和小调关联。但是,即使以超级用户身份执行,尝试这样做也会导致“权限被拒绝”错误

加载内核模块时,我应该如何使设备显示在
/dev
中?我尝试了旧版本(
register\u chrdev
)和新版本(
cdev\u init&cdev\u add
)来注册设备,但都不起作用

谢谢,

Mir

您可能必须告诉系统您需要创建哪些设备节点。

您可能必须告诉系统您需要创建哪些设备节点。

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

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

用户不是root用户,所以我必须使用sudo。我的输入名是
msio
,一种字符设备,主次号分别为22和0


我会让您知道这是否可以通过编程实现。

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

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

用户不是root用户,所以我必须使用sudo。我的输入名是
msio
,一种字符设备,主次号分别为22和0


我会让你知道这是否可以通过编程实现。

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

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

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

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

sudo chmod 777/dev/devicename

完成

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

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

sudo chmod 777/dev/devicename

完成

  • 包括头文件linux/device.hlinux/kdev_t.h

  • 静态结构类c_dev

  • 静态结构开发
在驱动程序的初始化功能中添加以下API的内部功能

  • cl=创建类(该模块为“x”)
其中x—加载驱动程序时在/sys/class/内显示的名称

  • 将device_create()内核api与device_create一起使用(cl,NULL,dev,NULL,“d”)
其中d-要在/dev下创建的设备文件

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

如需进一步参考,请浏览链接
  • 包括头文件linux/device.hlinux/kdev_t.h

  • 静态结构类c_dev

  • 静态结构开发 在驱动程序的初始化功能中添加以下API的内部功能

    • cl=创建类(该模块为“x”)
    其中x—加载驱动程序时在/sys/class/内显示的名称

    • 将device_create()内核api与device_create一起使用(cl,NULL,dev,NULL,“d”)
    其中d-要在/dev下创建的设备文件

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


    如需进一步参考,请浏览链接在
    /dev

    • 使用
      mknod
      手动创建设备文件
      $mknod-m

      这里
      name是设备驱动程序的名称,
      device\u type是设备的类型(b->block devices,c->char devices),
      主要和次要是设备编号,
      权限是可选的。您可以在创建后使用
      chmod
      对其进行更改
    • 使用动态创建。

    注意class\u create,device\u create函数调用应该在
    \u init
    函数中。
    中,有两种方法可以在
    /dev

    中创建设备文件

    • 使用
      mknod
      手动创建设备文件
      $mknod-m

      这里
      name是设备驱动程序的名称,
      device\u type是设备的类型(b->block devices,c->char devices),
      主要和次要是设备编号,
      权限是可选的。您可以在创建后使用
      chmod
      对其进行更改
    • 使用动态创建。

    注意class\u create,device\u create函数调用应该在
    \u init
    函数中。
    在lude

    另请参见:可能的重复请参见:可能的重复是,可以通过编程方式创建设备节点。您可以使用
    class\u create()
    device\u createdev_t dev=0;
    static struct class *devicefileClass;
    deviceFileClass=class_create(THIS_MODULE,"device_name");
    device_create( deviceFileClass , NULL , dev ,"device_name")