2016-03-22 29 views
0

Ich habe diesen einfachen Modul habe ein Gerät zu handhaben und einen Teil seiner Power-Management-Methoden wie .suspend und .resume nennen. Bei seiner Initialisierung sucht das Modul einfach nach einem bestimmten Gerät und versucht, dessen Methoden aufzurufen.Wie wird diese dmesg Fehlermeldung verstanden?

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/device.h> 
#include <linux/pci.h> 

static int __init mfps_driver_init(void){ 

struct pci_dev *dev  = NULL; 
struct pci_driver *driver = NULL; 
struct device  *device = NULL; 

dev = pci_get_device(0x8086, 0x15a2, NULL); 

if((dev == NULL) || (dev == 0)){ 

    printk(KERN_INFO "LEONZO: NOTHING FOUND SIZE %ld\n", sizeof(dev)); 

} else { 

    driver = dev->driver; 

    printk(KERN_INFO "LEONZO: I FOUND THE DEVICE OF THE SIZE %ld\n", sizeof(dev)); 
    printk(KERN_INFO "LEONZO: HERE IS ITS DRIVER NAME %s\n", driver->name); 
    printk(KERN_INFO "LEONZO: CALLING IT SUSPEND METHOD\n"); 

    *device = dev->dev; 

    device_lock(device); 

    device_unlock(device); 
} 

return 0; 

} 

static void __exit mfps_driver_exit(void){ 

} 


module_init(mfps_driver_init); 
module_exit(mfps_driver_exit); 

Der Code erfolgreich kompiliert. Aber das ich einen Kernel Bug, wenn ich das Modul laden:

sudo insmod MyFirstPowerState.ko 

Und die dmesg zeigen die folgende Ausgabe

[ 59.545180] MyFirstPowerState: module license 'unspecified' taints kernel. 
[ 59.545183] Disabling lock debugging due to kernel taint 
[ 59.546010] LEONZO: I FOUND THE DEVICE OF THE SIZE 8 
[ 59.546012] LEONZO: HERE IS ITS DRIVER NAME e1000e 
[ 59.546013] LEONZO: CALLING IT SUSPEND METHOD 
[ 59.546021] BUG: unable to handle kernel NULL pointer dereference   at   (null) 
[ 59.546051] IP: [<ffffffffc011907e>] mfps_driver_init+0x7e/0x1000   [MyFirstPowerState] 
[ 59.546077] PGD 0 
[ 59.546085] Oops: 0002 [#1] SMP 
[ 59.546097] Modules linked in: MyFirstPowerState(POE+) xt_CHECKSUM arc4 iwlmvm mac80211 snd_hda_codec_hdmi snd_hda_codec_realtek iwlwifi snd_hda_codec_generic rtsx_pci_ms memstick cfg80211 nf_conntrack_netbios_ns nf_conntrack_broadcast ipt_MASQUERADE nf_nat_masquerade_ipv4 xt_tcpudp ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_conntrack ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw iptable_filter ip_tables x_tables dm_crypt hp_wmi sparse_keymap intel_rapl iosf_mbi x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm crct10dif_pclmul dm_multipath crc32_pclmul scsi_dh aesni_intel aes_x86_64 lrw gf128mul glue_helper ablk_helper cryptd joydev serio_raw lpc_ich uvcvideo snd_seq_midi snd_seq_midi_event snd_rawmidi snd_hda_intel snd_hda_controller snd_hda_codec videobuf2_vmalloc snd_hwdep shpchp snd_pcm videobuf2_memops videobuf2_core v4l2_common snd_seq e1000e(OE) i915_bpo ptp mei_me pps_core mei videodev media snd_seq_device intel_ips snd_timer drm_kms_helper drm btusb snd i2c_algo_bit soundcore 8250_fintek hp_accel lis3lv02d input_polldev tpm_infineon hp_wireless mac_hid parport_pc ppdev lp parport rfcomm bnep bluetooth binfmt_misc btrfs xor raid6_pq dm_mirror dm_region_hash dm_log uas usb_storage hid_generic usbhid hid rtsx_pci_sdmmc ahci psmouse libahci rtsx_pci wmi video 
[ 59.546577] CPU: 1 PID: 4180 Comm: insmod Tainted: P   OE 3.19.0-51-generiC#58~14.04.1-Ubuntu 
[ 59.546613] Hardware name: Hewlett-Packard HP EliteBook 840 G2/2216, BIOS M71 Ver. 01.05 03/26/2015 
[ 59.546648] task: ffff880241a7b110 ti: ffff880242f68000 task.ti: ffff880242f68000 
[ 59.546678] RIP: 0010:[<ffffffffc011907e>] [<ffffffffc011907e>] mfps_driver_init+0x7e/0x1000 [MyFirstPowerState] 
[ 59.546720] RSP: 0018:ffff880242f6bd18 EFLAGS: 00010246 
[ 59.546741] RAX: 0000000000000000 RBX: ffff880245b4d000 RCX: 00000000000000ae 
[ 59.546772] RDX: 0000000000000000 RSI: ffff880245b4d098 RDI: 0000000000000000 
[ 59.546807] RBP: ffff880242f6bd28 R08: 000000000000000a R09: 0000000000000000 
[ 59.546839] R10: 0000000000000d53 R11: ffff880242f6b9de R12: ffffffffc06a8000 
[ 59.546868] R13: 0000000000000000 R14: ffffffffc0119000 R15: ffff880242f6bef8 
[ 59.546900] FS: 00007f8787aa6740(0000) GS:ffff88024f440000(0000) knlGS:0000000000000000 
[ 59.546921] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
[ 59.546936] CR2: 0000000000000000 CR3: 0000000244393000 CR4: 00000000003407e0 
[ 59.546955] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 
[ 59.546978] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 
[ 59.547006] Stack: 
[ 59.547014] ffffffff81c1d060 ffff880204cd3280 ffff880242f6bda8 ffffffff81002144 
[ 59.547046] 0000000000000001 0000000000000002 ffff8801f8ddc4c0 0000000000000001 
[ 59.547079] ffff880242f6bd88 ffffffff811cef19 ffffffff810f7aac 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 
[ 59.547222] [<ffffffff810f7ae5>] load_module+0x1685/0x1cc0 
[ 59.547247] [<ffffffff810f3380>] ? store_uevent+0x40/0x40 
[ 59.547274] [<ffffffff810f8296>] SyS_finit_module+0x86/0xb0 
[ 59.547298] [<ffffffff817b788d>] system_call_fastpath+0x16/0x1b 
[ 59.547314] Code: c7 80 c0 4b c0 31 c0 e8 19 14 69 c1 48 c7 c7 a8 c0 4b c0 31 c0 e8 0b 14 69 c1 31 c0 48 8d b3 98 00 00 00 b9 ae 00 00 00 48 89 c7 <f3> a5 bf 60 00 00 00 e8 26 c7 69 c1 bf 60 00 00 00 e8 ac c5 69 
[ 59.547393] RIP [<ffffffffc011907e>] mfps_driver_init+0x7e/0x1000 [MyFirstPowerState] 
[ 59.547416] RSP <ffff880242f6bd18> 
[ 59.547425] CR2: 0000000000000000 
[ 59.554577] ---[ end trace 42e3b1c73677cdfa ]--- 

ich auch feststellen, dass es daher unmöglich ist, das Modul zu entfernen:

sudo rmmod MyFirstPowerState.ko 
rmmod: ERROR: Module MyFirstPowerState is in use 

Jede Idee, was dieser Code bedeutet und wie der Fehler zu beheben?

+0

Dies scheint nicht der Code zu sein, von dem Ihre Debug-Nachricht kam. "CALLING IT SUSPEND METHOD" Ich kann dieses Printk nirgends in Ihrem Quellcode finden. Nebenbei, nur weil es eine Nullzeiger-Dereferenzierung ist und die Tatsache, dass sowohl Treiber als auch Entwickler meine erste Schätzung auflösen, ist aus irgendeinem Grund dev-> dev == NULL. – arduic

+0

Wenn Sie jedoch fragen, wie Sie die von dmesg bereitgestellte Debug-Nachricht lesen können, sagen Sie es bitte, und ich schreibe Ihnen gerne etwas auf, um das Chaos zu erklären. – arduic

+0

@arduic, du hast Recht, ich verstehe nicht, was diese Debug-Nachricht bedeutet und wie man es ausnutzt. Ich habe die Frage entsprechend bearbeiten –

Antwort

4

Ich werde versuchen, die massive Wand des Textes zu erklären, die dmesg unten ist. Als Anmerkung sind die Werte in Klammern auf der linken Seite Zeiten, die ich mit dem vergessen habe, was genau sie in Bezug auf sie sind, aber für Sie sind sie nicht wirklich wichtig.

[59.545180] MyFirstPowerState: Modullizenz 'unspezifiziert' taints kernel. [59,545183] Deaktivieren Sperre Debuggen aufgrund Kernel taint

Dies ist, weil Sie kein Modul Lizenz erklären hat. Normalerweise werden Sie sehen, dass Leute so etwas in ihren Code im selben Abschnitt wie module_init schreiben.

MODULE_LICENSE("GPL"); 

[59,546010] LEONZO: I die Vorrichtung der Größe 8 [59,546012] LEONZO GEFUNDEN: HIER IST SEIN Treiber Name e1000e [59,546013] LEONZO: CALLING IT METHODE SUSPEND

Das sind Ihre printk-Nachrichten, die hier nichts besonderes sind.

[59,546021] BUG: nicht in der Lage Kernel NULL Pointer-Dereference an (null)

Hier ist, wo die Ursache für den Absturz zu behandeln tatsächlich lebt. Der Kernel hat versucht, einen NULL-Zeiger zu dereferenzieren, der einen Seg-Fehler verursacht. Für weitere Details zu dem, was genau das bedeutet, siehe here. Wie Ian in den Kommentaren bemerkte, sieht es so aus, als sei die Ursache Ihres Absturzes *device=dev->dev anstelle von device=dev->dev.. In dem Code haben Sie versucht, den Wert dev->dev auf device=NULL zu setzen, aber Sie haben versucht, NULL zu dereferenzieren, was zu einem Absturz führte .

[59,546051] IP: [] mfps_driver_init + 0x7e/0x1000 [MyFirstPowerState] [59,546648] Aufgabe: ffff880241a7b110 ti: ffff880242f68000 Aufgabe.ti: ffff880242f68000

Der Brocken von Fehlern innerhalb der oben enthaltenen haben nicht viel wertvoll für Sie zur Zeit und sind für Menschen, die ein Problem etwas und einige spezifische Benutzer bereitgestellt haben. Es enthält Dinge wie die installierte Hardware, das Modul, das den Absturz verursacht hat, und Module, die auch alle Dinge aufrufen, die in Ihrem Fall sehr bekannt sind.

[59,546678] RIP: 0010: [] [] mfps_driver_init + 0x7e/0x1000 [MyFirstPowerState] [59,547079] ffff880242f6bd88 ffffffff811cef19 ffffffff810f7aac 0000000000000018

Alles in diesem Abschnitt Montage Informationen, die, wenn Sie nicht Montage Erfahrung bedeutet nichts für Sie, obwohl ich vorschlagen würde, die Grundlagen, die es in diesen Fällen hilft wissen. Die obere Hälfte sind Register und ihre aktuellen Werte und die untere Hälfte ist der aktuelle Stapelrahmen.

> [ 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 

Alles innerhalb der Call-Trace kann besonders außerordentlich hilfreich sein, wenn das Modul lang und schwierig wird, mit Dingen wie Interrupts zu debuggen. Im Prinzip wird jeder einzelne Funktionsaufruf (oder ein anderes) aufgelistet, das das System zu diesem Absturz geführt hat. In deinem Fall, da du vom Ladenmodul direkt zum Absturz gegangen bist, hat die Ablaufverfolgung wirklich nur dein load_module, einige Wrapper und einige tiefe Systemaufrufe. Wenn Ihr Lademodul jedoch eine andere Funktion aufgerufen hat, die den Absturz verursacht hat, können Sie diesen Aufrufpfad hier sehen.

Das letzte kleine Bit scheint mehr Register zu sein.

Hoffentlich erklärte das die Textwand, die du von dmesg bekommst, wenn du ein Kernel-Problem verursachst (nicht sicher, ob das eine Panik ist, bitte korrigiere mich). Wenn es etwas gibt, das noch vage ist, werde ich versuchen es zu erklären, obwohl ich keineswegs ein Experte dafür bin.

+0

danke für diese detaillierte antwort. Kannst du eine gute Quelle für "Grundlagen der Montage" bereitstellen, von der du denkst, dass sie hier helfen können? –

+1

Ich kann Sie darauf hinweisen, wo ich die Montage gelernt habe, die hier war. https://www.youtube.com/watch?v=H4Z0S9ZbC0g Es ist ein bisschen alt und geschrieben für Intel X86, die es sieht aus wie Sie eine andere Architektur verwenden, würde ich AMD aber nicht sicher schätzen. Aber es lehrt immer noch die Grundlagen auf dem Call-Stack und andere wirklich nette Dinge. Es ist ein bisschen lang, aber wenn du dir das zweitägige Video anschaust und Notizen machst, würde ich sagen, dass du einen guten Überblick über die Montage haben wirst. – arduic