console,uart,tty的关联关系

http://blog.csdn.net/zhenwenxian/article/details/5758882


console,uart,tty的关联关系

console可以是串口,也可以是vga,console确实是只能输出,write,内核打印。

在UNIX系统中,计算机显示器通常被称为控制台终端(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1 –tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向/dev/tty0进行写操作,

serial_em86xx.c实现的是串口uart驱动,也注册了console,在console_init中调用console初始化,但是如果serial不做console的话,应该就不用注册console,但是串口uart驱动是必须的,就是uart_register_driver,其中涉及最关键的tty_driver,

 

tty是一类char设备的通称,它们有相同的特性,比如对^C的处理,驱动使用tty_register_driver注册一个tty。

/dev/console是一个虚拟的tty,它映射到真正的tty上,如何映射等会再说。 

console有多种含义,这里特指printk输出的设备,驱动使用register_console注册一个console。 console和tty有很大区别:console是个只输出的设备,功能很简单,只能在内核中访问;tty是char设备,可以被用户程序访问。 

实际的驱动比如串口对一个物理设备会注册两次,一个是tty,一个是console,并通过在console的结构中记录tty的主次设备号建立了联系。 

在内核中,tty和console都可以注册多个。当内核命令行上指定console=ttyS0之类的参数时,首先确定了printk实际使用那个console作为输出,其次由于console和tty之间的对应关系,打开/dev/console时,就会映射到相应的tty上。用一句话说:/dev/console将映射到默认console对应的tty上。 

顺便说一句,console=ttyS0和/dev/ttyS0包含相同的设备名字完全是巧合,不同也没事。

 

所以如果是一个单纯的串口通信,可以不用实现console,只要实现uart驱动,包括tty_driver,就可以在应用层调用串口设备实现的接口,比如open(/dev/ttyS0),然后selest,用于等待串口上的数据,而在内和层,驱动中,就是用wait_queue等来实现select的。/dev/tty,/dev/console,/dev/tty是正在使用的虚拟终端,因此在这里tty_open就是ttyS0,因为前台进程的控制终端现在就是ttyS0,/dev/tty可以在用户空间访问,就是用户打印可以在该空间。

serial.c不是必须的,而serial_em86xx.c中提供了与其相似的功能,比如shutdown,startup等方法,以及console_write等,而console是在内核打印,而在erial_em86xx.c中,已经有串口uart驱动,而且与tty_driver关联起来,所以tty_open打开的就是ttyS0了。如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件,用户打印。tty_io.c中除了有tty_init,tty_open之外还有tty_poll,用于实现poll,另外还有用于异步通知的tty_fasync,主要是通过SIGIO信号来通知用户进程,因为串口速度不快,用异步通知也可以。而如果速度要求快的话,就需要在中断中唤醒进程,用户程序用poll,select来等待了。

ldd3中有tty_driver的介绍了。

tty_ldisc是和console有关系的,n_tty,多串口支持,SIGIO。

tty_ldisc下面才是tty_driver。

串口如果是普通功能,就可以不跟tty关联起来,而实现char设备即可。

console是内核打印,在tty_io.c中console_init中有初始化em86xx_uart_console_init,在serial_em86xx.c中,有register_console,而register_console的实现是在printk.c,从而也说明了console内核打印和用户打印tty底层实现不一样。而用户程序打印以及输入是tty,代码在行规n_tty.c中,而tty_ldisc的注册也是在console_init开始部分的,

(void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);

只不过这里的console_init部分是与定义的CONFIG_SERIAL_EM86XX_CONSOLE没有关系的,而是与tty有关的,n_tty->tty_io->serial_em86xx,serial_core.也就是说即使没有CONFIG_SERIAL_EM86XX_CONSOLE,假设console内核打印是在framebuffer,键盘的tty0,但用户程序的打印输入是在/dev/tty,最终是可以是在/dev/ttyS0,从而用户程序就可以通过/dev/ttyS0普通串口通信与串口通信设备通信了,而此时串口驱动可以不实现serial_console功能.

console.c

#ifdef CONFIG_VT
     con_init();
     #endif

tty_init

#ifdef CONFIG_VT
dev_console_driver = dev_tty_driver;
dev_console_driver.driver_name = "/dev/vc/0";
dev_console_driver.name = dev_console_driver.driver_name + 5;
dev_console_driver.major = TTY_MAJOR;
dev_console_driver.type = TTY_DRIVER_TYPE_SYSTEM;
dev_console_driver.subtype = SYSTEM_TYPE_CONSOLE;

if (tty_register_driver(&dev_console_driver))
   panic("Couldn't register /dev/tty0 driver/n");

kbd_init();
#endif

console.c以及CONFIG_VT是内核控制台,内核打印方面的。

config VT
bool "Virtual terminal" if EMBEDDED
select INPUT
default y if !VIOCONS
---help---
    If you say Y here, you will get support for terminal devices with
    display and keyboard devices. These are called "virtual" because you
    can run several virtual terminals (also called virtual consoles) on
    one physical terminal. This is rather useful, for example one
    virtual terminal can collect system messages and warnings, another
    one can be used for a text-mode user session, and a third could run
    an X session, all in parallel. Switching between virtual terminals
    is done with certain key combinations, usually Alt-<function key>.

    The setterm command ("man setterm") can be used to change the
    properties (such as colors or beeping) of a virtual terminal. The
    man page console_codes(4) ("man console_codes") contains the special
    character sequences that can be used to change those properties
    directly. The fonts used on virtual terminals can be changed with
    the setfont ("man setfont") command and the key bindings are defined
    with the loadkeys ("man loadkeys") command.

    You need at least one virtual terminal device in order to make use
    of your keyboard and monitor. Therefore, only people configuring an
    embedded system would want to say N here in order to save some
    memory; the only way to log into such a system is then via a serial
    or network connection.

    If unsure, say Y, or else you won't be able to do much with your new
    shiny Linux system :-)

config VT_CONSOLE
bool "Support for console on virtual terminal" if EMBEDDED
depends on VT
default y
---help---
    The system console is the device which receives all kernel messages
    and warnings and which allows logins in single user mode. If you
    answer Y here, a virtual terminal (the device used to interact with
    a physical terminal) can be used as system console. This is the most
    common mode of operations, so you should say Y here unless you want
    the kernel messages be output only to a serial port (in which case
    you should say Y to "Console on serial port", below).

    If you do say Y here, by default the currently visible virtual
    terminal (/dev/tty0) will be used as system console. You can change
    that with a kernel command line option such as "console=tty3" which
    would use the third virtual terminal as system console. (Try "man
    bootparam" or see the documentation of your boot loader (lilo or
    loadlin) about how to pass options to the kernel at boot time.)

    If unsure, say Y.

 

config SERIAL_8250_CONSOLE
bool "Console on 8250/16550 and compatible serial port"
depends on SERIAL_8250=y
select SERIAL_CORE_CONSOLE
---help---
    If you say Y here, it will be possible to use a serial port as the
    system console (the system console is the device which receives all
    kernel messages and warnings and which allows logins in single user
    mode). This could be useful if some terminal or printer is connected
    to that serial port.

    Even if you say Y here, the currently visible virtual console
    (/dev/tty0) will still be used as the system console by default, but
    you can alter that using a kernel command line option such as
    "console=ttyS1". (Try "man bootparam" or see the documentation of
    your boot loader (grub or lilo or loadlin) about how to pass options
    to the kernel at boot time.)

    If you don't have a VGA card installed and you say Y here, the
    kernel will automatically use the first serial line, /dev/ttyS0, as
    system console.

    If unsure, say N.




/**********************分割线*************************************************/
tty:

tty(终端设备的统称):
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫


终端比较合适。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备

串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,

因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > 
/dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。可接串口来实验。

控制终端(/dev/tty)
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。

控制台终端(/dev/ttyn, /dev/console)
在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等
。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的
一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统
同时有几个不同的会话期存在。只有系统或超级用户root可以向 /dev/tty0进行写操作 即下例:
1、# tty(查看当前TTY)
/dev/tty1
2、#echo "test tty0" > /dev/tty0
test tty0

/*********************************************分割线**********************************************/

基本概念:
1. tty(终端设备的统称):
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。

2. pty(虚拟终端):
但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty)

3. pts/ptmx(pts/ptmx结合使用,进而实现pty):
pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。

一、区分/dev/tty、/dev/console、/dev/pts、/dev/ttyn /dev/ttySn

通常我们在linux下看到的控制台(console)是由几个设备完成的。分别是/dev/ttyN.通常使用热键 alt+Fn来在这些虚拟终端之间进行切换。所有的这些tty设备都是由linux/drivers/char/console.c和vt.c对应。

控制终端 /dev/tty指的是当前所处的终端,输出到此的内容只会显示在当前工作的终端显示器上,如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。这个终端文件可以由各个用户共享

控制台终端 /dev/ttyn  n(0到6)  tty1,tty2就是不同的虚拟终端(virtual console).

/dev/console 就是tty0 ,tty0则是当前所使用虚拟终端即激活的虚拟终端的一个别名,系统所产生的信息会发送到该终端上,实际上机器只有一个屏幕,也就是我们看到的这个屏幕,可以理解为console指向激活的那个tty,准确地说是激活的那个tty才将输出显示到console。历史上,console指主机本身的屏幕键盘,而tty指用电缆链接的其它位置的控制台(仅包含屏幕和键盘)。tty0是系统自动打开的,但不用于用户登录

伪终端 /dev/pts是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。

由于可能有好几千个用户登陆,所以/dev/pts其实是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs) 。第一个用户登陆,console的设备文件为/dev/pts/0,第二个为/dev/pts/1,以此类推。这里的0、1、2、3不是具体的标准输入或输出,而是整个控制台。你可尝试 echo "aaaaaa" > /dev/pts0、1、2……。

串行端口终端(/dev/ttySn) 
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标 准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值