devtty,devconsole,devvc0的初始化

xiaoxiao2021-02-27  143

在drivers/char/mem.c中的chr_dev_init->tty_init int __init tty_init(void) {     cdev_init(&tty_cdev, &tty_fops);     if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||         register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)         panic("Couldn't register /dev/tty driver\n");     device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");     cdev_init(&console_cdev, &console_fops);     if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||         register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)         panic("Couldn't register /dev/console driver\n");     consdev = device_create_with_groups(tty_class, NULL,                         MKDEV(TTYAUX_MAJOR, 1), NULL,                         cons_dev_groups, "console");     if (IS_ERR(consdev))         consdev = NULL; #ifdef CONFIG_VT     vty_init(&console_fops); #endif     return 0; } 可以很清楚的看到在tty_init 中定义了/dev/tty和/dev/console 这两个字符设备,如果有定义CONFIG_VT的话,还会调用vty_init, int __init vty_init(const struct file_operations *console_fops) {     cdev_init(&vc0_cdev, console_fops);     if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||         register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)         panic("Couldn't register /dev/tty0 driver\n");     tty0dev = device_create_with_groups(tty_class, NULL,                         MKDEV(TTY_MAJOR, 0), NULL,                         vt_dev_groups, "tty0"); } 在vty_init 中定义了/dev/vc/0 这个字符设备,注意这里的tty0dev,其代表的是/dev/tty0 可见tty0dev只是通过MKDEV(TTY_MAJOR, 0)建立的节点,并不是devfs设备. 其中/dev/tty对应的是tty_fops,/dev/console和/dev/vc/0 对应的是console_fops。

总结一下:/dev/console 是系统控制台,其指向当前激活的tty。tty 属于进程控制台,通过ps -ax 可以看到当前进程用的是哪个tty

只有/dev/console 指向当前活动的tty,而tty0 在图形显示的情况下指向活动的窗口

转载请注明原文地址: https://www.6miu.com/read-13721.html

最新回复(0)