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变量的地址
可以结合下图观看:
最新文章
- IIS发布问题汇总
- 【Swift学习】Swift编程之旅---ARC(二十)
- underscore 笔记
- 高度30px,宽度自适应,点线在文字中间
- PHP MYSQLI中事务处理
- JAVA之装饰者模式
- 如何使用CSS Sprites技术进行图片合并
- ScriptManager需要用到的JS
- Swift - 炫酷放射弹出按钮菜单(改造自AwesomeMenu)
- 警惕Dictionary和SortedDictionary的顺序陷阱
- Golang版protobuf编译
- C++ 最简单的日志类
- Linux安装Tomcat8
- python 通用装饰器,带有参数的装饰器,
- mysql操作命令梳理(5)-执行sql语句查询即mysql状态说明
- 攻击者利用的Windows命令、横向渗透工具分析结果列表
- Coredata 单表简单使用
- bzoj千题计划249:bzoj5100: [POI2018]Plan metra
- Js数组里剔除指定的元素(不是指定的位置)
- 如何减少block的嵌套层次?