• 正文
  • 推荐器件
  • 相关推荐
申请入驻 产业图谱

不再惧怕Linux内核panic (一)

2024/05/05
9167
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前言

曾经我看到Linux kernel panic,我也会很panic,感觉无从下手,但经过不断学习和摸索积累后,目前的我已经不再panic了,其实内核panic后打印的信息通常都会包含一系列关键信息,会帮助我们进一步分析诊断导致系统崩溃的根本原因。

今天就先认识一下panic信息。

以下是一个ARM64架构Linux kernel panic打印信息示例:

Kernel panic - not syncing: Fatal exception in interrupt handler
CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.¾.0-rc1 #1
Hardware name: Generic AArch64 (DT)
pstate: 80000005 (Nzcv daif -PAN -UAO)
pc : 0000000000000000 lr : 0000000000000000
sp : ffff800000093e20 x29: ffff800000093e00
x28: 0000000000000000 x27: 0000000000000000
x26: 0000000000000000 x25: 0000000000000000
x24: 0000000000000000 x23: 0000000000000000
x22: 0000000000000000 x21: 0000000000000000
x20: 0000000000000000 x19: 0000000000000000
x18: 0000000000000000 x17: 0000000000000000
x16: 0000000000000000 x15: 0000000000000000
x14: 0000000000000000 x13: 0000000000000000
x12: 0000000000000000 x11: 0000000000000000
x10: 0000000000000000 x9 : 0000000000000000
x8 : 0000000000000000 x7 : 0000000000000000
x6 : 0000000000000000 x5 : 0000000000000000
x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000000000000000
x0 : 0000000000000000 Call trace:
show_stack+0x14/0x20
dump_stack_lvl+0x40/0x58
dump_stack+0x.png
panic+0x17c/0x328
do_exit+0x2b8/0x45c
do_group_exit+0x3a/0xa0
SyS_exit_group+0x14/0x20
el0_svc_naked+0x28/0x2c
Modules linked in: [list of loaded modules]
---[ end trace 123456789abcdef0 ]---

Kernel panic - not syncing: Fatal exception in interrupt handler
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: Fatal exception in interrupt handler ]---

针对以上示例信息说明如下:

标题与原因

Kernel panic - not syncing: Fatal exception in interrupt handler

指明发生了内核恐慌(kernel panic),原因是遇到了致命异常(Fatal exception),且该异常发生在中断处理程序中。

CPU与进程信息

CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.¾.0-rc1 #1

表明出错的CPU核心是0号,引发panic的进程ID为250,进程名为irq/10000000-mmc0,表示与MMC设备相关的中断处理程序。内核版本为5.¾.0-rc1,编译构建编号为#1,并且内核未被外部代码污染(Not tainted)。

硬件信息

Hardware name: Generic AArch64 (DT)

说明运行在Generic AArch64硬件平台上,并使用设备树(Device Tree, DT)作为硬件描述方式。

处理器状态寄存器(PSTATE)值

pstate: 80000005 (Nzcv daif -PAN -UAO)

给出了当前处理器状态寄存器的值,反映了处理器的各种模式和标志位状态。在这个例子中,N、Z、C、V标志分别代表负数、零、进位、溢出,daif字段表示调试、中断、故障、同步异常禁止位,PAN和UAO标志分别与数据对齐异常和用户地址中止有关。

程序计数器(PC)、链接寄存器(LR)、栈指针(SP)与寄存器备份

接下来是一系列寄存器的值,包括程序计数器(PC)、链接寄存器(LR)、栈指针(SP)以及其他通用寄存器(x0-x30)。这些信息值有助于定位发生异常时的指令位置和当时的上下文环境。

Call trace

Call trace:
show_stack+0x14/0x20
dump_stack_lvl+0x40/0x58
dump_stack+0x.png
panic+0x17c/0x328
do_exit+0x2b8/0x45c
do_group_exit+0x3a/0xa0
SyS_exit_group+0x14/0x20
el0_svc_naked+0x28/0x2c
Modules linked in: [list of loaded modules]

展示了从异常发生点到panic函数调用的函数调用链,包括每个函数的地址偏移和函数总长度。这会有助于追踪导致panic的具体执行路径。此外,还列出了可能与问题相关的已加载模块(Modules linked in)。

Kernel Offset & Relocation Range

Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)

提供内核在物理内存中的加载偏移量,以及内核可重定位范围,有助于分析理解内核映像在内存中的布局。

结束标记

---[ end trace 123456789abcdef0 ]---

Kernel panic - not syncing: Fatal exception in interrupt handler
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: Fatal exception in interrupt handler ]---

重复了panic的原因和内核相关信息,作为结束标记,便于识别panic信息的完整边界。

总结

综上所述,以Linux ARM64 panic打印信息为例看,其实包含了较多的诊断信息,可以帮助我们分析崩溃原因、定位错误代码位置,并结合其他调试手段(如内核转储、日志记录等)来定位和解决问题。所以,以后看到类似这种Linux panic信息,首先自己坚决不能panic!要勇敢面对!才会get到后续的精彩知识!

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
SN74LV541APWR 1 Texas Instruments Eight-channel, 2-V to 5.5-V buffers with tri-state outputs 20-TSSOP -40 to 125

ECAD模型

下载ECAD模型
$0.78 查看
AST3TQ-T-25.000MHZ-28 1 Abracon Corporation XTAL OSC TCXO 25.0000MHZ LVCMOS
$32.98 查看
ACPL-247-500E 1 Avago Technologies 4 CHANNEL TRANSISTOR OUTPUT OPTOCOUPLER, ROHS COMPLIANT, SOP-16

ECAD模型

下载ECAD模型
$3.23 查看

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录