linux内核中宏container_of是干什么的?
Linux Kernel Version 4.14
1. container_of是干什么的?
已知一个结构体中某个成员的首指针,那么就可以通过宏container_of来获得此结构体的首指针
2 先看看container_of是如何定义的吧
#define container_of(ptr, type, member) \
(type *)((char *)(ptr) - (char *) &((type *))->member)
解析一下各参数:
ptr: 结构体成员的指针
type: 结构体的类型
member: 结构体成员的名字
2. 举一个例子
2.1 有两个结构体如下:
struct element1 {
struct element2 struct_element2;
int element3;
}
struct element2 {
int element4;
}
2.2 定义一个struct element1变量element
struct element1 element
2.3 已知结构体变量element中成员element3的地址为0x2d,通过结构体struct element1中的成员element3来获取结构体变量element的地址
container_of(element3_ptr,struct element1,element3)
2.4 拆开
(struct element1 *)((char *)(&element3) - (char *) &((struct element1 *)0)->element3)
从已知可得:
&element3=0x2d;
(char *)(&element3)=0x2d;
(struct element1 *)0=地址为0x0,指向的内容为一个struct element1结构体;
((struct element1 *)0)->element3=结构体中element3的内容;
&((struct element1 *)0)->element3=取结构体中element3的地址,这是偏移地址,为0x04;
(char *)&((struct element1 *)0)->element3=0x04;
最终:
((char *)(&element3) - (char *) &((struct element1 *)0)->element3)=0x2d - 0x04) = 0x29
(struct element1 *)0x29 = 0x29,0x29这个地址指向的是一个结构体struct element1,那么这就是element变量的地址
可以结合下图观看:
linux内核中宏container_of是干什么的?的更多相关文章
- linux内核第一宏 container_of
内核第一宏 list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针.现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处. 整理分析 ...
- linux内核中的subsys_initcall是干什么的?
注意:使用的内核源码版本为5.1.3 1. subsys_initcall长什么样子? 它其实是个宏定义,定义如下: #define subsys_initcall(fn) __define_ ...
- linux内核中宏likely和unlikely到底做了些什么?
1. 先看看它们长啥样吧!(它们有两种定义,第一种是使能了程序trace功能的宏定义,第二种是普通的宏定义,咱们分析普通宏定义吧) # define likely(x) __builtin_expec ...
- 嵌入式C语言自我修养 04:Linux 内核第一宏:container_of
4.1 typeof 关键字 ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数.GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型 ...
- (十)Linux内核中的常用宏container_of
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...
- Linux内核中的常用宏container_of
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...
- Linux内核中的常用宏container_of其实很简单【转】
转自:http://blog.csdn.net/npy_lp/article/details/7010752 开发平台:Ubuntu11.04 编 译器:gcc version 4.5.2 (Ubun ...
- 剖析linux内核中的宏---------container_of
#define container_of(ptr, type, member) ({ \ const typeof(((type *)0)->member) * __mptr = (ptr); ...
- Linux内核中的fastcall和asmlinkage宏
代码中看见:#define _fastcall 所以了解下fastcall -------------------------------------------------------------- ...
随机推荐
- laravel 前后端分离 token
由于自己开发的项目中用到了 JWT 技术,前端采用了 Vue.js 框架,后端采用了 CodeIgniter 框架,故作此文帮助使用相同技术栈的朋友们. 具体思路如下:把后端生成的 JWT token ...
- 将Web项目War包部署到Tomcat服务器基本步骤
参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识: 1.1 War包 War包一般是在进行Web ...
- 解决ConfigParser配置option的大小写问题
通常情况下,我们会这样解析配置文件: confiig = ConfigParser.ConfigParser() config.read('xxx.ini') #这个read表示对某个文件用读打开, ...
- Azure IoT 技术研究系列2-设备注册到Azure IoT Hub
上篇博文中,我们主要介绍了Azure IoT Hub的基本概念.架构.特性: Azure IoT 技术研究系列1-入门篇 本文中,我们继续深入研究,做一个起步示例程序:模拟设备注册到Azure IoT ...
- crm
CRM 开发 需求分析 存储所有的客户咨询信息 避免重复数据 客户的多次跟踪记录 客户来源.成单率分析 每个销售只能修改自己的客户信息 报名流程开发 班级管理 学员成绩,出勤管理 问卷调查 校区管理 ...
- [openjudge-搜索]哆啦A梦的时光机
题目描述 描述 哆啦A梦有一个神奇的道具:时光机.坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来. 有一天,大雄和他的伙伴们想穿越时空进行探险,可是时光机却出了一点故障,只能进行有限的时空穿 ...
- Spark学习之路 (二十三)SparkStreaming的官方文档
一.SparkCore.SparkSQL和SparkStreaming的类似之处 二.SparkStreaming的运行流程 2.1 图解说明 2.2 文字解说 1.我们在集群中的其中一台机器上提交我 ...
- py3中reduce
前因 因为 Guido 先生讨厌 reduce.(Because Guido hates it. ) 详细过程请翻阅原文:http://www.artima.com/forums/flat.jsp?f ...
- Spring源码阅读(五)
这一讲我们分析真正的bean实例创建方法——doCreateBean,源码分析如下 /** * Actually create the specified bean. Pre-creation pro ...
- Python+OpenCV图像处理(六)—— ROI与泛洪填充
一.ROI ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以方框.圆.椭圆.不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI. 代码如下 ...