完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在linux 内核中有一个大名鼎鼎的宏container_of(),这个宏是用来干嘛的呢?我们先来看看它在内核中是怎样定义的。 呵呵,乍一看不知道是什么东东。 我们先来分析一下container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。看一个例子: Struct test 现在呢如果我想通过temp.j的地址找到temp的首地址就可以使用container_of(&temp.j,struct test,j); 现在我们知道container_of()的作用就是通过一个结构变量中一个成员的地址找到这个结构体变量的首地址。 下面来看看比较复杂的内容: 我们用上面的struct test张展一下 Const typeof(((struct test *)0)->j) * __mptr = (&temp.j); 其中,typeof是GNU C对标准C的扩展,它的作用是根据变量获取变量的类型。因此,上述代码的作用是首先使用typeof获取结构体成员j的类型为int,然后顶一个int指针类型的临时变量__mptr,并将结构体变量中的成员的地址赋给临时变量__mptr。 (struct test *)((char *)__mptr - offsetof(struct test,j)); 接着我们来看一下offsetof(struct test,j),他在内核中如下定义 展开(size_t)&((struct test *)0)->j,这是什么东东? 一开始也不明白,这里要感谢曹老师老师的热心帮助,一语惊醒梦中人,呵呵,可以是这样理解。 其中size_t是整型,那么我们可以知道最终的结果是一个整形值,也就是j相对于0地址的偏移量。也许现在你会问,整出这么个玩意干嘛,下面看个列子: 程序运行结果: 发现没有如果把第二个值 减去最后一个值,就能得到第一个值。 在回首一下它: (struct test *)((char *)__mptr - offsetof(struct test,j)); 是不是可以获得结构体变量temp的首地址呀,是不是太精妙了呀,linux内核中随随便便一个宏就有如此精妙,呵呵,想想对linux了解非常多的牛人,还有很长一段路。 |
|
相关推荐
|
|
本帖最后由 晓白嵌入式 于 2016-11-13 09:17 编辑
更多linux驱动学习请加丁工QQ: 2848988085 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4914 浏览 0 评论
87442 浏览 0 评论
【高手问答】如何做到精通linux威廉希尔官方网站 ?资深工程师带你突破难点
4759 浏览 2 评论
3641 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2496 浏览 0 评论
2046浏览 3评论
1331浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1386浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1254浏览 0评论
1196浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-12 03:38 , Processed in 1.527007 second(s), Total 83, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号