- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
以下是scull模块中的一个沿链表前行得到正确scull_set指针的函数,将在read和write方法中被调用: /*Follow the list*/ struct scull_qset *scull_follow(struct scull_dev *dev, int n) { struct scull_qset *qs = dev-data; /* Allocate first qset explicitly if need be */ if (! qs) { qs = dev-data = kmalloc(sizeof(struct scull_qset), GFP_KERNEL); if (qs == NULL) return NULL; /* Never mind */ memset(qs, 0, sizeof(struct scull_qset)); } /* Then follow the list */while (n--) { if (!qs-next) { qs-next = kmalloc(sizeof(struct scull_qset), GFP_KERNEL); if (qs-next == NULL) return NULL; /* Never mind */ memset(qs-next, 0, sizeof(struct scull_qset)); } qs = qs-next; continue; } return qs;} 这个函数的实质是: 如果已经存在这个scull_set,就返回这个scull_set的指针。 如果不存在这个scull_set,一边沿链表为scull_set分配空间一边沿链表前行,直到所需要的scull_set被分配到空间并初始化为止,就返回这个scull_set的指针。 5. open和release open提供给驱动程序以初始化的能力,为以后的操作作准备。应完成的工作如下: 1) 检查设备特定的错误(如设备未就绪或硬件问题); 2) 如果设备是首次打开,则对其进行初始化; 3) 如有必要,更新f_op指针; 4) 分配并填写置于filp-private_data里的数据结构。 根据scull的实际情况,他的open函数只要完成第四步(将初始化过的struct scull_dev dev的指针传递到filp-private_data里,以备后用)就好了,所以open函数很简单。但是其中用到了定义在linux/kernel.h中的container_of宏,源码如下: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)-member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 从源码可以看出,其作用就是: 通过指针ptr,获得包含ptr所指向数据(是member结构体)的type结构体的指针。即是用指针得到另外一个指针。 release方法提供释放内存,关闭设备的功能。应完成的工作如下: (1)释放由open分配的、保存在file-private_data中的所有内容; (2)在最后一次关闭操作时关闭设备。 由于前面定义了scull是一个全局且持久的内存区,所以他的release什么都不做。 6.read和write read和write方法的主要作用就是实现内核与用户空间之间的数据拷贝。因为Linux的内核空间和用户空间隔离的,所以要实现数据拷贝就必须使用在asm/uaccess.h中定义的: unsigned long copy_to_user(void __user *to, const void *from, unsigned long count); unsigned long copy_from_user(void *to, const void __user *from, unsigned long co
您可能关注的文档
- 2013-2014学年高中语文 专题一 让我们一起奔腾吧导学课件 苏教版必修1课件.ppt
- 2013 医学科研项目申请书的撰写课件.ppt
- 2013.6.13 特种设备质量管理体系讲稿-锅炉课件.ppt
- 2013【步步高】高考物理一轮复习配套课件第十二章 第5课时课件.ppt
- 2013年3月工伤培训课件课件.ppt
- 2013年辽宁丹东北国之春二期洋房及公寓户型建议_49p_前期策划课件.ppt
- 2014高考数学(文)二轮专题突破课件(浙江专版)第1部分 圆锥曲线中的定点、定值和最值问题课件.ppt
- 2014年春节安全注意事项课件.ppt
- 2014秋高中语文 第6课鸿门宴课件 新人教版必修1课件.ppt
- 2014一师一优课、一课一名师”活动启动大会(市教研室).ppt
最近下载
- 日立电梯UAX-Ⅱ图纸K3500429.pdf
- HP Prime快速入门手册.pdf VIP
- 汽车底盘系统检修(张振东)任务1 离合器踏板的检查与调整.ppt VIP
- 2025版北师大版数学二年级上册全册教学设计教案.pdf
- 汽车底盘系统检修(张振东)任务3 离合器分离轴承、压盘和从动盘的检修.ppt VIP
- 2023年人教版小升初语文模拟试卷含答案 .pdf VIP
- 慢性老年病患者日常用药误区及对策.doc VIP
- 人教版三年级上册数学全册教学设计(配2025年秋新版教材).docx
- 《人工环境工程学科奖学金2011预.doc VIP
- 初高中衔接课因式分解市公开课一等奖百校联赛获奖课件.pptx VIP
文档评论(0)