!!smp_on_up 의 의미

smp_setup_processor_id 함수내에서 is_smp 함수내에 아래와 같은 코드가 있습니다.

static inline bool is_smp(void) 
{ 
#ifndef CONFIG_SMP 
    return false; 
#elif defined(CONFIG_SMP_ON_UP) 
    extern unsigned int smp_on_up; 
    return !!smp_on_up; 
#else 
    return true; 
#endif 
}

위에서 smp_on_up 라는 global 변수를 extern 으로 선언했는데, 이 변수는 arm/kernel/head.S 에 다음과 같이 구현되어 있습니다. 즉, smp 환경이냐 up 환경이냐에 따라 1 또는 0 값을 data section 에 넣어주고 있습니다.
물론 위의 코드에서처럼 extern 으로 외부에서 사용할 수 있도록 .globl 로 선언했네요.

  .pushsection .data
  .globl smp_on_up 
smp_on_up: 
  ALT_SMP(.long 1) 
  ALT_UP(.long 0) 
  .popsection

여기에 저장된 smp_on_up 값을 !! 한다는 것은 무슨 의미일까요 ?
! 는 not 연산이라는 것은 아실텐데, 그러면 smp_on_up 에 만약 100 이라는 값이 들어가 있다면 ! 100 => 0 이 됩니다.
숫자가 0 이 아니면 무조건 true 이니까 이를 not 하면 false (0) 이겠지요.
이를 또한번 부정했으니 이번에는 true(1)이 되겠네요.
즉, smp_on_up 자리에 0 이 아닌 어떤 값이 들어가 있더라도 이를 두번의 부정을 통해서 결국은 bool 형 값인 1 로 리턴하기 위한 것입니다. (물론 원래 0 값이 들어가 있었다면 그대로 0 의 결과가 나올테구요.)
그래서, is_smp 함수의 리턴 형을 보시면 bool 타입이라는 것을 확인할 수 있습니다.
결국 head.S 에서 저장해두었던 smp_on_up 값을 검사하여 smp 환경인지(true) 아닌지(false)를 검사하는게 is_smp 함수의 역할인 것입니다.

 

You may also like...