console ,tty ,和keyboard调用关系
1。console的过程描述 例如pmon下其内核命令 g console=ttyS0,115200 root=/dev/sda1 init=/bin/sh rw 对console的过程讨论主要是讨论console=ttyS0 如何影响选取哪种console? 1)在kernel/printk.c中的 __setup("console=", console_setup); 给出了用于解释console=ttyS0的函数console_setup console_setup调用的__add_preferred_console确定了ttyS0在console_cmdline[]的索引号selected_console 2)其次,各种外围的驱动调用kernel/printk.c中的register_console来注册其console,register_console有如下语句: 1196 1198 1199 1200 在i的循环中当regist的console名字与console_cmdline[selected_console]的名字相同时console->flags |= CON_CONSDEV 如下语句: 1223 1224 1225 1226 1227 1228 1229 1230 1231 可知,在console_drivers链表中,只有与console_cmdline[selected_console]的名字相同console放在链表首位。 由此可得console=ttyS0实际上是保证console_drivers链表的首个console是名称为ttyS的console 2。tty_driver的选择 对tty_driver的说明主要通过如何根据不同的tty选择相应的tty_driver表示 1)tty_driver的注册实例 通过一个具体的tty_driver的注册例子来表示 在drivers/char/vt.c的vty_init函数中 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 其中tty_set_operations(console_driver, &con_ops);是设置tty_driver使用的一系列操作,con_ops是tty_operations类型,tty_register_driver(console_driver)即是注册tty_driver 2)tty_driver注册的作用,drivers/char/tty_io.c tty_register_driver中如下语句: 3534 3535 3536 即是将各种tty_driver串联成一个链表tty_drivers 3)如何根据文件类型选择相应的tty_driver, 对于tty设备文件操作,调用的是tty_fops操作结构体(在drivers/char/tty_io.c中)的操作,其声明如下: |