임베디드 리눅스 시스템 콜 호출과정을 보다가 아래와 같은 부분에서 의문점이 있었습니다. 그 내용은 아래와 같습니다.

linux-2.6.21\arch\arm\kernel\entry-common.S 파일내에 121번째 줄에 보시면 다음과 같은 내용이 있습니다.


 .align 5
ENTRY(vector_swi)
        sub sp, sp, #S_FRAME_SIZE
         stmia sp, {r0 - r12}   @ Calling r0 - r12
         add r8, sp, #S_PC
         stmdb r8, {sp, lr}^   @ Calling sp, lr
         mrs r8, spsr   @ called from non-FIQ mode, so ok.
         str lr, [sp, #S_PC]   @ Save calling PC
         str r8, [sp, #S_PSR]  @ Save CPSR
         str r0, [sp, #S_OLD_R0]  @ Save OLD_R0
         zero_fp


linux-2.6.21\arch\arm\kernel\asm-offsets.c 파일내에 40번째 줄에 보시면 아래와 같은 정의가 있습니다.


#define DEFINE(sym, val)
        asm volatile("n->" #sym " %0 " #val : : "i" (val))



또한 같은 파일의 86번째 줄에 보시면,

  DEFINE(S_FRAME_SIZE,  sizeof(struct pt_regs));

이렇게 선언되어 있습니다.


그런데, 제가 질문드리는 사항은

#define DEFINE(sym, val)
        asm volatile("n->" #sym " %0 " #val : : "i" (val))


이부분이

실제 어셈블리어로 풀어쓰면 어떤 모양이 되는가 입니다.

제가 생각한 형태는 이와 같습니다.

asm volatile ("n->" #S_FRAME_SIZE " %0 " #sizeof(struct pt_regs) : : "i" (sizeof(struct pt_regs))

이구 이것을 다시 풀어쓰면

->#S_FRAME_SIZE  i(sizeof(struct pt_regs))  #sizeof(struct pt_regs)

라고 마지막 형태가 나오지 안을까 생각하고 있습니다.

이렇게 되는것이 맞는지 몰라 문의 드립니다. 혹시 아시는 분 있으시면 자세히 알려주시면 정말 감사하겠습니다.