文档章节

揭开linux内核中container_of的神秘面纱

shezjl
 shezjl
发布于 2015/05/04 09:22
字数 588
阅读 6
收藏 0

揭开linux内核中container_of的神秘面纱

作者:程姚根,华清远见嵌入式学院讲师。

在linux 内核中有一个大名鼎鼎的宏container_of(),这个宏是用来干嘛的呢?我们先来看看它在内核中是怎样定义的。

呵呵,乍一看不知道是什么东东。

我们先来分析一下container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。看一个例子:

Struct test
        {
                int i;
                int j;
                char k;
        };
        Struct test temp;

现在呢如果我想通过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了解非常多的牛人,还有很长一段路。

本文转载自:http://www.embedu.org/Column/Column433.htm

shezjl
粉丝 10
博文 123
码字总数 38143
作品 0
成都
程序员
私信 提问
揭开tomcat神秘的面纱之启动脚本

在启动tomcat的过程中,在linux下,我们会使用脚本,在windows下开发的过程中一般会使用脚本。 本菜鸟在mac下启动如下: 启动之后,看进程 简单来看,脚本就是执行了一个命令,简单来说,和我...

一滴水的坚持
2018/11/04
0
0
深圳 Docker Meetup 活动

活动图文回顾:http://www.oschina.net/question/1765084_167189 深圳的 Meetup 活动定在 8 月 30 日的下午 目前已经确定的演讲者和内容如下: 主持人:Docker 中文社区创办人 @genedna (马全...

红薯
2014/08/04
11.1K
67
深圳 Docker Meetup 活动

活动图文回顾:http://www.oschina.net/question/1765084_167189 深圳的 Meetup 活动定在 8 月 30 日的下午 目前已经确定的演讲者和内容如下: 主持人:Docker 中文社区创办人 @genedna (马全...

红薯
2014/08/04
77
0
揭开tomcat神秘的面纱之bootstrap加载

在上文揭开tomcat神秘的面纱之bootstrap初始化中,本菜鸟分析了bootstrap最终会经过初始化,加载,启动三个步骤。接着来分析加载过程。 加载过程如下: 在加载过程中,实质是利用反射,调用的...

一滴水的坚持
2018/11/05
0
0
Opera在2009美国CES上发布最新SDK

1月7日,全球知名浏览器开发商挪威Opera软件公司在2009年美国电子展揭开了Opera SDK 9.7的神秘面纱.2008年,Opera投入了大量的资源开发Opera SDK 9.7,并与合作伙伴紧密合作,以加速浏览器在各种...

红薯
2009/01/08
135
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
6
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
8
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
11
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部