Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

493
557
422263


[부록 A] GCC 지시어: container_of() 함수 부록

커널 코드에서 container_of는 많이 활용하는 매크로입니다. container_of() 매크로 함수는 다음과 같은 기능을 제공합니다.

    구조체 필드 주소로 구조체 시작 주소를 계산해준다.

container_of란 매크로를 쉽게 표현하면 다음과 같습니다.

    구조체 시작 주소 = container_of(입력주소, 구조체, 해당 구조체 필드)

다음 예제 코드를 함께 보면서 container_of 매크로를 어떻게 활용하는지 살펴보겠습니다.

https://elixir.bootlin.com/linux/v4.19.30/source/kernel/workqueue.c 
01 static struct workqueue_struct *dev_to_wq(struct device *dev)
02 {
03 struct wq_device *wq_dev = container_of(dev, struct wq_device, dev);
04
05 return wq_dev->wq;
06 }

03 번째 줄을 보면 container_of를 써서 struct wq_barrier *barr 로컬 변수에 어떤 값을 대입합니다.

container_of(dev, struct wq_device, dev)는 코드는 다음과 같이 해석할 수 있습니다.

     dev: 입력주소
     struct wq_device: 구조체
     dev: struct wq_device에 위치한 필드

위 container_of 매크로를 쓰면 struct wq_device 구조체 주소를 반환합니다.

"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


[부록 A] GCC 지시어
   * inline    
   * noinline    
   * __noreturn   
   * unused   
[부록 B] 리눅스 커널 실력을 키우는 방법
[부록 C] 리눅스 커널 프로젝트에 기여하기  
C.1 리눅스 커널 오픈소스 프로젝트 소개 
   * 용어  
C.2 설정 방법 
C.3 패치 코드를 작성한 후 이메일로 보내기  
C.5 리눅스 커널 오픈소스 프로젝트로 얻는 지식 


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


 

핑백

덧글

댓글 입력 영역