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);    
}

 

转载于:https://www.cnblogs.com/yangjiguang/p/8641630.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值