linux 终端设备:系统终端设备

在tty core代码tty_io.c中,有如下几行代码

/*
 * Ok, now we can initialize the rest of the tty devices and can count
 * on memory allocations, interrupts etc..
 */
static 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");
    device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL,
                  "console");

#ifdef CONFIG_VT
    vty_init(&console_fops);
#endif
    return 0;
}


这里创建了几个system级 终端设备,他们并不是真实的物理设备,每个都会创建这几个设备节点

/dev/tty

设备号(5, 0)是设备/dev/tty,表示当前进程的“控制终端”,并没有代表任何物理意义上的终端,访问设备(5,0)就是访问当前进程的”控制终端“。每一个进程通常都有一个“控制终端”。如果没有,当打开第一个终端设备时,就把这个终端设备设置为进程的"控制终端“(当然这个新打开的终端必须代表具体的终端设备)。如果我们不想把打开的终端设备作为进程的控制终端,那么可以在系统调用open的参数flags中加入O_NOCTTY标识。

进程的控制终端存放在task_struct.signal->tty中。

个人认为引入/dev/tty (5,0)的意义在于,为应用层提供了访问当前进程“控制终端”的short cut。我们可以在tty_open中看到如下代码

    if (device == MKDEV(TTYAUX_MAJOR, 0)) {
        tty = get_current_tty();
        if (!tty) {
            unlock_kernel();
            mutex_unlock(&tty_mutex);
            return -ENXIO;
        }
        driver = tty_driver_kref_get(tty->driver);
        index = tty->index;
        filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
        /* noctty = 1; */
        /* FIXME: Should we take a driver reference ? */
        tty_kref_put(tty);
        goto got_driver;
    }

如果打开的设备节点是/dev/tty,那么就操作get_current_tty返回的当前进程“控制终端”


/dev/tty0

主设备号4,次设备号0。表示当前虚拟控制台,在支持 虚拟控制台(console)的内核中有个全局量fg_console,表示当前的“前台控制台”。


/dev/console

主设备号5, 次设备号为1。用于外接控制台,内核在初始化的过程中安装模块时会通过函数register_console,登记用做控制台的终端设备,把一个console数据结构挂到内核中的console_drivers队列中。

如果要打开的终端设备是/dev/console,那么就在console_drivers队列中找到第一个console结构,它所对应的设备号就是当前系统控制台的设备号



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值