kernel crash 解析手段
时间: 2023-04-02 09:01:18 浏览: 245
对于 kernel crash 的解析手段,可以通过以下步骤进行:
1. 收集 kernel crash 的信息,包括 crash 的时间、操作系统版本、硬件配置等信息。
2. 分析 kernel crash 的日志,查看是否有明显的错误信息,如内存溢出、空指针引用等。
3. 使用调试工具,如 gdb,对 kernel crash 进行调试,查看程序执行过程中的变量值、函数调用栈等信息。
4. 对 kernel crash 进行重现,尝试找出导致 crash 的具体操作或代码。
5. 根据分析结果,修复代码或调整系统配置,以避免类似的 kernel crash 发生。
希望以上信息能对您有所帮助。
相关问题
crashkernel
Crashkernel是在Linux系统中用于保存系统崩溃信息的一段内存区域。当系统发生不可恢复的错误或崩溃时,crashkernel可以保存当前的内存映像、内核堆栈和寄存器等信息,以便开发人员进行问题分析和调试。在一些关键的生产环境中,使用crashkernel非常重要,可以帮助管理员更快速地诊断和解决故障。
解析linux内核的reserve_crashkernel函数,对源码进行注释解析
/* Linux内核中reserve_crashkernel函数的定义 */
int __init reserve_crashkernel(void)
{
unsigned long long crash_size;
unsigned long long start_crashkernel, end_crashkernel;
unsigned long long start_pfn, end_pfn;
int ret = 0;
unsigned long flags;
/*
* 如果已经设置了crashkernel的参数,则使用该参数的值;
* 否则默认使用2个物理页的大小作为crashkernel的大小。
*/
if (!crashk_res.start && !crashk_res.end) {
crash_size = 2 * (unsigned long long)PAGE_SIZE;
printk(KERN_INFO "Reserving %lluMB of memory at %lluMB for crashkernel (System RAM: %lluMB)\n",
crash_size >> 20, PFN_PHYS(max_pfn) >> 20, PFN_PHYS(max_pfn) >> 20);
} else {
crash_size = PFN_PHYS(crashk_res.end - crashk_res.start + 1);
printk(KERN_INFO "Reserving %lluMB of memory at %lluMB for crashkernel (System RAM: %lluMB)\n",
crash_size >> 20, PFN_PHYS(crashk_res.start) >> 20, PFN_PHYS(max_pfn) >> 20);
}
/* 获取crashkernel的起始地址和结束地址 */
start_crashkernel = PFN_PHYS(crashk_res.start);
end_crashkernel = start_crashkernel + crash_size;
/* 获取start_crashkernel和end_crashkernel所对应的物理页框号 */
start_pfn = start_crashkernel >> PAGE_SHIFT;
end_pfn = end_crashkernel >> PAGE_SHIFT;
/* 如果crashkernel的结束地址超过了系统的最大物理地址,则返回错误 */
if (end_pfn > max_pfn) {
printk(KERN_ERR "crashkernel reservation failed - memory beyond limit of %llx\n",
(unsigned long long)max_pfn << PAGE_SHIFT);
return -EINVAL;
}
/* 设置crashkernel所在的物理页框为Reserved类型 */
for (; start_pfn < end_pfn; start_pfn++) {
SetPageReserved(pfn_to_page(start_pfn));
num_poisoned_pages++;
}
/*
* 设置crashkernel的保留区域不能被swap out,这样可以确保crashkernel的
* 内存不会被清空。
*/
flags = VM_RESERVED | VM_READ | VM_WRITE | VM_PFNMAP | VM_IOREMAP;
if (mmap_write_lock_killable(mm))
return -EINTR;
vma = mmap(NULL, crash_size, PROT_NONE, flags, -1, 0);
if (IS_ERR(vma)) {
printk(KERN_ERR "crashkernel: Can't reserve %lluMB of memory at %llx\n",
crash_size >> 20, start_crashkernel);
ret = -ENOMEM;
goto out;
}
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
vma->vm_private_data = &crash_pfn;
vma->vm_ops = &crash_mmap_ops;
ret = 0;
out:
mmap_write_unlock(mm);
return ret;
}
/*
reserve_crashkernel函数的作用是为crashkernel保留一段物理内存区域,并将该区域的物理页框设置为Reserved类型。
该函数会先判断是否已经设置了crashkernel的参数,如果没有,则默认使用2个物理页的大小作为crashkernel的大小。
然后获取crashkernel所占用的物理内存的起始地址和结束地址,并将其所对应的物理页框设置为Reserved类型。
最后,设置crashkernel的保留区域不能被swap out,这样可以确保crashkernel的内存不会被清空。
*/
阅读全文