kernel 구조체 중 list_head를 보면..
글쓴이: lantelt / 작성시간: 일, 2003/09/07 - 9:12오후
list_head 구조체는 포인트 두개로 이루어져 있습니다.
struct list_head {
struct list_head *next, *prev;
};
대부분 모든 자료형들이 저 리스트 구조체를 이용해서 링크드 리스트를 형성하는데요.
어떻게 저 리스트 구조체가 다른 구조체의 주소 역할을 할 수 있는 것입니까?
예를 들면
struct page {
unsigned long flags;
atomic_t count;
struct list_head list;
struct address_space *mapping;
unsigned long index;
struct list_head lru;
union {
struct pte_chain *chain;
pte_addr_t direct;
} pte;
unsigned long private;
#if defined(WANT_PAGE_VIRTUAL)
void *virtual;
#endif /* CONFIG_HIGMEM || WANT_PAGE_VIRTUAL */
};page 구조체에서도 저 리스트 구조체를 이용해서 서로 연결되고 있는데요.
그게 어떻게 가능한건가요?
Forums:


include/linux/list.h 에 보면#define list_
include/linux/list.h 에 보면
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
이걸 사용해서 하지요. 즉,
struct page *p;
라고 해 놓고 이 페이지에 연결된 다음 페이지는
list_entry(p->list.next, struct page*, list);
가 됩니다.
p->list.next 포인터는 struct page 안의 struct list를 가리키고 있죠.
그러므로 struct page로의 포인터는 거기에서 struct list의 struct page안에서의 오프셋 (4 byte)만큼을 뺀 것이 되겠네요.
그림 잘 그려서 해 보면 될껍니다~
댓글 달기