console_init()分析

Posted 天地有大美而不言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);    
}

 

以上是关于console_init()分析的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

CPNtools协议建模安全分析---实例变迁标记

优化 C# 代码片段、ObservableCollection 和 AddRange

前端防扒代码片段