Linux启动流程中console_init分析

描述

console_init

分析

Linux 启动函数 start_kernel 会调用 console_init 函数。

linux4.14/kernel/printk/printk.c

Linux

linux4.14/drivers/tty/n_tty.c

Linux

我们可以看到,console_init 主要做了两件事情:

1、n_tty_init 主要调用 tty_register_ldisc(N_TTY,
&n_tty_ops) 注册 tty 线路规程。

2、

call = __con_initcall_start;
 while (call < __con_initcall_end) {
  (*call)();
  call++;
 }

这里主要是调用 __con_initcall_start 到 __con_initcall_end
之间的函数。

__con_initcall_start 和 __con_initcall_end 定义在:

linux4.14/include/asm-generic/vmlinux.lds.h

Linux

中间包含了 .con_initcall.init 段:

linux4.14/include/linux/init.h

Linux

我们通过 console_init 声明的驱动模块,就会出现在这个段中,被调用。普通我们声明的驱动模块都是使用
module_init,如果我们写的是串口驱动,可以使用console_init 声明。

如果要看具体中间有什么函数,可以查看编译 Linux 内核的输出 System.map 文件,这个文件记载了从头到尾
Linux 干了什么,具体的地址存储了什么东西。

System.map 文件默认在编译后的 Linux 内核根目录下, 当然我们也可以修改到其他目录。

Linux

这里会有三列:地址,区,函数名字。

如果后面我们使用 console_init(serial_5685_xxxx)去声明我们的驱动,那么这个
serial_5685_xxxx 就会出现在 __con_initcall_start 和 __con_initcall_end 之间,就会被调用。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分