약간의 실제 컨텍스트는 더 명확하다고 말합니다. 아래에서 빨간색-검정색 트리를 예로 사용 하십시오 container_of.
로 Documentation/rbtree.txt리눅스 커널 코드의 상태, 그것은 rb_node 아니라, 데이터 항목이 포함 아니에요
rbtree 트리의 데이터 노드는 struct rb_node 멤버를 포함하는 구조입니다.
struct vm_area_struct(파일에서 include/linux/mm_types.h:284)는 그러한 구조입니다.
같은 파일에 rb_entry다음과 같이 정의 된 매크로 가 있습니다.
#define rb_entry(ptr, type, member) container_of(ptr, type, member)
명확 rb_entry와 동일합니다 container_of.
에서 mm/mmap.c:299내부 함수 정의 browse_rb의 사용이있다 rb_entry:
static int browse_rb(struct mm_struct *mm)
{
struct rb_node *nd, *pn = NULL;
unsigned long prev = 0, pend = 0;
for (nd = rb_first(root); nd; nd = rb_next(nd)) {
struct vm_area_struct *vma;
vma = rb_entry(nd, struct vm_area_struct, vm_rb);
이제에서 명확합니다 container_of(ptr, type, member).
type 컨테이너 구조체입니다. struct vm_area_struct
member회원의 이름 type예, 여기 vm_rb유형이다 rb_node,
ptr여기 member에서 type인스턴스를 가리키는 포인터 rb_node *nd입니다.
무엇을 container_of할 것은,이 예에서와 같이,이다
obj.member(여기 obj.vm_rb)의 주소가 주어지면의 주소를 반환합니다 obj.
- 구조체는 연속 메모리 블록 이므로
obj.vm_rb마이너스
주소 offset between the struct and member는 컨테이너의 주소가됩니다.
include/linux/kernel.h:858 -- 의 정의 container_of
include/linux/rbtree.h:51 -- 의 정의 rb_entry
mm/mmap.c:299 -사용 rb_entry
include/linux/mm_types.h:284 - struct vm_area_struct
Documentation/rbtree.txt: -빨강-검정 나무의 문서화
include/linux/rbtree.h:36 -- 의 정의 struct rb_node
추신
위의 파일은 현재 개발 버전 4.13.0-rc7입니다.
file:k에서 k 번째 줄을 의미합니다 file.
rb_node있습니다.