Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

593
557
422264


[부록 A] GCC 지시어: inline 부록

함수 선언부에 키워드로 inline을 지정하면 GCC 컴파일러는 함수 심볼을 만들지 않습니다. 이런 유형의 함수를 인라인 함수라고 부릅니다.

인라인 함수에 대해 알아보기 앞서 인라인 함수를 지정하는 이유는 무엇인지 먼저 살펴볼까요?
커널 함수에서 어떤 함수를 호출하면 다음과 같은 동작을 수행합니다.

    1. 스택 프레임의 매개변수를 메모리에 저장 
    2. 함수 인자를 레지스터에 복사 
    3. 실행 흐름 변경 

물론 이 동작은 어셈블리 코드로 확인할 수 있습니다. 

그런데 만약 1초에 수십 번 이상 자주 호출되는 함수가 있다고 가정해보겠습니다. 함수에서 수행할 코드가 얼마 되지 않는데 위 동작을 반복하면 오버헤드라 볼 수 있습니다.
배보다 배꼽이 더 큰 상황입니다.

이해를 돕기 위해 예제 코드를 같이 볼까요? 

https://elixir.bootlin.com/linux/v4.19.30/source/kernel/time/timer.c 
static inline unsigned calc_index(unsigned expires, unsigned lvl)
{
expires = (expires + LVL_GRAN(lvl)) >> LVL_SHIFT(lvl);
return LVL_OFFS(lvl) + (expires & LVL_MASK);
}

calc_index() 함수의 구현부를 보니 '논리 연산을 수행'하는 2줄 구문 밖에 되지 않습니다. 그런데 calc_index() 함수는 커널 타이머를 처리할 때 매우 자주 호출됩니다.

     인라인으로 선언하기 좋은 함수입니다.
리눅스 커널 코드에서 inline 키워드로 선언된 함수를 다음과 같이 해석하면서 분석하면 좋겠습니다.

    GCC는 이 함수에 대한 심볼을 생성하지 않는다.
    자주 호출될 가능성이 높다.

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

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


 


핑백

덧글

댓글 입력 영역