container_of 的的的原理
来源:互联网 发布:陈建年 知乎 编辑:程序博客网 时间:2024/04/26 01:29
源地址:http://www.embedu.org/Column/Column433.htm
另外一篇,同样精彩,http://blog.chinaunix.net/uid-20543672-id-3205315.html
揭开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了解非常多的牛人,还有很长一段路。
上一篇:进程之间不能传递指针。。
下一篇:svn强制写日志和可以修改历史日志(svn钩子的应用)
- 现代简约风格选哪种类型的沙发...
- 健身器材管理制度
- 《电冰箱基础知识》系列培训一...
- 人体工学椅
- 适合自己的床垫才是最好的...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- 如何提高中文域名网站权重呢?...
- windows有发展前景吗
- 谁能够帮我解决LINUX 2.6 10...
- 现在的博客积分不会更新了吗?...
- shell怎么读取网页内容...
- container_of 的的的原理
- container_of与offsetof的原理
- 自己写的 container_of & offset_of 的原理
- 一个简单程序演示container_of的原理
- 对container_of的理解
- 对container_of的理解
- uclinux内核的container_of
- linux container_of 的用法
- container_of()宏的解析
- container_of的理解
- container_of的实现分析
- container_of的理解
- 神奇的container_of
- container_of的理解
- linux container_of的试验
- linux container_of 的用法
- container_of的使用
- 神奇的宏 container_of()
- const char*, char const*, char*const的区别
- .net学习框架
- 时钟树解析
- 关于C里面 数字0,字符'0',字符串"0",字符串结尾标志符'\0'
- 进程之间不能传递指针。。
- container_of 的的的原理
- svn强制写日志和可以修改历史日志(svn钩子的应用)
- [iOS越狱开发]安装command line tools for Xcodew
- 用Golden Gate实现mysql到mysql的实时复制
- R语言 Error in match.names(clabs, names(xi)) :
- sql语句查询结果合并union all用法
- vmlinuz的命名规则-名字起源
- Java中equals和==的区别
- android 添加 iconv 支持