首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

offsetof()和container_of()函数

在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀?...好吧,先上container_of函数原型: #define container_of(ptr, type, member) ({ \ const typeof...(三)总结: container_of(ptr, type,member)函数的实现包括两部分: 判断ptr 与 member 是否为同意类型 计算size大小,结构体的起始地址 = (type *)...((char *)ptr - size) (注:强转为该结构体指针) 现在我们知道container_of()的作用就是通过一个结构变量中一个成员的地址找到这个结构体变量的首地址。...container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。

27510
您找到你想要的搜索结果了吗?
是的
没有找到

container_of宏定义作用_宏内核

文章目录 回顾 问题具象化 上工具 offsetof 实例分析 container_of 实例解析 offsetof 原理 container_of 原理 参考 回顾 上一篇我们讲到内核链表和普通链表的区别...上工具 这时候,就用到了 linux 内核中提供的两个宏了 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of...container_of 宏用来在给定一个变量的结构体类型,和这个变量的某个成员的地址的条件下,计算出这个变量的地址。...我们已知 led 的一个成员变量的地址,即 led.link 的地址 我们的目的是通过 led.link 的地址求 led 的地址 struct led_dev *ptr = container_of...container_of 原理 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member

1.1K10

Linux内核宏container_of的深度剖析

/|wc -l 710 android7.1/kernel/drivers/input$ 使用grep -rn container_of ..../|wc -l统计了下kernel/drivers/input/目录下的container_of出现的次数,一共有710次使用。...2、container_of的作用 container_of的作用的通过结构体成员变量地址获取这个结构体的地址,假设你的名字叫李光明,你还有一个弟弟叫做XXX,警察叔叔发现你弟弟XXX干了一件坏事,但是警察叔叔不知道你弟弟的名字...3、如何使用container_of container_of需要传入三个参数,第一个参数是一个指针,第二个参数是结构体类型,第三个是对应第二个参数里面的结构体里面的成员。...剖析 看完上面的几个知识点,再来看container_of这个宏就显得非常清晰了。

70021

工作当中非常实用的Linux内核链表

前言: 在上期文章中,已经给大家分享过offsetof()和container_of两个宏函数,这两个宏函数在Linux内核链表里面有大量的应用,对于我们平时工作写代码有很大的帮助。...那就是: container_of(ptr, type, member) 没错就是它,在LDD3这本书中的第三章字符设备驱动,以及第十四章驱动设备模型中多次提到,所以我觉得这个宏应该是内核最经典的宏之一...(ptr, type, member) list.h中提供了list_entry宏来实现对应地址的转换,但最终还是调用了container_of宏,所以container_of宏的伟大之处不言而喻。...* */ #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member...把上面offsetof的宏定义代入container_of宏中,可得到下面定义: #define container_of(ptr, type, member) ({ \

88110

Linux 内核通用链表学习小结

head); pos = pos->next) //获取节点首地址(不是list_head地址,是数据层节点首地址) #define list_entry(ptr, type, member) \ container_of...(ptr, type, member) //container_of在Linux内核中是一个常用的宏,用于从包含在某个 //结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变 //量中某个成员的首地址进而获得整个结构体变量的首地址...#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (...接口,通过结构体变量某个成员的地址,反推结构体首地址,就像 __list_for_each 接口只返回 list_head 地址,所以我们要通过这个成员地址在去获取它本身的结构体首地址,底层实现方法 container_of

1.2K21
领券