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 코드내에서도 호출될 수 있게 된다.

You may also like...