Skip to content

Ynkcc/kpm_alt_pstore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

kpm_alt_pstore

一个基于 KernelPatch 框架的内核 panic 日志转储模块(KPM),用于在一部分 Pstore (Persistent Storage) 硬件/固件机制失效、Warm Reset 无法保留内存日志的设备上,作为 Pstore 的替代方案。

💡 设计原理

对于本方案的详细设计和分析,参考本地文档:ptrace不可用时的替代方案.md

  • Hook 拦截点:在内核 panic 流程中,关闭其他 CPU 之前拦截 smp_send_stop 函数。此时 Oops 调用栈及 panic 原因已输出至内核 kmsg 环形缓冲区,但其他 CPU 尚未强行下线,硬件状态相对完整。
  • 规避 I/O 死锁:由于进入 panic 后本地中断已被禁用,直接使用 VFS 同步写盘会因等待 I/O 完成中断而发生永久死锁。本模块通过在文件操作前临时显式开启本地中断(IRQ),待刷盘落盘(fsync)完毕后再重新禁用。
  • 内存零分配:在 panic 致命路径中,模块使用预先分配的 256KB 静态缓冲区接收日志,避免调用任何内核内存分配函数,降低次生崩溃的概率。
  • 内核兼容性:动态探测 VFS 及 kmsg 函数符号,并根据内核版本自动适配 kmsg_dump_iter(5.10+)和 kmsg_dumper(4.14/4.19/5.4)的结构体定义。

🔗 原文与鸣谢

本项目设计思路灵感来源于 Xzr 的博客:

🛠️ 编译与使用

编译

模块支持使用 Android NDK 进行增量链接编译:

make

编译产物将输出在 out/kpm_alt_pstore.kpm

加载

使用 KernelPatch 用户态工具(例如 kptool)载入模块:

kptool load out/kpm_alt_pstore.kpm

验证

加载成功后,您可以通过以下命令人工触发 panic,并在设备重启后拉取 /data/kmsg_panic.txt 检查转储内容:

echo c > /proc/sysrq-trigger

📄 开源许可

本项目使用 GNU General Public License (GPL) 2.0 协议开源。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors