跳转至

vmcore 深度解析系列 — 内核与 crash 工具的协作全链路

📌 内核源码:git@github.com:torvalds/linux.git, torvalds/master, eb3f4b7426cf | crash 源码:crash-8.0.5


目录

文件 内容
1 内核篇: panic → kexec → vmcore 生成 crash_save_cpumachine_crash_shutdownvmcoreinfo、ELF 头生成
2 capture kernel 启动与 /proc/vmcore capture kernel 启动路径、fs/proc/vmcore.c 完整实现、用户态读取 vmcore 的内核路径
3 crash 工具加载 vmcore — ELF 解析与初始化 is_netdump 流程、ELF 头解析、PT_NOTE 和 PT_LOAD 段的处理、resize_elf_header
4 crash 工具的内存读取 — readmem 与 ptov 实现 readmem 核心函数完整分析、KVADDR/PHYSADDR/UVADDR 的分发逻辑、uvtop 页表遍历
5 crash 工具的 VMCOREINFO 键值数据库 vmcoreinfo_read_stringkernel_init 启动时如何查询内核版本/PAGE_OFFSET/log_buf 等关键信息

前置知识

  • 了解 kdump/kexec 基本概念和 crashkernel= 参数
  • 掌握 ELF 文件格式基础 (Ehdr/Phdr/Nhdr)
  • 了解 Linux 内核的 panic 机制
  • 可搭配 coredump 分析经验更佳

架构总览

正常内核 panic()
crash_save_cpu (per-CPU registers) → crash_save_vmcoreinfo (关键常量) → machine_kexec
capture kernel 启动
/proc/vmcore 暴露 ELF 段 (VM core 内容) → 用户态 crash 工具
crash 工具: is_netdump → resize_elf_header → dump_Elf64_Ehdr/Phdr → readmem

                    crash 工具通过 VMCOREINFO 键值对获取内核版本/物理基址/
                    日志缓冲区地址/PAGE_OFFSET 等关键信息

→ bt (栈回溯) / log (dmesg) / kmem -i (内存统计) / ps (进程列表)

💬 评论