약간의 실제 컨텍스트는 더 명확하다고 말합니다. 아래에서 빨간색-검정색 트리를 예로 사용 하십시오 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
있습니다.