分析
Linux 启动函数 start_kernel 会调用 console_init 函数。
linux4.14/kernel/printk/printk.c
linux4.14/drivers/tty/n_tty.c
我们可以看到,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
中间包含了 .con_initcall.init 段:
linux4.14/include/linux/init.h
我们通过 console_init 声明的驱动模块,就会出现在这个段中,被调用。普通我们声明的驱动模块都是使用
module_init,如果我们写的是串口驱动,可以使用console_init 声明。
如果要看具体中间有什么函数,可以查看编译 Linux 内核的输出 System.map 文件,这个文件记载了从头到尾
Linux 干了什么,具体的地址存储了什么东西。
System.map 文件默认在编译后的 Linux 内核根目录下, 当然我们也可以修改到其他目录。
这里会有三列:地址,区,函数名字。
如果后面我们使用 console_init(serial_5685_xxxx)去声明我们的驱动,那么这个
serial_5685_xxxx 就会出现在 __con_initcall_start 和 __con_initcall_end 之间,就会被调用。
全部0条评论
快来发表一下你的评论吧 !