Linux启动无串口输出的调试排查记录

Linux启动无串口输出的调试排查记录

1. 问题起因

  • 在 VirtualBox 虚拟机中启动 ONIE 镜像,串口终端(如 PuTTY)没有任何输出,而同样设置下 Ubuntu 能正常通过串口输出。
  • 期望在串口终端看到 ONIE 的 GRUB 菜单、内核日志或 shell,但实际完全无输出。

2. 初步排查

  • 确认 VirtualBox 虚拟串口配置(COM1/0x3F8/115200/主机管道)与 Ubuntu 虚拟机一致。
  • 检查 ONIE 镜像的 GRUB 配置,已包含如下内容:
    serial --port=0x3f8 --speed=115200
    terminal_input serial
    terminal_output serial
    CONSOLE_CMDLINE_LINUX="console=tty0 console=ttyS0,115200"
    
  • GRUB 菜单和 echo 信息能在串口终端看到,但内核启动后无输出。

3. 进一步调试

  • 尝试修改内核参数为 console=ttyS0,115200,依然无输出。
  • 检查内核编译配置,确认已启用 CONFIG_SERIAL_8250CONFIG_SERIAL_8250_CONSOLE
  • 尝试添加 earlyprintk=serial,ttyS0,115200earlycon=uart,io,0x3f8,115200,依然无 early boot 输出。

4. 决定在汇编入口加串口打印

  • 为排查内核是否真正被加载,在 arch/x86/boot/compressed/head_64.S 的 early boot 阶段插入 outb 打印:
    mov $0x43, %al        # 'C'
    mov $0x3f8, %dx
    out %al, %dx
    ...
    call verify_cpu
    testl %eax, %eax
    jnz .Lno_longmode
    mov $0x44, %al        # 'D'
    mov $0x3f8, %dx
    out %al, %dx
    
  • 结果:串口能打印 ‘C’,但没有 ‘D’。

5. 定位到 long mode 检查失败

  • 结合代码逻辑,verify_cpu 检查 CPU 是否支持 64 位 long mode。
  • 如果不支持,流程会跳转到 .Lno_longmode 死循环,导致后续代码无法执行,也不会有任何输出。
  • 由此推断:虚拟机当前未启用 64 位支持或硬件虚拟化,导致 long mode 检查失败,内核无法启动。

6. 虚拟机设置检查

  • 检查 VirtualBox 设置,发现操作系统类型未选 64 位。

7. 实际解决办法与经验总结

  • 实际原因:VirtualBox 虚拟机未勾选 64 位操作系统类型,导致 ONIE 镜像无法识别为 64 位环境,early boot 阶段卡在 long mode 检查。Ubuntu 这类主流发行版镜像能自动适配为 64 位启动,但 ONIE 这类定制镜像无法自动识别,必须手动设置虚拟机为 64 位。
  • 解决办法
    1. 关闭虚拟机。
    2. 打开 VirtualBox 虚拟机设置 → 常规 → 基本,将操作系统类型设置为 64 位(如"Ubuntu (64-bit)“或"Other Linux (64-bit)”)。
    3. 保存设置并重新启动虚拟机。
    4. 此时 ONIE 镜像即可正常通过 long mode 检查,串口输出恢复正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值