Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1484221
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

分类: LINUX

2014-12-01 15:19:48

对于杂项设备的理解:
1. 节省主设备号

不管主设备号是动态还是静态分配,普通字符设备都会消耗一个主设备号。当驱动提交到内核主线上时,需要申请一个专门的主设备号。
而内核分配10作为杂项设备的主设备号,当系统拥有多个杂项设备驱动时用子设备号来区分它们,主设备号仍为10。
2. 简单易用
使用普通字符设备驱动时,当导出操作接口给用户态时需要去注册字符驱动,创建字符设备class用以自动在/dev下生成设备节点。
而杂项驱动基本上只需要把基本信息通过struct miscdevice交给misc_register()去处理即可。


Misc驱动可以理解为特殊的字符设备驱动

点击(此处)折叠或打开

  1. static int __init misc_init(void)
  2. {
  3.     int err;

  4. #ifdef CONFIG_PROC_FS
  5.     proc_create("misc", 0, NULL, &misc_proc_fops);
  6. #endif
  7.     misc_class = class_create(THIS_MODULE, "misc");
  8.     err = PTR_ERR(misc_class);
  9.     if (IS_ERR(misc_class))
  10.         goto fail_remove;

  11.     err = -EIO;
  12.     if (register_chrdev(MISC_MAJOR/*10*/,"misc",&misc_fops))
  13.         goto fail_printk;
  14.     misc_class->devnode = misc_devnode;
  15.     return 0;

  16. fail_printk:
  17.     printk("unable to get major %d for misc devices\n", MISC_MAJOR);
  18.     class_destroy(misc_class);
  19. fail_remove:
  20.     remove_proc_entry("misc", NULL);
  21.     return err;
  22. }
如上所示,Misc初始化函数misc_init()使用MISC_MAJOR(主设备号为10),调用register_chrdev()去注册了一个字符设备驱动。同时创建了misc_class,
以自动在/dev下自动生成一个主设备号为10的字符设备。


内核实现:
内核维护一个misc_list链表,misc设备在misc_register注册的时候链接到这个链表,在misc_deregister中解除链接。主要的设备结构就是miscdevice

点击(此处)折叠或打开

  1. struct miscdevice {
  2.     int minor;                            // 杂项设备的此设备号(如果设置为MISC_DYNAMIC_MINOR,表示系统自动分配未使用的minor)
  3.     const char *name;                     // 设备名称                        
  4.     const struct file_operations *fops;   // 驱动函数的操作集
  5.     struct list_head list;                // 杂项设备链表,将所有杂项设备链接在一起
  6.     struct device *parent;                // 
  7.     struct device *this_device;           // 
  8.     const char *nodename;                 // /dev下面创建的设备节点
  9.     mode_t mode;                          // 设备访问权限
  10. };
未完待续。。。。

阅读(1104) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~