Ядро Ubuntu зависает при OOPS, не показывая трассировку стека в dmesg или /var/log/kern.log
У меня есть образец драйвера с преднамеренным доступом к нулевому указателю. Когда я загружаю драйвер, мой ubunut 18.04 с общим ядром 4.15.0-55 не показывает никакой трассировки стека в dmesg или dmesg -w или в файле /var/log/kern.log.
У меня есть другая система Ubuntu с тем же конфигом, где она не зависает и показывает правильные ошибки ядра в dmesg или /var/log/kern.log.
Я хочу, чтобы решить проблему именно то, что вызывает и какие настройки заставляет ядро зависать навсегда.
Я попробовал переустановить linuxcrashdump kdump и kexec-tools. Но проблема все еще есть.
Позже я сравниваю с работающей Ubuntu и не работающей Ubuntu. В работающей системе нет Linux-crashdump, kdump-tools и kexec-tools.
2 ответа
Возможно, в ядре флаг 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);
~
Makefile
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
⋊> 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
Возможно, в ядре флаг CONFIG_DEBUG_KERNEL не включен. Но, во всяком случае, это не проблема самого ядра.
Я много использовал printk в разработке драйверов. Как правило, информация отображается на консоли, когда вы загружаете драйвер. Я рекомендую поставить принтк в init вашего драйвера и до и после критических строк. Следовательно, вы увидите, как далеко выполняется код.
printk(KERN_ERR "Reached init of my driver");
...
printk(KERN_ERR "Reached open device");
...
С KERN_xxx вы можете установить серьезность. Когда вы начнете, выберите высокий. Это должно быть установлено. Помимо этого он работает как printf.