qemu运行linux内核很慢,bugfix: Qemu 运行 ARM Linux 5.0 必现启动死机

本文详细记录了在Linux Lab中使用Qemu运行ARM64/virt board上的Linux 5.0.10内核时遇到的启动死机问题。通过开启早期打印机制,定位到错误发生在读取特定寄存器时。通过注释掉相关代码实现了临时修复,并发现问题可能源于Qemu版本过旧。升级Qemu至2.12.0后,内核启动正常,证实了这一猜测。
摘要由CSDN通过智能技术生成

By Falcon of TinyLab.org

May 14, 2019

注:泰晓科技新增 Debugging+Tracing 专辑,全面连载各类 debug 实战技能。本文是该专辑的第一篇,欢迎持续关注。通过该专辑,您可以学习到分析和解决实际问题的方式、方法、工具和技巧。

背景介绍

前段时间为 Linux Lab 新增了 5.0.10 for ARM64/virt board,期间遇到了启动死机问题,本文对该问题进行详解。

在继续阅读之前,建议准备好 Linux Lab,方便同时做实验。为复现该问题,请先注释掉 boards/virt/Makefile 中的 QEMU 所在行,或者键入如下命令确保使用旧版本的 qemu。

$ export QEMU=

问题现象

编译完 Linux 5.0.10 并通过 Linux Lab 运行时:

$ make BOARD=virt

$ make boot V=1

直接卡死了,只看到 Qemu 的输出日志,没有看到任何内核日志输出 ;-(

分析过程

理清问题基本信息

首先需要承认,面对这种不按套路出牌的 Linux 启动状况(不确定性),这个时候谁都可能“惶恐不安”。接着告诉自己,问题必须解决,冷静!

有两个信息先捋一下:之前的 Linux v4.5.5 ok,启动完美

网上已经有同学完美启动了 5.0 for ARM64

所以,问题可能原因:Linux v5.0.10 相比 v4.5.5 有变更引入了衰退

Linux Lab 所使用的环境跟网上其他同学的环境有差异,可能差异在编译器和 Qemu。

接下来有两个思路:用二分法找出引入问题的变更,即从 v4.5.5 到 v5.0.10 之间找出第一个启动不了的内核版本

升级 Linux Lab 中的编译器和 Qemu 到最新版本

可是,虽然这两个工作都可行,但还都蛮耗费时间(第2个相对而言没那么耗时),所以,不能逃避,正面扛着看看!

定下分析方式

ok,先保持内核版本不变、环境不变,正面分析到底 Linux 内核卡死在哪里?!

打开 early Logging 机制

竟然内核什么都没有输出,那么先想办法输出点东西。

死得这么早,可能是普通串口初始化之前就挂了,要在这之前就打印东西,能想到是 early printk:

$ make boot V=1 XKCLI="earlycon"

earlycon 是内核最新的 early printk 逻辑,说明文档在 linux-stable/Documentation/admin-guide/kernel-parameters.txt:

earlycon= [KNL] Output early console device and options.

[ARM64] The early console is determined by the stdout-path property in device tree's chosen node, or determined by the ACPI SPCR table.

[X86] When used with no options the early console is determined by the ACPI SPCR table.

加上以后,很幸运,有东西咕噜咕噜滚出来了:

$ mak

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值