【发布时间】:2013-03-07 18:16:12
【问题描述】:
有一个名为/dev/console的设备文件,其(major,minor)是(5,1)。
当我使用串行控制台启动时,它会像 /dev/ttyS0 那样连接到我的 UART 端口。
但是当我在禁用串行控制台的情况下启动时,/dev/console 似乎连接到其他地方,/dev/ttyS0 总是连接到同一个物理设备,即UART0。
是否有任何迹象(如/proc 或/sys 中的某些内容)显示此类信息?我在那里尝试过,但没有找到我想要的。
我开始追踪 Linux 内核源代码以澄清它们之间的关系。
谁能给我一些提示?何时、何地、如何以及如何确定/dev/console 连接的物理设备?
编辑:最新发现是:
-
/dev/console由内核参数的console=配置,而getty又使用它来打开stdin/stdout/stderr。如果未指定console=,则/dev/null将作为stdin/stdout/stderr打开。但我不确定它们是否与/dev/console完全相同,这意味着/dev/console可以将其I/O 连接到不同的物理设备。 - 如果插入 USB HID 键盘且
console=未配置为 UART,则可以读取/dev/console。因此/dev/console==/dev/null似乎没什么意义。 需要更多调查。
【问题讨论】:
-
试试看
console=参数是如何从内核命令行处理的。 -
是的,我看过了,原来参数被传递给
init,然后又传递给getty_main(),这是getty在busybox中的实现。相关部分是close原来的标准输入,然后根据传递的参数open一个新的。所以我正在寻找一种可以从文件描述符中检索路径的方法;因为如果没有指定console=,我想知道“默认”设备是什么。 -
如果没有为
getty指定控制台,init打开的第一个stdin/stdout/stderr似乎是/dev/null。有兴趣的可以去init_main()->console_init()->bb_sanitize_stdio()busybox的来源。 -
你有文件
/sys/dev/char/5:1/active吗?它应该包含实际设备的名称。 -
不,我的系统没有该文件。
标签: linux-kernel linux-device-driver embedded-linux tty