啓動階段初始化控制檯流程分析,函數
start_kernel console_init(); -->tty_ldisc_begin(); /* Setup the default TTY line discipline. */ -->(void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY); /*static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS]的第N_TTY項指向&tty_ldisc_N_TTY*/ -->ldiscs[N_TTY]= &tty_ldisc_N_TTY; -->調用_con_initcall_start~_con_initcall_end代碼段間的全部initcall_t函數
這裏主要分析如何執行initcall_t函數,spa
看看_con_initcall_start~_con_initcall_end間定義了哪些函數,code
__con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .;
.con_initcall.init屬性的函數在該代碼段中,blog
#define console_initcall(fn) \ static initcall_t __initcall_##fn \ __used __section(.con_initcall.init) = fn
console_initcall宏定義的函數在該代碼段中,看看這些宏定義在哪裏使用了ip
/*in drivers/serial/samaung.h*/ console_initcall(s3c_serial_console_init)
在分析s3c_serial_console_init函數在哪裏定義ci
/*in drivers/serial/samsung.h*/ #define s3c24xx_console_init(__drv, __inf) \ static int __init s3c_serial_console_init(void) \ { \ return s3c24xx_serial_initconsole(__drv, __inf); \ }
上述宏在下面的代碼中使用。it
/*in drivers/serial/s3c6400.c*/ s3c24xx_console_init(&s3c6400_serial_drv, &s3c6400_uart_inf);
以上找到一個initcall_t函數定義以下:io
static int __init s3c_serial_console_init(void) { return s3c24xx_serial_initconsole(&s3c6400_serial_drv, &s3c6400_uart_inf); }