内核container_of(ptr,type,member) 解析
来源:互联网 发布:网络工程项目管理 编辑:程序博客网 时间:2024/06/05 19:21
container_of(ptr,type,member) 用于根据已知的结构体里面成员member指针ptr(就是地址) 返回该成员所在的结构体的指针(就是地址),
其中:
member是结构体类型type的成员
ptr是当前已知的member成员的指针
计算方法:
用ptr减去member在结构体type中的偏移=当前ptr指向的成员所在的结构体的起始指针
在内核中的实现:
- kernel.h
- #define container_of(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
假如从基地址0开始存放type类型的结构体,那么((TYPE *)0)->MEMBER的值就是member在结构体type中的偏移量
(2)用member的指针地址减去(1)中计算的偏移量
这里,一定要注意一件事:ptr是member的指针地址,但其类型未知,
所以,在进行计算之前,首先要将ptr类型强制转换为member在结构体type中的类型。
((type *)0)->member ) 指向结构体type中的member,
typedef(((type *)0)->member )) 求得member的类型,
const typeof( ((type *)0)->member ) *__mptr 将__mptr定义为type中的member类型的一个指针
const typeof( ((type *)0)->member ) *__mptr = ptr; 将ptr的值赋给__mptr,
至此,我们得到的__mptr就是一个类型为type中的member类型的一个指针了。
再结合第一步,用该指针减去member在type中的偏移,就得到了member所在的type类型结构体的指针了。
- 内核container_of(ptr,type,member) 解析
- 内核container_of(ptr,type,member) 解析
- linux内核中的container_of(ptr, type, member)
- container_of(ptr, type, member)宏定义解析
- container_of(ptr, type, member)
- container_of(ptr, type, member)
- container_of(ptr, type, member)
- container_of(ptr, type, member)
- container_of(ptr, type, member)
- container_of(ptr, type, member)
- container_of(ptr, type, member)
- Linux内核中的常用宏--container_of(container_of(ptr, type, member)
- 浅析container_of(ptr, type, member)
- 浅析container_of(ptr, type, member)
- 浅析container_of(ptr, type, member)
- 浅析container_of(ptr, type, member)
- 浅析container_of(ptr, type, member)
- 浅析container_of(ptr, type, member)
- 在iOS 8中使用UIAlertController
- iOS8 播放系统声音、提醒声音…
- IOS --- OC与Swift混编
- 运算符优先级 (JavaScript)
- php模仿arsort方法
- 内核container_of(ptr,type,member) 解析
- [Sencha ExtJS & Touch] Ext类结构中的requires和uses
- BZOJ 2456: mode【思维】
- 虚幻4引擎Gear VR开发入门(下)
- 机械码补码,阶码的表示与范围思考总结
- Git使用详细教程
- iOS 多线程
- CNN卷积神经网络新想法
- Myeclipse各版本下载地址