Linux kernel &引用;无法在null处处理内核null指针解除相关性";尝试修改驱动程序后

Linux kernel &引用;无法在null处处理内核null指针解除相关性";尝试修改驱动程序后,linux-kernel,kernel,panic,Linux Kernel,Kernel,Panic,我有一个在启动时初始化驱动程序的脚本,在我启用内核跟踪并重新编译内核以尝试用软件调试问题之前,该脚本工作得很好。如果我尝试以任何方式初始化驱动程序(modprobe、insmod等),此输出将打印到屏幕上: [ 26.263308] BUG: unable to handle kernel NULL pointer dereference at (null) [ 26.263322] IP: [<c108664d>] trace_module_notify+0x16b/0

我有一个在启动时初始化驱动程序的脚本,在我启用内核跟踪并重新编译内核以尝试用软件调试问题之前,该脚本工作得很好。如果我尝试以任何方式初始化驱动程序(modprobe、insmod等),此输出将打印到屏幕上:

[   26.263308] BUG: unable to handle kernel NULL pointer dereference at   (null)
[   26.263322] IP: [<c108664d>] trace_module_notify+0x16b/0x20a
[   26.263325] *pde = 00000000 
[   26.263329] Oops: 0000 [#1] PREEMPT SMP 
[   26.263335] Modules linked in: phddrv(O+)
[   26.263343] Pid: 704, comm: insmod Tainted: G           O 3.6.3-rt9 #21 Advanced     Digital Logic, Inc CB4053/ADLS15PC
[   26.263346] EIP: 0060:[<c108664d>] EFLAGS: 00010213 CPU: 0
[   26.263350] EIP is at trace_module_notify+0x16b/0x20a
[   26.263353] EAX: ee6e9274 EBX: f082550c ECX: ee6e920c EDX: f082550c
[   26.263356] ESI: 00000000 EDI: ee6e92dc EBP: ee6ebf4c ESP: ee6ebf24    
[   26.263359]  DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
[   26.263362] CR0: 8005003b CR2: 00000000 CR3: 2f2ea000 CR4: 000007d0
[   26.263365] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
[   26.263367] DR6: ffff0ff0 DR7: 00000400
[   26.263371] Process insmod (pid: 704, ti=ee6ea000 task=ef218000 task.ti=ee6ea000)
[   26.263372] Stack:
[   26.263381]  ee6e9274 ee6e9344 ee6e92dc ee6e920c ee6e9274 ee6e9344 c2086424 c15a5d58
[   26.263388]  00000000 00000001 ee6ebf68 c1046d33 f082550c c15a51bc c15a3778 00000000
[   26.263396]  c15a3790 ee6ebf8c c1046fa9 fffffffd 00000000 f082550c 00000001 f082550c
[   26.263397] Call Trace:
[   26.263407]  [<c1046d33>] notifier_call_chain+0x2b/0x4d
[   26.263413]  [<c1046fa9>] __blocking_notifier_call_chain+0x3c/0x51
[   26.263419]  [<c1046fcf>] blocking_notifier_call_chain+0x11/0x13
[   26.263426]  [<c10671b7>] sys_init_module+0x57/0x190
[   26.263434]  [<c13a3d10>] sysenter_do_call+0x12/0x26
[   26.263489] Code: 00 c7 42 04 64 5d 5a c1 89 15 64 5d 5a c1 89 45 ec 8d 42 74 83 c2 0c 89 45 e8 89 55 e4 eb 19 57 8b 4d e4 89 da ff 75 ec ff 75 e8 <8b> 06 83 c6 04 e8 c2 fb ff ff 83 c4 0c 3b 75 f0 72 e2 eb 77 b8
[   26.263495] EIP: [<c108664d>] trace_module_notify+0x16b/0x20a SS:ESP 0068:ee6ebf24
[   26.263497] CR2: 0000000000000000
[   26.267381] ---[ end trace 0000000000000002 ]---
[26.263308]错误:无法在(NULL)处处理内核空指针取消引用
[26.263322]IP:[]跟踪模块通知+0x16b/0x20a
[26.263325]*pde=00000000
[26.263329]Oops:0000[#1]抢占SMP
[26.263335]链接到的模块:phddrv(O+)
[26.263343]Pid:704,通信:insmod污染:GO 3.6.3-rt9#21高级数字逻辑公司CB4053/ADLS15PC
[26.263346]EIP:0060:[]EFLAGS:00010213 CPU:0
[26.263350]EIP位于跟踪模块通知+0x16b/0x20a处
[26.263353]EAX:ee6e9274 EBX:f082550c ECX:ee6e920c EDX:f082550c
[26.263356]ESI:00000000 EDI:ee6e92dc EBP:ee6ebf4c ESP:ee6ebf24
[26.263359]DS:007b ES:007b FS:00d8 GS:0033 SS:0068
[26.263362]CR0:8005003b CR2:00000000 CR3:2F2EA000CR4:000007d0
[26.263365]DR0:00000000 DR1:00000000 DR2:00000000 DR3:00000000
[26.263367]DR6:ffff0ff0 DR7:00000400
[26.263371]进程insmod(pid:704,ti=ee6ea000任务=ef218000任务。ti=ee6ea000)
[26.263372]堆栈:
[26.263381]ee6e9274 ee6e9344 ee6e92dc ee6e920c ee6e9274 ee6e9344 c2086424 c15a5d58
[26.263388]00000000000001 ee6ebf68 c1046d33 f082550c c15a51bc c15a3778 00000000
[26.263396]c15a3790 ee6ebf8c c1046fa9 FFFFFFF D 00000000 f082550c 0000000 1 f082550c
[26.263397]呼叫跟踪:
[26.263407][]通知程序调用链+0x2b/0x4d
[26.263413][]阻塞通知程序调用链+0x3c/0x51
[26.263419][]阻止通知程序调用链+0x11/0x13
[26.263426][]系统初始化模块+0x57/0x190
[26.263434][]sysenter\u do\u call+0x12/0x26
[26.263489]代码:00 c7 42 04 64 5d 5a c1 89 15 64 5d 5a c1 89 45 ec 8d 42 74 83 c2 0c 89 45 e8 89 55 e4 eb 19 57 8b 4d e4 89 da ff 75 ec ff 75 e8 06 83 c6 04 e8 c2 fb ff 83 c4 0c 3b 75 f0 72 e2 eb 77 b8
[26.263495]EIP:[]跟踪模块通知+0x16b/0x20a SS:ESP 0068:ee6ebf24
[26.263497]CR2:0000000000000000
[26.267381]--[end trace 0000000000002]---

任何关于正在发生的事情的提示都将不胜感激

驱动程序中的某个地方有一个
NULL
指针。指针变量的值
NULL
,驱动程序正在尝试使用它

myPtr->value;   /* if myPtr is NULL, this will raise the kernel oops */

您必须调试驱动程序,以找到在驱动程序中某个地方存在空指针的位置和原因。指针变量的值
NULL
,驱动程序正在尝试使用它

myPtr->value;   /* if myPtr is NULL, this will raise the kernel oops */

您必须调试驱动程序以找到空指针的位置和原因。我遇到了与您类似的问题(几乎相同的堆栈恐慌跟踪)。 我这边的根本原因是,在我更改了内核配置(启用跟踪点)之后,我只重建了内核bzImage,但忘记了重建ko模块!这可能会导致新内核和旧ko模块之间的执行不匹配。
在重建和更新内核映像和ko模块后,问题消失了。

我遇到了与您类似的问题(几乎相同的堆栈死机痕迹)。 我这边的根本原因是,在我更改了内核配置(启用跟踪点)之后,我只重建了内核bzImage,但忘记了重建ko模块!这可能会导致新内核和旧ko模块之间的执行不匹配。 重建和更新内核映像和ko模块后,问题就消失了。

请仔细检查如何调用trace\u module\u notify()函数。同时发布模块的源代码以获得进一步帮助。请仔细检查如何调用trace_module_notify()函数。同时发布模块的源代码以获得进一步帮助。