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函數,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);    
}
相關文章
相關標籤/搜索