label 과 SYMBOL_NAME 매크로...질문입니다.

hwandori의 이미지

어셈블리어를 잘몰라서일까요..개념을 잘못잡고 있는거 같아 질문드립니다.

커널소스의 arch/i386/kernel/head.S 에 보면

.globl SYMBOL_NAME(idt)
.globl SYMBOL_NAME(gdt)
                                                                                
    ALIGN
    .word 0
idt_descr:
    .word IDT_ENTRIES*8-1       # idt contains 256 entries
SYMBOL_NAME(idt):
    .long SYMBOL_NAME(idt_table)

그리고 include/asm/desc.h를 보면

extern struct desc_struct *idt, *gdt;

struct Xgt_desc_struct {
    unsigned short size;
    unsigned long address __attribute__((packed));
};
                                                                                                                              
#define idt_descr (*(struct Xgt_desc_struct *)((char *)&idt - 2))

이런코드가 있습니다.

질문은 어셈블리어에서 Label은 Location counter의 주소가 아닌가요?
그럼
idt_descr:
.word IDT_ENTRIES*8-1 # idt contains 256 entries
SYMBOL_NAME(idt):
.long SYMBOL_NAME(idt_table)

에서 idt자체가 idt_table의 주소를 가지고 있는 곳의 위치카운터이기때문에
extern struct desc_struct *idt
이 부분이 extern struct desc_struct **idt 이런식으로 되야할것 같은데
이해가 잘 안갑니다.

또한 SYMBOL_NAME은
include/linux/linkage.h에

#define SYMBOL_NAME(X) X

이렇게 되어있고 gcc -E 옵션으로 프리프로세싱해보니 SYMBOL_NAME
매크로를 안한것과 같은 결과 소스가 나오는데 왜 하는것인지 궁금합니다.

기초가 중요하다는 사실을 여실히 느끼고 있는 중입니다. :)

--------------
프로그래밍QA에 잘못올렸다가 옮겨왔어요..^^