2016-03-22 5 views
0

私はデバイスを扱い、.suspend.resumeのような電力管理方法のいくつかを呼び出すために、この単純なモジュールを書いています。初期化時に、モジュールは特定のデバイスを簡単に検索し、そのメソッドを呼び出そうとします。このdmesgエラーメッセージを理解するにはどうすればよいですか?

#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); 

コードが正常にコンパイルされます。私はモジュールをロードするときしかし、私はカーネルのバグを取得:

sudo insmod MyFirstPowerState.ko 

そしてdmesgの出力は、次のとおり

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

を示して、私はまた、モジュールを削除することは不可能であることに気づく:

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

このコードの意味と解決方法については、

+0

これは、デバッグメッセージの発信元コードではないようです。 「呼び出しを中止する方法」このprintkはソースコードのどこにも見つかりません。とにかくそれがヌルポインタ逆参照であることと、driverとdevの両方が私の最初の推測を解決しているという事実に基づいていることは何らかの理由でdev-> dev == NULLです。 – arduic

+0

しかし、dmesgが提供するデバッグメッセージの読み方を尋ねている場合は、そう言いましょう。 – arduic

+0

@arduic、そうです、私はこのデバッグメッセージの意味とそれを悪用する方法を理解していません。私はそれに応じて質問を編集しました –

答えて

4

私は、巨大なテキストの壁を説明しようとしています。左の角括弧内の値は、正確に何が関係しているかを忘れている時ですが、あなたにとっては本当に重要ではありません。

[59.545180] MyFirstPowerState:モジュールライセンス '未指定'のカーネル。 [59.545183]あなたはモジュールのライセンスを宣言していなかったので、これがあるため、カーネルの汚染に

をロックデバッグを無効にします。通常、あなたは、人々は、module_initと同じセクションのコードにこれを入れます。

MODULE_LICENSE("GPL"); 

[59.546010] LEONZO:私はSIZE 8 [59.546012] LEONZOの器具が見つかりました:HERE ITSドライバ名のe1000e IS [59.546013] LEONZO:ITは

方法をSUSPEND CALLINGこれらはあなたのprintkメッセージです。

[59.546021] BUG:(null

ここ

あなたのクラッシュの原因は、実際に住んでいる時にカーネルNULLポインタ参照を処理できません。カーネルは、segフォルトを引き起こすNULLポインタを逆参照しようとしました。正確に意味するものの詳細については、hereを参照してください。イアンは以前のコメントで指摘したように、クラッシュの原因のように見えます。device=dev->dev.の代わりに*device=dev->devを入れました。コードではに値のデバイスポイントを割り当てようとしましたが、現在はdevice=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] ffff880242f6bd88 ffffffff811cef19 ffffffff810f7aac 0000000000000018

このセクションのすべては、あなたが持っている場合は、アセンブリ情報はnoですアセンブリの経験はあなたに何の意味もありませんが、私はこれらの場合に役立つ基礎を知ることを提案します。上半分はレジスタとその現在の値で、下半分は現在のスタックフレームです。

特に、モジュールが長くなり、割り込みのようなものでデバッグするのが困難になった場合、コールトレース内のすべてが非常に役立ちます。基本的には、システムがこのクラッシュに至るまでに行ったすべての単一の関数呼び出し(またはその他の方法)をリストしています。あなたのケースでは、ロードモジュールからクラッシュにまっすぐに進んだので、トレースには実際にはいくつかのラッパーと深いシステムコールとともにload_moduleしかありません。しかし、あなたのロードモジュールが別の関数を呼び出し、クラッシュを引き起こしたとすると、ここでこの呼び出しパスを見ることができます。

最後の小さなビットはより多くのレジスタのようです。

うまくいけば、カーネルの問題が発生したときにdmesgから得たテキストの壁を説明してくれることを願っています。まだ曖昧なことがあれば、私は決して説明するつもりはありませんが、私は決してこれに関する専門家ではありません。

+0

この忌々しい答えに感謝します。ここで助けになると思われる「組立の基礎」に良いリソースを提供できますか? –

+1

私はここにいた組立を学んだところを指摘することができます。 https://www.youtube.com/watch?v=H4Z0S9ZbC0g少し古いとIntel X86用に書かれていますが、私はAMDとは違うアーキテクチャを使っているようですが、確かにはわかりません。しかし、それはまだ呼び出しスタックと他の本当に素晴らしいものの基本を教えています。もう少し長いですが、2日間のビデオを見て、メモを取ってみると、私はあなたが組立に関してまともな把握をすると言います。 – arduic

関連する問題