大家都知道list_entry時kernel裏面經常遇到的一個函數,其定義爲:
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \---------------------(1)
(type *)( (char *)__mptr - offsetof(type,member) );})-------------------------(2)
看到這幾行代碼,說實話網上講了很多,但是很難理解,什麼指針,什麼typeof,什麼offsetof,看不懂,先說意思:
list_entry表示在找出ptr指向的鏈表節點所在的type類型的結構體首地址,member時type類型結構體成員。
再說參數:
ptr:表示和member同爲相同類型的鏈表,此處ptr表示指向鏈表中的一個節點
type:表示需要尋找的結構體類型。
member:表示type類型的結構體裏面的成員。
這裏有一個通俗的理解:
(1)實際上就是__mptr = (ptr),以0爲type結構體的首地址,將參數ptr的指針值賦值給當前結構體的member,(前面的typeof( ((type *)0)->member )不用理睬,合法性檢查而已,這條語句的目的所在)。
(2)用當前節點地址ptr值剪掉member離type結構體首地址的距離,最後就得到了ptr節點指向的節點的type類型結構體的首地址。
示意圖如下:
獲取ptr指向的節點的struct type結構體的首地址