下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linuxMISC驱动模型分析阅读led驱动程序的代码的时候,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数,这说明led设备是作为杂项设备出现在内核中的,在内核中,misc杂项设备驱动接口是对一些字符设备的简单封装,他们共享一个主设备号,有不同的次设备号,共享一个open调用,其他的操作函数在打开后运用linux驱动程序的方法重载进行装载。1.主要数据结构内核维护一个misc_list链表,misc设备在misc_register注册的时候链接到这个链表,在misc_deregister中解除链接。主要的设备结构就是miscdevice。定义如下:[plain]viewplaincopyprint?structmiscdevice{intminor;const char *name;const structfile_operations*fops;struct list_headlist;struct device *parent;struct device *this_device;const char *nodename;mode_t mode;};这个结构体是misc设备基本的结构体,在注册misc设备的时候必须要声明并初始化一个这样的结构体,但其中一般只需填充nameminorfops字段就可以了。下面就是led驱动程序中初始化miscdevice的代码:[plain]viewplaincopyprint?staticstructmiscdevicemisc={.minor=MISC_DYNAMIC_MINOR,.name=DEVICE_NAME,.fops=&dev_fops,};一般的时候在fops不用实现open方法,因为最初的方法misc_ops包含了open方法。其中minor如果填充MISC_DYNAMIC_MINOR,则是动态次设备号,次设备号由misc_register动态分配的。misc_init函数misc也是作为一个模块被加载到内核的,只不过是静态模块。这个函数是misc静态模块加载时的初始化函数。[plain]viewplaincopyprint?staticint__initmisc_init(void){interr;4.5.#ifdefCONFIG_PROC_FSproc_create("misc",0,NULL, &misc_proc_fops);#endifmisc_class=class_create(THIS_MODULE, "misc");//udev创建设备节点使用err=PTR_ERR(misc_class);if(IS_ERR(misc_class))gotofail_remove;14.15.err=-EIO;if(register_chrdev(MISC_MAJOR,"misc",&misc_fops))//注册一个字符设备gotofail_printk;misc_class->devnode=misc_devnode;return0;21.22.fail_printk:printk("unabletogetmajor%dformiscdevices\n",MISC_MAJOR);class_destroy(misc_class);fail_remove:remove_proc_entry("misc",NULL);returnerr;}可以看出,这个初始化函数,最主要的功能就是注册字符设备,所用的注册接口是2.4内核的register_chrdev。它注册了主设备号为MISC_MAJOR,次设备号为0-255的256个设备。并且创建了一个misc类。misc_register()函数misc_register()函数在misc.c中,最主要的功能是基于misc_class构造一个设备,将miscdevice结构挂载到misc_list列表上,并初始化与linux设备模型相关的结构,它的参数是miscdevice结构体。[plain]viewplaincopyprint?intmisc_register(structmiscdevice*misc){structmiscdevice *c;dev_tdev;interr=0;6.7.INIT_LIST_HEAD(&misc->list);//链表项使用时必须初始化9.10.mutex_lock(&misc_mtx);list_for_each_entry(c,&misc_list,list){if(c->minor==misc->minor){mutex_unlock(&misc_mtx);return-EBUSY;}}//遍历链表如果发现次设备号一样的,返回错误18.19.if(misc->minor==MISC_DYNAMIC_MINOR){//动态次设备号inti=DYNAMIC_MINORS;while(--i>=0)if((misc_minors[i>>3]&(1<<(i&7)))==0)break;if(i<0){
26.mutex_unlock(&misc_mtx)26.mutex_unlock(&misc_mtx)return-EBUSY;}misc->minor=i;}31.32.if(misc->minor<DYNAMIC_MINORS)misc_minors[misc->minor>>3]|=1<<(misc->minor&7);dev=MKDEV(MISC_MAJOR,misc->minor);36.37.misc->this_device=device_create(misc_class,misc->parent,dev,misc,"%s",misc->name);//udev创建设备节点使用,linux设备模型相关if(IS_ERR(misc->this_device)){err=PTR_ERR(misc->this_device);gotoout;TOC\o"1-5"\h\z}45.46./**Addittothefront,sothatlaterdevicescan"override"*earlierdefaults*/list_add(&misc->list,&misc_list);//添加至Umisc_list之中out:mutex_unlock(&misc_mtx);returnerr;}可以看出,这个函数首先遍历misc_list链表,查找所用的次设备号是否已经被注册,防止冲突。如果是动态次设备号则分配一个,然后调用MKDEV生成设备号,从这里可以看出所有的misc设备共享一个主设备号MISC_MAJOR,然后调用device_create,生成设备文件。最后加入到misc_list链表中。关于device_create,class_create作用: class_create函数在misc.c中的模块初始化中被调用,现在一起说一下。这两个函数看起来很陌生,没有在ldd3中发现过,看源代码的时候发现class_create会调用底层组件__class_regsiter()是说明它是注册一个类。而device_create是创建一个设备,他是创建设备的便捷实现调用了device_register函数。他们都提供给linux设备模型使用,从linux内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代。相比devfs,udev有很多优势。[plain]viewplaincopyprint?structclass*myclass=class_create(THIS_MODULE,“my_device_driver”);class_device_create(myclass,NULL,MKDEV(major_num,0),NULL,“my_device”);这样就创建了一个类和设备,模块被加载时,udevdaemon就会自动在/dev下创建my_device设备文件节点。这样就省去了自己创建设备文件的麻烦。这样也有助于动态设备的管理。4.总结杂项设备作为字符设备的封装,为字符设备提供的简单的编程接口
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年桐庐事业单位招聘考试模拟题及答案详解
- 2026年脲醛塑料项目安全调研评估报告
- 2026年青马工程考试模拟题及答案详解
- 企业信用报告-汇工(河北)机械集团有限公司
- 2026年商用车分析报告
- 2026年深圳公务员考试行政执法素质测试模拟题及答案详解
- 2026年航天地面卫星地面站操作员晋升模拟试题(含答案)
- 2026年下坡安全模拟题及答案详解
- 2026年初级会计职称考试会计实务点睛卷模拟试卷(含答案)
- 2026年人类挑战模拟题及答案详解
- 建设工程施工合同(企业厂房-办公室建造与装修版)
- 市场法评估案例
- 管道工基础知识培训课件
- 随机信号处理教学大纲
- T/JSSES 39-2024水体中抗生素环境风险评估技术指南
- (高清版)DG∕TJ 08-2289-2019 全方位高压喷射注浆技术标准
- 九年级数学上册23.6.1用坐标确定位置课件华东师大版
- (正式版)JTT 382-2024 内河运输船舶评价指标
- (高清版)DZT 0004-2015 重力调查技术规范(150 000)
- 灯谜文化智慧树知到期末考试答案2024年
- 家风家训家规中国传统美德礼仪孝传承文化中国风国学课件下载两篇
评论
0/150
提交评论