list_entry 宏函数用于根据结构体中的成员寻找结构体的首地址。在2.6.33.20版本的kernel代码中定义在了include/linux/list.h中的334行。其函数原型为:
- #define list_entry(ptr, type, member) container_of(ptr, type, member)
而这个container_of宏函数定义在include/linux/kernel.h的698行,其函数原型为:
- #define container_of(ptr, type, member) ({ \
- const typeof(((type *)0)->member)*__mptr = (ptr); \
- (type *)((char *)__mptr - offsetof(type, member)); })
这其中包含的又一个重要的宏函数是offsetof (type, member);这个函数定义在include/linux/stddef.h中的第24行,其函数原型为:
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER
这段代码中可以看出offsetof(type, member));这句执行的意图是将0地址强制类型转换为TYPE型,并指向其结构体成员
MEMBER,之后对其取址,并转换成size_t类型。通过这样的操作就可依找到结构体成员MEMBER相对与该结构体首
地址的偏移量。
再向上在container_of ( ptr. type, member )函数中(type *)((char *)__mptr - offsetof(type, member));这句代码的执行可以看出是用当前成员地址减去当前成员相对于该结构体首地址的偏移量,通过这部操作就可以得到当前成员变量所在结构体的首地址。
typeof是gcc中的定义的,他的功能是获取其传入参数的类型。
阅读(606) | 评论(0) | 转发(0) |