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

时间:2012-01-02 04:03:45

标签: linux-kernel linux-device-driver

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

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

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

加载内核模块时,如何使设备显示在/dev中?我尝试了注册设备的较旧版本(register_chrdev)和较新版本(cdev_init & cdev_add),但没有一个可以正常工作。

谢谢,
米尔

6 个答案:

答案 0 :(得分:4)

  • 包含头文件 linux / device.h linux / kdev_t.h

  • static struct class c_dev;

  • static struct 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/

链接

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

  

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

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

如果可以以编程方式实现,我会告诉您。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

有两种方法可以在/dev中创建设备文件

  • 使用mknod手动创建设备文件
    $ mknod -m <permission> <name> <device_type> <major> <minor>
    这里
    名称是设备驱动程序的名称,
    device_type 是设备的类型(b->块设备,c-> char设备),
    主要和次要是设备编号,
    权限是可选的,您可以在创建后使用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>

答案 5 :(得分:0)

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

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

sudo chmod 777 / dev / devicename

完成!!!