[Q] container_of

akfgoakfgo의 이미지

커널 2.6.x를 분석중에,

container_of이라는 매크로를 자주 만나느데...

참 특이한 놈이 더군요...

예를 들어서,

struct type
{
char ttt;
int * member;
}

int * ptr;

aaa = container_of(ptr, type, member)

이렇게 하면, aaa의 값은 ptr의 1byte 위를 포인팅하게 됩니다.

그런데 이런 방식으로하면, aaa는 메모리 확당없이 엑세스하게 되면 만약에 ptr위쪽을 다른 변수가 사용하고 있다면 문제가 발생하지 않나요 ??

^^ 역시 커널은 너무 난해해요.~~~

aqwerf의 이미지

container_of 구조체는 멤버의 pointer를 이용하여 구조체의 시작 주소를 찾는 함수 입니다.

예를 들면 모 이런 식이겠죠..

typedef struct tagX { 
   int x; 
   int y; 
 
   struct xxx node;
}   X;

...

func(struct xxx *n)
{
   X* p = container_of(n, X, node);
   ...
}

처럼 멤버중의 하나인 node의 주소를 알고 있을때 이를 포함한 구조체의 시작 pointer를 구하는 함수 입니다.

akfgoakfgo의 이미지

답변감사합니다.

allmue의 이미지

감사합니다. 저도 이걸 보고 좀 더 명확하게 알게 되었습니다.....^^

_______
항상 겸손하게,
배움의 자세로 임하자.

maro1234의 이미지

저도 코드를 보면서 한참을 고민했는데,
이제 명확해 졌습니다.

iygg777의 이미지

커널 소스 보다가 궁금했는데 이걸보고 이제야 이해가 됩니다.