arm嵌入式原理技术及应用ch-12课件.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

xiexie2012 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档