Linuxカーネル解析

945 ワード

今日は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タイプの変数があると見なされると、1人のメンバーを取ってこのメンバーのアドレスを取るのは、この構造体のこのメンバーの絶対アドレスであり、構造体はアドレスが0の場所にあるため、このメンバー'member'のこの構造体における相対的な位置もこの値である.そして、この「member」の絶対アドレス、すなわちパラメータ「ptr」からその相対位置を減算すると、「member」が存在する構造、すなわちパラメータ「type」の真の絶対アドレスが得られる.