进一步阅读

进一步阅读

我试图理解提供给内核的 console= 参数,为此我已修改/etc/default/grub将控制台设置为终端3比如(我选择的原因终端3相对于终端S0是我没有串口): 在此输入图像描述

我假设通过将控制台设置为终端3内核只会将消息输出到终端3没有其他 tty。我已经使用Ctrl++Alt进入F2终端2Alt并按下+ SysRq+键H。如果我检查,dmesg我可以看到那里的消息。

通过这样做,我可以看到当前内核的消息终端2。通过导航至终端3我没有看到任何消息。

只是为了完整性,控制台已正确配置为指向终端3

~$ cat /sys/devices/virtual/tty/console/active
tty3

除此之外,我还编译了一个通用helloworld模块并对其执行了 insmod 和 rmmod 。输出出现在当前活动的终端而不是指定的控制台(终端3)。

我不明白为什么会发生这种情况。有人可以解释一下吗?我是否误解了控制台参数?

答案1

Linux 命令行设置中使用的名称console=不是在文件系统中查找的设备文件名。他们实际上是组合的一个注册名称指数,“tty3”是注册名称“tty”,索引为 3。

注册名称将与内部名称设备驱动程序用来注册控制台 I/O 处理程序。这些根本不需要匹配用户空间设备名称。 “tty”与使用的名称匹配内核虚拟终端子系统当它注册其控制台 I/O 处理程序时

指数不是KVT 编号。当设备驱动程序提供时,它用于匹配特定的控制台 I/O 处理程序实例超过 1 个控制台 I/O 处理程序同名。这是事实并非如此对于KVT子系统,它只注册一个控制台I/O处理程序。在这种情况下,该索引实际上在很大程度上被忽略了。这确实是索引 3 所发生的情况。

是的,Linux doco另有说法。 Linux 文档是错的。再次。

此外,当 KVT 子系统被选为控制台时,默认情况下会写入所有控制台输出首先,到目前活跃KVT。这是可以改变的,但是不由规范中内核命令行上使用的注册索引号console=。相反,它是通过针对 KVT 设备发出TIOCL_SETKMSGREDIRECT子命令来更改的TIOCLINUX ioctl()(为了获得最佳结果,正在重定向的 KVT 设备,否则 KVT 可能根本不存在,因为在打开设备文件之前不会创建 KVT)。

Linux doco 不会犯这个错误。它相当简单TIOCL_SETKMSGREDIRECT根本没有记录console_ioctl手册页上。

对于非程序员,可以通过以下工具访问此功能相当具有误导性的 Busyboxsetlogcons命令记录艾伦·克鲁斯的setconsole

进一步阅读

  • 乔纳森·德博因·波拉德 (2018)。 ”linux-vt”。 设备。诺什工具集。
  • 乔纳森·德博因·波拉德 (2018)。 ”linux-控制台”。 设备。诺什工具集。

相关内容