/*
* the macro container_of is included in <include/linux/kernel.h>
* prototype:
* #define container_of(ptr,type,member) ({ \
* const typeof(((type *)0)->member) *__mptr = (ptr); \
* (type *)((char *)__mptr - offsetof(type,member));})
__mptr 就是成员的地址值
offsetof(type,member) 结构体首地址(起始地址)到成员的偏移值
成员的地址值 - 成员的偏移值 = 结构体的首地址值
为什么?很简单
结构体的内存结构是从开始地址往后加的
比如结构体的起始地址设为X
成员a的首地址是X+a(其实a=0,结构体的第一个成员)
成员b的首地址是X+a+b
成员c的首地址是X+a+b+c
那现在已知成员b的首地址,求结构体的首地址
首地址 X = (X+a+b) - (a+b)
*
* cast a member of a structure out to the containing structure.
*/