container_of在內核函數中經常使用,該函數的功能是根據一個結構體成員的指針,返回這個成員指針所在的結構體的首指針。舉例說明如下:
struct std
{
int a;
short b;
char c;
int d;
};
Stuct std test;
Int *p = &test.d;
container_of(p, Stuct std,d) //這個函數將返回test變量的首地址,定義這個函數的目的是方便指針在驅動模塊內部傳遞。
該函數實現宏定義如下:
Offsetof宏定義的作用是計算一個結構體成員距離結構體首部的編譯,由於結構體成員在內存中存放的位置滿足線性關係,地址從低到高一次增長,利用這個特性可以巧妙計算偏移。
將0地址強制轉換成我們需要的類型的指針,然後直接返回結構體成員的指針就是偏移,因爲首地址是指向0地址的。
Typeof是c語言關鍵字,是獲取該變量的類型作爲類型定義,根據傳入的成員指針減去該成員在結構體中所佔的偏移就是該結構體的首地址。