默认情况下,内核驱动会注册多达63个tty设备。如果是静态的devfs方式,可能感觉不到。但如果是用动态的udev(mdev)方式,你就会看到/dev目录下有一大堆大堆的/dev/ttyN(N=0:63)。看上去很不爽。从性能的角度来讲,内核注册的设备越多,自然对性能或多或少会有影响。根据内核的代码,好像TTY设备也只定义到了最多用到17(Check …/include/linux/tty.h)个。普通老百姓从ALT+1到ALT+6也才六个。所以实在是很有比较作一个删减。

Google了一番,发现漫山遍野都在谈TTY驱动的结构和原理。基本上找不到关于TTY设备数量调整的信息。还浪费我的口水,关键字里特别添加了“数量”。好吧,既然Google不行,那么就老老实实的看看源代码吧!

根据经验,内核的配置数据通常按照【.config=>头文件=>源文件=>相关头文件=>相关源文件】的优先顺序保存。很明显的,.config里面是没有的。

既然是tty设备,那么头文件肯定就是../include/linux/tty.h无疑了。结果一看,文件里尽是一些关于TTY设备用途、类型的定义,没有数量方面的定义。

退而求其次,看源代码。源代码里tty设备驱动分成了tty_io.c、tty_audit.c、tty_ldisc.c丧个文件。根据此前Google的一些信息,重点关注了以下…/drivers/char/tty_io.c。结果还是没有。

那就只有查找相关的了。看看tty_io.c的头文件列表,发现了一个vt_kern.h的玩意。显然这个文件里虽然也没有相关的个数定义。

但是既然vt_kern.h被包括了,那说明tty模块多少跟vt模块有些关系。就顺手看了下../include/linux/vt.h。结果还真发现两个定义:

看名字好像说的是CONSOLE的最大数量(MAX_NumbeR_CONSOLES)。看注释又似乎说的是串口行数。串口本来就一行,怎么会有行数这一说呢。莫名其妙!不过看这里的值让人惊叹——63(63指的是最大的编号;注释说的64是加上tty0后的tty设备个数。)第一个宏看上去是定义个数的,第二个宏看上去是定义用户可使用的个数。前者大于后者(奇怪内核竟然没有检查这个问题)。

不管三七二十一了,先改一改看看。

结果应验了!

到此,问题解决。遗留问题有两个:

  • console、tty设备有何联系和区别;

  • 为什么宏的注释说的是串口的行数呢?