0

我有一个带有有意空指针访问的示例驱动程序。当我加载驱动程序时,带有 4.15.0-55-generic 内核的 ubunut 18.04 没有在 dmesg 或 dmesg -w 或 /var/log/kern.log 文件中显示任何堆栈跟踪。

我有其他具有相同配置的 Ubuntu 系统,它没有挂起,并且在 dmesg 或 /var/log/kern.log 中显示正确的内核 oops。

我想准确地解决问题是什么原因以及什么设置使内核永远挂起。

我尝试重新安装 linuxcrashdump kdump 和 kexec-tools。但问题仍然存在。

后来,我比较了工作的 Ubuntu 和不工作的 Ubuntu。在工作系统中,没有Linux-crashdump、kdump-tools 和kexec-tools。

4

2 回答 2

0

也许在内核中,标志CONFIG_DEBUG_INFO没有打开或syslogd没有运行。在我的 ubuntu 系统中工作正常

  1 #include <linux/kernel.h>                                                                                                                                                
  2 #include <linux/module.h>
  3 #include <linux/init.h>
  4 
  5 static void create_oops() {
  6         *(int *)0 = 0;
  7 }
  8 
  9 static int __init my_oops_init(void) {
 10                 printk("oops from the module\n");
 11                         create_oops();
 12                                return (0);
 13 }
 14 static void __exit my_oops_exit(void) {
 15                 printk("Goodbye world\n");
 16 }
 17 
 18 module_init(my_oops_init);
 19 module_exit(my_oops_exit);
~                              

生成文件

  1 obj-m   := oops.o                                                                                                                                                        
  2 KDIR    := /lib/modules/$(shell uname -r)/build
  3 PWD     := $(shell pwd)
  4 SYM=$(PWD)
  5 KBUILD_CFLAGS   += -Wno-error=strict-prototypes
  6 all:
  7         $(MAKE) -k -C $(KDIR) SUBDIRS=$(PWD)  modules

⋊&gt; uname -a 
Linux zjp 4.18.0-25-generic #26-Ubuntu SMP Mon Jun 24 09:32:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

4402 Aug 13 19:56:01 zjp kernel: [117908.066176] oops: loading out-of-tree module taints kernel.                                                                            
4403 Aug 13 19:56:01 zjp kernel: [117908.066180] oops: module license 'unspecified' taints kernel.                                                                          
4404 Aug 13 19:56:01 zjp kernel: [117908.066181] Disabling lock debugging due to kernel taint                                                                               
4405 Aug 13 19:56:01 zjp kernel: [117908.066242] oops: module verification failed: signature and/or required key missing - tainting kernel                                  
4406 Aug 13 19:56:01 zjp kernel: [117908.066491] oops from the module
4407 Aug 13 19:56:01 zjp kernel: [117908.066498] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000                                                  
4408 Aug 13 19:56:01 zjp kernel: [117908.066503] PGD 0 P4D 0

于 2019-08-13T12:47:04.373 回答
0

也许在内核中,标志CONFIG_DEBUG_KERNEL 没有打开。但无论如何,这不太可能是内核本身的问题。

我在驱动程序开发中经常使用printk 。当您加载驱动程序时,它会在控制台上正常显示信息。我建议在驱动程序的 init 以及关键行之前和之后放置一个 printk。因此,您将看到代码执行了多远。

printk(KERN_ERR "Reached init of my driver");
...
printk(KERN_ERR "Reached open device");
...

使用KERN_xxx,您可以设置严重性。当你开始时,选择一个高的。它必须被设置。除此之外,它的工作方式类似于printf

于 2019-08-13T07:11:05.993 回答