免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3854 | 回复: 4
打印 上一主题 下一主题

[驱动] container_of 的使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-07 08:51 |只看该作者 |倒序浏览
最近一直在学习驱动,编写自己的测试程序。但是每天都会遇到问题,谢谢 chinaunix提供了这样好的一个交流平台,谢谢 版主和那些热心助人的嵌入式高手。
       昨天自己写了一个小驱动,用上了container_of 虽然我自己这个函数怎么用 但是我去不明白这个函数的原理。
      在我的驱动中自己定义了一个字符设备总描述体
      struct my_dev{
      struct cdev  cdev;
      .........
     .......................
    };
  使用时候 :
   struct my_dev *dev;
   dev=container_of(inode->i_cdev,struct scull_dev,cdev);
   我现在的问题是:
问题1): inode->i_cdev  怎么和我定义的结构体扯上关系了?难道说 inode->i_cdev确实指向了我定义结构体中cdev?如果是,那是什么时候初始化的呢?
问题2): 如果我在open函数中初始化了 my_dev结构体部分成员,那么我在write函数中用container_of获取的结构体指针 是我已经初始化的这个对象,还是
另外的一个新的没有初始化的对象指针?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
2 [报告]
发表于 2011-07-07 08:56 |只看该作者
本帖最后由 T-Bagwell 于 2011-07-07 08:58 编辑

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  5. #define container_of(ptr, type, member) ({ \
  6.      const typeof( ((type *)0)->member ) *__mptr = (ptr); \
  7.      (type *)( (char *)__mptr - offsetof(type,member) );})

  8. struct example{
  9. unsigned char ea;
  10. int eb;
  11. int ec;
  12. };

  13. int main()
  14. {
  15.         struct example *example=malloc(sizeof(struct example));
  16.         memset(example,0,sizeof(struct example));
  17.         printf("%p\n",example);
  18.         printf("%p\n",&(example->ec));
  19.         printf("%p\n",(void *)offsetof(struct example,ec));
  20.         printf("%p\n",container_of(&(example->ec),struct example,ec));
  21.         free(example);
  22.         example=NULL;
  23.         return 0;
  24. }
复制代码
转自我的blog
主要是因为typeof这个功能,member的偏移,计算整体大小,然后就知道struct地址了,这个地址就是结构体的入口了

论坛徽章:
0
3 [报告]
发表于 2011-07-07 11:38 |只看该作者
LZ你也在看LDD3啊,握个爪。
inode用来描述文件。
我觉得应该是在scull_setup_cdev中就创建了这个设备的inode,open只是告诉系统我要使用这个设备。最后应该会调用一个mknod完成inode和cdev的关联。纯属猜测。
对于问题2.肯定是已初始化的那个。看楼上TB前辈的代码就明白了。

论坛徽章:
0
4 [报告]
发表于 2011-07-07 22:32 |只看该作者
谢谢 前辈们的热心帮助

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
5 [报告]
发表于 2011-07-08 13:39 |只看该作者
这个百度一下,一大片吧。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP