我们将内核控制台发送到嵌入式系统的哪里?

时间:2020-03-06 14:54:21  来源:igfitidea点击:

我正在开发一个嵌入式系统,该系统当前使用串行端口1上的控制台输出来引导Linux(使用引导加载程序中的控制台引导参数)。但是,最终我们将使用此串行端口。内核控制台输出的最佳解决方案是什么? / dev /空吗?可以以某种方式摆上它,以便我们有可能获得它吗?

解决方案

如果我们只想从控制台读取内核printk消息,而不实际在其上运行getty或者shell,则可以使用netconsole。我们可以为引导加载程序内核选项(或者modprobe netconsole)提供以下内容:

[email protected]/eth1,[email protected]/12:34:56:78:9a:bc

其中4444是本地端口,10.0.0.1是本地ip,eth1是用于发送消息的本地接口。 9353是远程端口,10.0.0.2是向其发送消息的远程ip,最后一个参数是远程(例如:台式机)系统的mac地址。

然后查看消息运行:

netcat -u -l -p 9353

我们可以在Documentation / networking / netconsole.txt中阅读有关此内容的更多信息

我们可以使用dmesg从外壳程序访问printk消息缓冲区。内核缓冲区的大小是有限的,它将用最新的缓冲区覆盖最旧的条目,因此我们需要定期检查dmesg或者按@bmdhacks的建议连接netconsole。

如果没有控制台,我们将错过内核崩溃打印出的所有糟糕信息。如果内核死了并且在TCP设法将输出传递到远程套接字之前开始重启,那么即使使用netconsole可能也无济于事。我们通常会修改kernel / panic.c:panic()以将寄存器内容和其他状态保存到NOR闪存区域,因此至少会有一些信息可用于事后调试。