2008年7月2日 星期三

linux kernel 裡的 container_of()

這個巨集能 根據某 member 指標 來找其所屬的 structure的指標.

定義在 include/linux/kernel.h , 裡面的註解如下:

/**
* container_of - cast a member of a structure out to the containing structure
*
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member)
(
{
const typeof( ( (type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );
}
)

看來是利用 member 的位置直接減去其與 type 的 offset 來找出包含其 member 的結構的指標.
(個人的解讀, 有錯誤請高手指導)

可以參考高手 jserv 的blog:
http://blog.linux.org.tw/~jserv/archives/001399.html

1 則留言:

jserv 提到...

O'Reilly 出版《美麗程式》(Beautiful Code 的中譯本) 一書的第 16 章、由 Linux Kernel hacker -- Greg Kroah-Hartman 執筆的〈Linux 核心驅動程式模型:一起運作的益處〉,有探討 container_of() macro,並提及其實務應用,值得參考