Re: rs_init()

QnA 2009. 7. 26. 02:17
> I have been looking at the linux serial driver initialization routine
> rs_init() in drivers/char/serial.c. This routine gets invoked as a
> part of a do-while loop in do_initcalls() in init/main.c.The code
> looks something like this:
> 
> static void __init do_initcalls(void)
> {
>         initcall_t *call;
> 
>         call = &__initcall_start;
>         do {
>                 (*call)();
>                 call++;
>         } while (call < &__initcall_end);
> 
>         /* Make sure there is no pending stuff from the initcall sequence */
>         flush_scheduled_tasks();
> }
> 
> I would like to know where exactly is rs_init() being inserted into
> the chain of routines that gets invoked in the do-while loop.

Welcome to linker magic!

The __initcall directive expands to something like __attribute__
((unused,__section__ (".initcall.init"))), which will instruct the
compiler to but the function pointer in the .initcall.init ELF section
(see gcc info file for more information). The boundaries of this
section are __initcall_start and __initcall_end, also filled in by the
linker at link time.

So the rs_init() function pointer will be put *somewhere* into the
.initcall.init section. At boot, the function do_initcalls() will call
all function pointers in the section, so at a certain point rs_init()
will also be called through its function pointer in the .initcall.init
section.

'QnA' 카테고리의 다른 글

signal함수의 프로토타입은 왜 함수포인터로 되어 있을까요?  (0) 2009.07.28
cat /dev/null > a.txt 2>&1  (0) 2009.07.27
/dev/ttyS, "Input/output error"  (0) 2009.07.18
BTUART사용시 질문  (0) 2009.07.16
external memory interface  (0) 2009.07.16

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,