博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux内核分析

Posted on 2011-10-21 09:59  bug yang  阅读(189)  评论(0编辑  收藏  举报

今天遇到了一个函数,是Linux内核中的一个函数

list_entry(ptr,type,member); //意义为从一个结构的成员指针'ptr'找到其容器'type'的指针。

list_entry的宏定义:
#define list_entry(ptr, type, member) \ 
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 

 (type *)0是为了计算地址方便。意思是在0这个地址看做有一个虚拟的type类型的变量,那么取一个成员再取这个成员的地址,就是这个结构体 中这个成员的绝对地址,由于结构体在地址为0的地方,所以这个成员'member'在这个结构体中的相对位置也是这个值了。   然后再用这个'member'的绝对地址也就是参数'ptr'减去它的相对位置就得出了'member'所在结构也就是参数'type'的真正绝对地址。