zoukankan      html  css  js  c++  java
  • 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);    
    }
  • 相关阅读:
    2018CodeM复赛
    poj3683
    bzoj3991
    bzoj2809
    bzoj1001
    bzoj1412
    计蒜之道2018复赛
    HDU2255
    bzoj1010
    bzoj2006
  • 原文地址:https://www.cnblogs.com/yangjiguang/p/8641630.html
Copyright © 2011-2022 走看看