在 do_coredump 函数中保存 core 信息到指定目录
本文档详细说明如何在 Linux 内核的 do_coredump
函数中增加逻辑,将 core 信息保存到文件系统 /usr/cm/kernel
中。如果该文件夹不存在,则不保存;如果存在,则保存 core 文件便于查看。
步骤
1. 打开并编辑 fs/coredump.c
文件
首先,找到并打开 fs/coredump.c
文件,在适当的位置添加以下代码:
#include <linux/fs.h>
#include <linux/errno.h>
static int directory_exists(const char *path) {
struct path p;
int err = kern_path(path, LOOKUP_DIRECTORY, &p);
if (err) {
return 0; // Directory does not exist
}
path_put(&p);
return 1; // Directory exists
}
int do_coredump(long signr, int exit_code, struct pt_regs *regs) {
// 现有的coredump逻辑
...
// 新增逻辑开始
const char *core_dir = "/usr/cm/kernel";
if (directory_exists(core_dir)) {
struct file *file;
mm_segment_t old_fs;
loff_t pos = 0;
old_fs = get_fs();
set_fs(KERNEL_DS);
file = filp_open("/usr/cm/kernel/core", O_CREAT | O_WRONLY, 0644);
if (!IS_ERR(file)) {
kernel_write(file, core_data, core_size, &pos);
filp_close(file, NULL);
} else {
printk(KERN_ERR "Unable to open core file for writing\n");
}
set_fs(old_fs);
} else {
printk(KERN_INFO "Directory /usr/cm/kernel does not exist. Skipping core dump.\n");
}
// 新增逻辑结束
...
return 0;
}
2. 解释和细节
directory_exists
函数用于检查目录是否存在。- 在
do_coredump
函数中,定义了core_dir
变量,指向我们要保存 core 文件的目录。 - 如果目录存在,则创建并打开 core 文件,将 core 数据写入该文件。
get_fs
和set_fs
用于设置和恢复内核地址空间,以确保文件操作在内核模式下正常进行。kernel_write
函数用于将数据写入文件。
3. 重新编译并安装新的内核
保存修改并退出编辑器。然后,编译内核并安装新编译的内核。具体步骤可能因不同的系统而异,请参考你的系统的内核编译指南。
注意事项
- 上述示例代码是简化版本,实际实现中需要确保
core_data
和core_size
等变量正确获取并处理,具体细节取决于现有的 coredump 逻辑。 - 务必对内核修改进行充分测试,以确保其稳定性和可靠性。