当前位置:首页>Linux>完了,项目Linux板子没有引出串口,别慌~

完了,项目Linux板子没有引出串口,别慌~

  • 2026-10-11 05:55:42
完了,项目Linux板子没有引出串口,别慌~

目录

  • 从一次调试翻车说起
  • 两个同名模块,各自干吗的
  • U-Boot NetConsole:远程"操控"用
  • Kernel NetConsole:专门"抓日志"用
  • 两个能串起来吗?
  • 该怎么选?

从一次调试翻车说起

大家好,我是情报小哥。

有一次调试一块没有引出串口的嵌入式板子,内核 panic 后什么日志也没留下来——磁盘来不及写,dmesg 环形缓冲区跟着重启清零了。

后来同事甩过来一句:开 netconsole 啊。

一搜才发现,U-Boot 和 Linux 内核里各有一个 NetConsole,名字差不多,东西完全不一样。

今天就把这个坑理清楚。

两个同名模块,各自干吗的

先看对比:

U-Boot NetConsoleKernel NetConsole
代码位置
U-Boot 源码 net/netconsole.c
Linux 内核 drivers/net/netconsole.c
工作阶段
上电 → 内核启动前
内核启动后
通信方向
双向
(能收能发)
只发不收
(output-only)
作用
远程操作 U-Boot、敲命令
抓内核日志(尤其 panic)
典型场景
无串口时替代串口
内核崩溃时保住最后一口气

(图1:U-Boot 与 Kernel 双 NetConsole 对比)

一句话区分:U-Boot 的是"远程终端",Kernel 的是"远程日志"。

U-Boot NetConsole:远程"操控"用

U-Boot 设计 NetConsole 的动机很实在:嵌入式板子不一定有串口,但大概率有网口。

它把 stdin/stdout/stderr 全切到 UDP 上,开发机通过网络就能操作 U-Boot:

# 板子 U-Boot 端设置setenv ethaddr 00:11:22:33:44:55setenv ipaddr 192.168.1.10setenv serverip 192.168.1.20setenv ncip 192.168.1.20     # 你开发机的 IP# 把标准输入输出全切到网络setenv stdin ncsetenv stdout ncsetenv stderr nc

然后开发机开个 UDP 监听:

# U-Boot 源码 tools/ 目录自带接收工具./tools/netconsole 6666

这时候你在开发机键盘上敲的 printenv、tftp、boot,全是通过 UDP 包发到板子执行的,输出也原路返回。

什么场景用得着?

  • 产品板子没引出串口,想改 U-Boot 参数只能走网口
  • 工厂批量烧录,一台电脑同时操多块板子,比串口一个一个插快得多

Kernel NetConsole:专门"抓日志"用

内核里的 netconsole 就不一样了,它只管发,不管收。

内核 printk ──→ netconsole 模块 ──→ UDP (目标端口 6666) ──→ 远程 syslog/你的开发机

它做的事情就是:在 printk 的路径上挂个钩子,每条内核消息除了往环形缓冲区写,还顺手组装成 UDP 包丢出去。

(图2:Kernel NetConsole 内部数据流)

为什么只发不收?

不是做不了,而是没必要。内核启动后有 SSH、telnet 这些用户态的远程登录手段,不需要在内核态再搞一个网络终端。而且从网络接收输入来操作内核,攻击面太大,得不偿失。

那它"只发"可靠吗?

正因为功能单一,它在极端场景下特别能打:

  • 网卡驱动没挂,日志就能发出去,不依赖磁盘和文件系统
  • 支持在中断上下文直接发 UDP,panic 时调度器停了照样干活
  • 支持多目标同时发送,一份日志发到多个接收端
  • 开销极小,不影响系统性能

使用方式也简单:

# 加载模块,指定本地和目标信息modprobe netconsole netconsole=4444@192.168.1.10/eth0,6666@192.168.1.20/# 或者写进内核启动参数(U-Boot bootargs 传入)# console=ttyS0,115200 netconsole=4444@192.168.1.10/eth0,6666@192.168.1.20/

接收端用 netcat 就行:

nc -u -l 6666

在 U-Boot 里通过 bootargs 传入 netconsole 参数,内核一启动就加载模块,越早越好——连内核早期初始化的日志都不会丢。

该怎么选?

场景
用哪个
设备没串口,想操作 U-Boot
U-Boot NetConsole
内核莫名崩溃,想抓 panic 日志
Kernel NetConsole
两者都要
两个都配上,U-Boot 管启动,内核接管日志

搞清楚这两个东西的区别,下次遇到没串口的板子,或者内核莫名其妙重启的时候,就知道该掏哪个工具了。

星标公众号,第一时间看文章!

最     后   

小哥搜集了一些嵌入式学习资料,公众号内回复【1024】即可找到下载链接!

推荐好文点击蓝色字体即可跳转

☞专辑|Linux应用程序编程大全
☞ 专辑|学点网络知识
☞ 专辑|手撕C语言
☞ 专辑|手撕C++语言
☞ 专辑|经验分享
☞ 专辑|从单片机到Linux
☞ 专辑|电能控制技术
☞ 专辑|嵌入式必备数学知识

☞  MCU进阶专辑

☞  嵌入式C语言进阶专辑

☞  经验分享 

最新文章

随机文章