linux tricks 之 container_of.】的更多相关文章

转载:http://blog.chinaunix.net/uid-20608849-id-3027972.html 由于内核中定义了很多复杂的数据结构,而它们的实例中的成员在作为函数参数传递的时,函数中可能需要对它的包含者中的其他的兄弟成员进行处理,这就需要只根据成员地址就可以获取整个结构体变量的地址的操作.container_of提供了这样的操作: include/linux/kernel.h /** * container_of - cast a member of a structure…
首先来个简单版本 /* given a pointer @ptr to the field @member embedded into type (usually * struct) @type, return pointer to the embedding instance of @type. */ #define container_of(ptr, type, member) \ ((type *)(()->member))) 作用:主要用于结构体,给定一个指针ptr指向一个结构体type…
上一节拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)我们在分析Linux内核链表的时候注意到内核在求解结构体偏移的时候巧妙的使用了container_of宏定义,今天我们来详细剖析下内核到底是如何求解结构体成员变量的地址的. @ 目录 结构体在内存中是如何存储的 container_of宏 typeof (((type *)0)->member) const typeof(((type )0)->member)__mptr = (ptr); offsetof(type,…
------------------------------------------- 本文系作者原创, 欢迎大家转载! 转载请注明出处:netwalker.blog.chinaunix.net -------------------------------------------   尽管在大多数时候只需关心代码运行的正确性,但是很多时候需要在编译期间就发现这些潜在的致命错误.内核提供了两个有力的宏定义: include/linux/kernel.h /* Force a compilatio…
------------------------------------------- 本文系作者原创, 欢迎大家转载! 转载请注明出处:netwalker.blog.chinaunix.net ------------------------------------------- 1.FIELD_SIZEOF获取成员大小   FIELD_SIZEOF用来获取成员大小.它需要两个参数,第一个指定结构体的类型,第二个则指明成员的名字.   include/linux/kernel.h #defin…
------------------------------------------- 本文系作者原创, 欢迎大家转载! 转载请注明出处:netwalker.blog.chinaunix.net ------------------------------------------- 通过位图提供的两种状态可以在非常节约内存的情况下表示开关变量,并且同类这类变量可以紧凑而高效的统一进行处理.有很多内核子系统都需要位图的支持,但是不同的情况又需要不同的位图个数,比如SMP系统上的CPU位图cpuma…
转载:http://blog.chinaunix.net/uid-20608849-id-3027953.html   内核为了保持最大的兼容性和代码灵活性,不可能直接对某个数据类型定义它的大小范围.但是很多时候又要用到这些最大值最小值或者该数据类型可以表示的数据范围,比如初始化一个值为最大/小值,或者检验数据是否位于某个类型的范围内.   include/linux/kernel.h #define USHORT_MAX ((u16)(~0U)) #define SHORT_MAX ((s16…
VA函数(variable argument function),参数个数可变函数,又称可变参数函数.C/C++编程中,系统提供给编程人员的va函数很少.*printf()/*scanf()系列函数,用于输入输出时格式化字符串:exec*()系列函数,用于在程序中执行外部文件(main(int argc, char* argv[]算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函数,至少在原理这一级上有很多相似之处).由于参数个数的不确…
typeof是gcc的扩展功能,比较简单,是用来取得参数类型,具体可参考gcc官网的解释. https://gcc.gnu.org/onlinedocs/gcc/Typeof.html ------------------------------------------- 本文系作者原创, 欢迎大家转载! 转载请注明出处:netwalker.blog.chinaunix.net ------------------------------------------- 由于Linux代码采用Gcc编…
它的作用显而易见,那就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针. typedef unsigned int __kernel_size_t; typedef __kernel_size_t size_t; #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) /** * container_of - cast a member of a structure out to the cont…