console_init()分析
启动阶段初始化控制台流程分析,
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函数,
看看_con_initcall_start~_con_initcall_end间定义了哪些函数,
__con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .;
.con_initcall.init属性的函数在该代码段中,
#define console_initcall(fn) \ static initcall_t __initcall_##fn \ __used __section(.con_initcall.init) = fn
console_initcall宏定义的函数在该代码段中,看看这些宏定义在哪里使用了
/*in drivers/serial/samaung.h*/ console_initcall(s3c_serial_console_init)
在分析s3c_serial_console_init函数在哪里定义
/*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); \ }
上述宏在下面的代码中使用。
/*in drivers/serial/s3c6400.c*/ s3c24xx_console_init(&s3c6400_serial_drv, &s3c6400_uart_inf);
以上找到一个initcall_t函数定义如下:
static int __init s3c_serial_console_init(void) { return s3c24xx_serial_initconsole(&s3c6400_serial_drv, &s3c6400_uart_inf); }