自动在/dev/下创建设备文件

在modprobe或者insmod后,如果不自动创建设备文件,需要mknod手动创建设备文件,然后应用程序才能工作,

我们可以在安装了模块后,自动在/dev下创建设备文件

 

在设备中添加用于创建设备文件的class和每个即将在/dev下创建的设备struct device

如下:

struct mem_dev                                    
{                                                       
  char *data;                     
  unsigned long size;
  struct class *dev_class;   //class结构指针,用来保存即将要创建的设备结构名,用于自动在/dev下创建设备文件,再为每个设备调用device_create创建对应的设备
  struct device *device1;
  struct device *device2;
  //两个即将在、/dev  下创建的设备名
  wait_queue_head_t my_read_queue; //在设备描述结构中添加读取等待队列,等待队列是属于设备的
};

 

然后再模块初始化函数中添加下面代码,首先创建使用class_create来创建class,然后每次调用device_create来创建设备文件

在init_module中添加下代码:

 

struct mem_dev *mem_dev p; 设备

static int init_module()

{

    ......

     mem_devp->dev_class=class_create(THIS_MODULE,"memdev");  //为每个驱动创建class,要依据向内核注册的设备名称来创建class,然后再调用device_create来创建设备文件
     if(IS_ERR(mem_devp->dev_class))//检测class创建是否成功
    {
         printk(KERN_INFO"dev_class create error!/n");
         goto class_err;
  }
       mem_devp->device1=device_create(mem_devp->dev_class,NULL,MKDEV   (mem_major,0),NULL,"memdev_select1");  //创建的设备名称是memdev_select1,第三个参数是设备号,主设备号是mem_major,次设备号是0
        mem_devp->device2=device_create(mem_devp->dev_class,NULL,MKDEV(mem_major,1),NULL,"memdev_select2");  //创建的设备名称是memdev_select2,主设备号是mem_major,次设备号是1

    ......

  

  class_err:

    kfree(mem_devp);

}

 

在卸载模块时候,要把/dev中的设备文件同时卸载掉

static void memdev_exit(void)
{
 //卸载模块时候也要同事把/dev/下的设备名卸载掉
      device_unregister(mem_devp->device1);
      device_unregister(mem_devp->device2);
  //卸载掉dev中对应的设备文件
      class_destroy(mem_devp->dev_class);   //卸载设备队对应的class

 

      cdev_del(&cdev);   /*注销设备*/
      kfree(mem_devp);     /*释放设备结构体内存*/
      unregister_chrdev_region(MKDEV(mem_major, 0), 2); /*释放设备号*/
}

设备驱动程序在`/dev`目录下创建设备文件节点,可以使用`unlink()`函数删除。具体的做法是,在驱动程序的`module_exit()`函数中调用`unlink()`函数,删除设备节点对应的设备文件。例如: ```c #include <linux/module.h> #include <linux/fs.h> #include <linux/device.h> static dev_t dev_num; // 设备号 static struct class *dev_class; // 设备类 static struct device *dev; // 设备对象 static int __init my_driver_init(void) { // 分配设备号 if (alloc_chrdev_region(&dev_num, 0, 1, "my_driver") < 0) { printk(KERN_ERR "Failed to allocate device number\n"); return -1; } // 创建设备dev_class = class_create(THIS_MODULE, "my_driver_class"); if (IS_ERR(dev_class)) { unregister_chrdev_region(dev_num, 1); printk(KERN_ERR "Failed to create device class\n"); return -1; } // 创建设备对象 dev = device_create(dev_class, NULL, dev_num, NULL, "my_device"); if (IS_ERR(dev)) { class_destroy(dev_class); unregister_chrdev_region(dev_num, 1); printk(KERN_ERR "Failed to create device object\n"); return -1; } // 其他初始化操作... return 0; } static void __exit my_driver_exit(void) { // 其他清理操作... // 删除设备对象 device_destroy(dev_class, dev_num); // 删除设备class_destroy(dev_class); // 释放设备号 unregister_chrdev_region(dev_num, 1); // 删除设备文件 unlink("/dev/my_device"); } module_init(my_driver_init); module_exit(my_driver_exit); ``` 在驱动程序的`module_exit()`函数中,先调用`device_destroy()`函数和`class_destroy()`函数,释放设备对象和设备类,然后调用`unregister_chrdev_region()`函数,释放设备号。最后调用`unlink()`函数,删除设备文件。需要注意的是,删除设备文件需要具有相应的权限,否则会返回错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值