前言
此讨论主要是来自于 chinaunix 中的一篇帖子
然后 这里 仅仅是写了一个 case 来复现这里的情况
以及 在不同的机器上面做了一些测试
核心是使用 panic 函数
测试模块
root@ubuntu:~/linux/linux-4.10.14# cat images/share/Test07KernelPanic.c
#include "linux/kernel.h"
#include "linux/init.h"
#include "linux/module.h"
#include "linux/sched.h"
#include "linux/fdtable.h"
#include "linux/fs_struct.h"
#include "linux/mm_types.h"
#include "linux/init_task.h"
#include "linux/types.h"
#include "linux/atomic.h"
MODULE_LICENSE("GPL");
static int __init
print_pcb(void)
{
printk("module_init ...\n");
panic(" kernel panic ... \n");
printk("module_init after ...\n");
return 0;
}
static void __exit
exit_pcb(void)
{
printk("module_exit ...\n");
}
module_init(print_pcb);
module_exit(exit_pcb);
在不同的机器上面 情况貌似还不太一样
这是 在正常的虚拟机上面执行, 之后 虚拟机直接 hang 住了
但是 其他的连接 会等待一会儿, 然后 自动退出连接
虚拟机的情况是 有一直 hang 在这里, 不响应任何操作, 只能 重启
在 qemu 启动的虚拟机中情况是 另外的情况
然后 之后 内核是一直在 panic 中的死循环
在真实的虚拟机中 dmesg –w 偶尔能够看到 Test07KernelPanic 的前面两行输出
这里能够看到 更加完整的输出
panic 中的死循环如下, 结合上下文来看 do_one_initcall 调用的下一个函数为 Test07KernelPanic.print_pcb, 接着是 0xffffffffa0005000 然后 接着是系统调用 panic
这里是前面的输出 “Kernel panic – not syncing: %s ” 相关
以及输出当前 堆栈信息, 寄存器 相关
完