ENTRY 와 ENDPROC
커널 Assembly 코드를 분석하다보면 ENTRY 와 ENDPROC 매크로가 아주 많이 사용된다는 것을 알 수 있다.
ENTRY 는 아래와 같이 정의되어 있다.
.globl directive 통해 name label 을 외부에서도 볼 수 있도록 한 것이다.
#ifndef ENTRY #define ENTRY(name) \ .globl name; \ ALIGN; \ name: #endif
위와 같이 정의한 후 아래와 같이 사용하면 __secondary_switched 라는 label 을 파일 외부에서도 사용할 수 있다.
즉, 아래와 같이 해당 label 이 Assembly 코드로 구현이 되어 있다고 하더라도, C 코드 내에서 __secondary_switched 를 호출하여 사용할 수 있다.
ENTRY(__secondary_switched) ldr sp, [r7, #4] @ get secondary_data.stack mov fp, #0 b secondary_start_kernel ENDPROC(__secondary_switched)
위의 코드를 보면 마지막에 ENDPROC 이라는 매크로를 사용하고 있다.
#ifndef ENDPROC #define ENDPROC(name) \ .type name, @function; \ END(name) #endif
ENDPROC 매크로는 .type directive 를 통해 name label 이 함수의 구현이라는 것을 말해준다.
따라서, 위쪽의 코드처럼 __secondary_switched label 을 외부에서 호출할 수 있는 함수로 만들려면, 첫부분에 ENTRY 를 넣고 끝부분에 ENDPROC 매크로를 사용하면 된다.
이제 __secondary_switched 함수는 외부의 C 코드내에서도 호출될 수 있게 된다.