Kernel Code Tip

inline assembly 에서 early clobber 의 역할

inline assembly 를 컴파일할 때 Gcc는 항상 모든 input 변수들이 다 사용된 후에 output 변수들이 쓰인다고 가정해서 input 변수와 output 변수를 같은 operand register 에 할당하기도 합니다. 즉, inline assembly 를 해독하여 assembly code 로...

매크로에서 # 와 ## 의 차이

매크로에서 # 와 ## 의 차이

# : stringification 기본적으로 컴파일러에서 처리하는 문자열들은 token으로 보는데, 이 token들을 string constant로 처리하고자 할 때 사용합니다. 즉, 아래 예제에서처럼 val 이라는 token 을 “val” 문자 자체로 사용하게게 됩니다. 사용 시 한 가지 주의할 점은, 이 경우 argument를...

typeof 를 사용하는 typecheck 매크로

typeof 를 사용하는 typecheck 매크로

#define typecheck(type,x) \ ({ type __dummy; \ typeof(x) __dummy2; \ (void)(&__dummy == &__dummy2); \ 1; \ }) 위의 코드는 어떤 역할을 할까요 ? 한 라인씩 해독을 해보죠. type __dummy; 인자로 전달받은 type 과 동일한 type...

__const__ 속성

__const__ 속성

커널에서 는 __attribute__((__const__))를 __attribute_const__ 로 define 해서 사용합니다. const 속성은 gcc 매뉴얼에 설명이 나와 있습니다. gnu gcc 온라인 매뉴얼 그리고, 아래의 url 을 참고해 보시면 또한 중요한 문구가 나옵니다. http://nshipster.com/__attribute__ pure and const are both attributes that invoke...

!!smp_on_up 의 의미

!!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 변수를...

__init 매크로의 __section(.init.text) __cold notrace 의 의미

__init 매크로의 __section(.init.text) __cold notrace 의 의미

init/main.c 의 start_kernel 함수를 보면 다음과 같이 선언되어 있습니다. asmlinkage void __init start_kernel(void) 위에서 __init 매크로는 한꺼번에 3 개의 속성을 함수에 부여하고 있는데요. 각각 무엇을 의미하는지 살펴보겠습니다. 가. __section(.init.text) __section 매크로는 속성 지정자인 __attribute__ 를...

asmlinkage

asmlinkage

이는 http://studyfoss.egloos.com/4951809 를 참고하면 충분한 설명이 될 것 같다. 어셈블리 코드에서 C 함수를 호출할 때 함수 인자의 전달을 스택을 이용하도록 해주는 속성지정 매크로이다. ARM 에서는 아무일도 하지 않고, x86 에서는 스택을 이용하여 인자를 전달하도록 속성을 지정해준다. x86...

ENTRY 와 ENDPROC

ENTRY 와 ENDPROC

커널 Assembly 코드를 분석하다보면 ENTRY 와 ENDPROC 매크로가 아주 많이 사용된다는 것을 알 수 있다. ENTRY 는 아래와 같이 정의되어 있다. .globl directive 통해 name label 을 외부에서도 볼 수 있도록 한 것이다. #ifndef ENTRY...