You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像Bochs一样获取QEMU的重启原因?自制OS运行QEMU异常重启排查

QEMU获取系统重启原因的方法
  • 开启调试日志记录
    启动QEMU时添加调试相关参数,命令如下:
    qemu-system-i386 ./image/hd60M.img -d int,guest_errors,reset -D qemu.log
    
    参数说明:
    • -d int,guest_errors,reset:开启三类调试日志的记录,int对应所有CPU中断、异常触发记录,guest_errors对应客户机操作系统触发的架构层面错误,reset对应系统复位相关事件
    • -D qemu.log:将所有调试日志输出到当前目录的qemu.log文件,执行复现重启流程后,直接查看该文件即可看到重启前触发的具体异常、错误代码、对应寄存器值等信息
  • 用GDB远程调试定位重启点
    1. 启动QEMU时添加调试端口参数,命令如下:
      qemu-system-i386 ./image/hd60M.img -s -S
      
      其中-S表示启动后立刻暂停CPU运行,-s表示默认在1234端口开启GDB远程调试服务
    2. 另开终端启动GDB,执行以下命令连接调试:
      target remote localhost:1234
      # 给你的内核main函数打断点,符号识别异常时可以直接填内核入口的虚拟地址
      b main
      c
      
    3. 等内核运行到while(1)位置后,继续执行等待重启触发,GDB会在系统触发致命异常、重启前停下,此时可以查看寄存器、栈回溯信息,定位重启触发源
  • 开启monitor控制台实时查看状态
    启动QEMU时添加参数-monitor stdio,运行时会在终端开启QEMU管理控制台,系统异常前可以输入info registers查看当前CPU寄存器状态,info idt查看中断描述符表配置,info mem查看内存映射信息,辅助定位问题。

额外排查提示

结合你给出的内核代码,大概率是没有关闭中断也没有配置中断描述符表导致的:内核进入while(1)空循环后,CPU仍然会响应时钟等硬件中断,没有对应的中断处理函数的情况下会触发三重故障(Triple Fault),CPU自动复位,你可以在put_str执行后加一行asm volatile ("cli");关中断,测试是否还会出现重启现象。

内容的提问来源于stack exchange,提问作者Princekin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:45:03