我将尝试解释下面 dmesg 的大量文字。需要注意的是,左边括号中的值有时我会忘记它们到底是什么关系,但对你来说它们并不重要。
[59.545180] MyFirstPowerState:模块许可证“未指定”污染了内核。
[59.545183]由于内核污染而禁用锁定调试
这是因为您没有声明模块许可证。通常你会看到人们在他们的代码中将这样的东西放在与 module_init 相同的部分中。
MODULE_LICENSE("GPL");
[ 59.546010] 莱昂佐:我找到了 8 号设备
[59.546012]LEONZO:这是它的驱动程序名称 e1000e
[59.546013]LEONZO:调用它的暂停方法
这些是你的 printk 消息,这里没什么特别的。
[59.546021]BUG:无法处理内核NULL
指针取消引用位于 (null
)
这就是导致崩溃的真正原因所在。内核尝试取消引用 NULL 指针,这会导致段错误。有关这到底意味着什么的更多详细信息,请参阅here。正如伊恩在之前的评论中指出的那样,看起来你崩溃的原因是你把*device=dev->dev
代替device=dev->dev.
在您尝试将值设备点分配给的代码中dev->dev
然而自从device=NULL
当前您尝试取消引用 NULL 导致崩溃。
[59.546051]IP:[]mfps_driver_init+0x7e/0x1000[MyFirstPowerState]
[59.546648]任务:ffff880241a7b110 ti:ffff880242f68000任务.ti:ffff880242f68000
上述错误中包含的大部分错误目前对您来说没有多大价值,而对于已经部署了某些内容并且某些特定用户遇到问题的人来说更有价值。它列出了诸如安装的硬件、导致崩溃的模块以及调用您的情况下众所周知的所有内容的模块等内容。
[59.546678]RIP:0010:[][]mfps_driver_init+0x7e/0x1000[MyFirstPowerState][59.547079]ffff880242f6bd88ffffffff811cef19ffffffff810f7aac 0000000000000018
本节中的所有内容都是装配信息,如果您没有装配经验,那么这些信息对您来说毫无意义,尽管我建议了解基础知识,它在这些情况下确实有帮助。上半部分是寄存器及其当前值,下半部分是当前堆栈帧。
> [ 59.547114] Call Trace:
[ 59.547131] [<ffffffff81002144>] do_one_initcall+0xd4/0x210
[ 59.547162] [<ffffffff811cef19>] ? kmem_cache_alloc_trace+0x199/0x220
[ 59.547194] [<ffffffff810f7aac>] ? load_module+0x164c/0x1cc0
调用跟踪中的所有内容都非常有用,尤其是当模块变得很长且难以通过中断等方式进行调试时。基本上,它列出了系统导致此崩溃的每个函数调用(或其他方式)。在您的情况下,自从您从加载模块直接进入崩溃以来,跟踪实际上只有您的 load_module 以及一些包装器和一些深层系统调用。但是,如果您的加载模块调用了另一个函数并导致崩溃,您可以在此处看到此调用路径。
最后一点似乎是更多的寄存器。
希望这解释了当您引起内核问题时从 dmesg 获得的文本墙(不确定这是否是恐慌,请纠正我)。如果有什么仍然模糊的地方,我会尽力解释,尽管我绝不是这方面的专家。