玩转OurBMC第十二期:kdump原理分析(下)-脚本实现内核崩溃自动捕获

作者:互联网

2026-03-20

AI工具库

玩转OurBMC栏目聚焦BMC全栈技术知识分享,从理论到实践全方位解析BMC技术要点。本栏目致力于帮助开发者深入理解社区文化和技术特色,诚邀技术同仁踊跃投稿,共建知识共享平台。

在服务器管理过程中,BMC需要与其他工具协同工作以实现更高效的监控管理。本期将深入解析内核崩溃转储机制kdump,从kexec和内核代码层面剖析其工作流程。

bd4572250753dc8cab297981194e7379.png

内核通过grub配置参数crashkernel=X@Y预留内存空间用于放置捕获内核。系统启动后可通过dmesg查看相关日志,示例如下:

02a09db4c15d7a35fdfa35635348e7c8.png

对应的内存预留功能由reserve_crashkernel函数实现,该函数位于arch/arm64/mm/init.c:

eb31ba4558be9800d8e09a9bbc7594d5.png

Kexec工具首先会解析/proc/iomem文件获取物理内存分配情况,寻找足够大的连续内存区域放置捕获内核和initrd。同时还会设置需要dump的内存内容:

5473959e17245d53c0634d792c2c271e.png

get_memory_ranges函数获取所有System RAM区域,排除reserved部分后存入info->memory_range全局变量。crash_get_memory_ranges函数则进一步排除Crash kernel区域。

内核定义了两个kexec相关系统调用,在arm64平台调用号通常通用:

07e0c9154fa6331239fa9b6a0b9379b5.png

用户空间kexec通过kexec_load/kexec_file_load系统调用将数据传递到内核:

fb860f5bee6a802c773fbcc3d2f644c5.png

内核中通过SYSCALL_DEFINE4宏定义sys_kexec_load函数:

44a90e6c24fb9bb4c924c28f7c825219.png 0b1814058d9865cda07d9a4c48bcb725.png

Kexec会将内核、initrd等信息存储在kexec_info的segment中:

27a2021a9112a3c480545f0d55e34343.png

my_load函数作为主要入口,首先解压crash kernel到kernel_buf:

033af38fa9ed1bd6bfebbaaff9dee536.png

arm64平台下image_arm64_load函数负责加载vmlinuz格式内核:

4502aed33d9d39d0df739ea4b6b22feb.png

通过GDB调试可确认my_load中info包含5个segment:

78d7bd6537fd4c4f2902e7b8b8d698b0.png

内核通过/proc/vmcore文件提供数据读取接口:

002833343423aedd4a1fd7bcfb8f0cae.jpg b89899f3e448ff5c7c457c0b79122235.jpg

内核崩溃时会保存各CPU寄存器信息到PT_NOTE指定内存:

90ea417ea7c417d3520be709c245e7dc.png 58f8b7f9fb6cce0e4d3849b23fb3a5f3.png 3a732ae088b8e10b245829eec0c04dc3.jpg ff3c2ecd280078c57b9080c6ec02de3c.jpg ff3c2ecd280078c57b9080c6ec02de3c.jpg

欢迎持续关注OurBMC社区,获取更多BMC技术干货。

OurBMC社区官方网站:

https://www.ourbmc.cn/

相关标签:

crash segment note init image memory linux kexec core notes dump panic load vmcore crashkernel arm64