关于kdump如何设置,可以看其他的文章。
他的实现原理其实很简单,详细代码可以看linux-2.6.16/fs/proc/vmcore.c
通过kexec启动新的内核,因为在第一个内核(也就是crash掉的kernel)在设置kdump的时候,
通过配置文件,分了一部分内存给新的内核做启动用,这部分内存在crash的kernel是不会用到。
在重起的过程中,因为没有断电,所以在内存中保存了crash时候的数据信息,在新kernel启动的时候,
通过vmcore.c中:
通过上面的parse-crash-elf-headers函数把数据读到下面的结构链表中:
struct vmcore {
struct list_head list; //链表组织
unsigned long long paddr; //物理地址
unsigned long long size; //本内存片断的大小
loff_t offset;
};
我们在代码的注释里面:/* Initialize /proc/vmcore size if proc is already up. */
在proc系统初始化的时候,会创建一个/proc/vmcore的文件,通过读这个文件,就可以知道crash的kernel的信息。
proc/vmcore文件是放在一个内存中的东西。