hyojeonglee / osfall2019

Undergraduate Operating Systems course (2019 fall)
17 stars 8 forks source link

list_entry 함수 질문 #10

Open yoona3316 opened 5 years ago

yoona3316 commented 5 years ago

list_entry() 헷갈려서 질문드립니다. list_entry(ptr, type, member)의 리턴값이 해당 type struct의 첫번째를 가리키는 포인터가 맞나요? 또 member값에는 ptr의 멤버명?이 들어가야 되는 건가요?

hayunjong83 commented 5 years ago

안녕하세요. 질문하신 부분은 커널의 container_of ( ) 매크로를 살펴보시면, 파악하실 수 있을 것 같습니다. 결과적으로 말씀드리자면 질문하신 모든 내용이 맞습니다. container_of( )는 해당 type struct에서 member 까지의 offset을 이용해서, member의 p 주소로부터 type struct의 시작을 가리키는 포인터를 반환합니다. 따라서 list_entry( ) 또한 동일한 방식으로 이해하시면 좋을 것 같습니다.

간단하게만 Help Document의 내용으로 예시를 들어보면, struct student s; struct list_head p; s = list_entry(p, struct student, list); 정도로 생각해보시면 될 것 같습니다.

include/linux/list.h에 자세한 설명이 나와있으니 직접 한번 찾아보시면 좋을 것 같습니다. 또 이런 부분에 대해 잘 정리된 블로그가 있어서 함께 링크 남깁니다. https://bbingju.wordpress.com/2013/08/25/linux-kernel-list-h/ 감사합니다.

hyojeonglee commented 5 years ago

덧붙여서, task struct list의 첫번째 task를 가리키는 포인터 변수는 따로 정의되어있으니 찾아보시길 바랍니다.