今天測試編寫的核心模組進行檔案讀寫,結果失敗。通過dmesg檢視核心輸出,結果如下:
[37725.645804] i am here! and the user buf size is 1024
[37725.645812] the last data record position: 4096
current postion:0
[37725.645818] buff size 8
[37725.647660] bug: unable to handle kernel paging request at 0000000001955600
[37725.647690] ip: mid+0xc/0x80 [episode]
[37725.647696] pgd 8000000009f8b067 p4d 8000000009f8b067 pud 4df81067 pmd e0f8067 pte 8000000090fa0867
[37725.647711] oops: 0001 [#1] smp pti
[37725.649451] modules linked in: episode(oe) rfcomm bnep coretemp crct10dif_pclmul crc32_pclmul snd_ens1371 snd_ac97_codec ghash_clmulni_intel gameport ac97_bus snd_pcm pcbc snd_seq_midi snd_seq_midi_event aesni_intel aes_x86_64 vmw_balloon crypto_simd glue_helper cryptd intel_rapl_perf snd_rawmidi input_leds joydev serio_raw btusb btrtl btbcm snd_seq snd_seq_device snd_timer btintel bluetooth snd ecdh_generic soundcore shpchp i2c_piix4 vmw_vsock_vmci_transport mac_hid vsock vmw_vmci binfmt_misc parport_pc ppdev lp parport autofs4 hid_generic usbhid hid psmouse vmwgfx ttm drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ahci drm mptspi libahci mptscsih mptbase e1000 scsi_transport_spi pata_acpi [last unloaded: episode]
[37725.649732] cpu: 0 pid: 17208 comm: a.out tainted: g oe 4.15.0-72-generic #81~16.04.1-ubuntu
[37725.649739] hardware name: vmware, inc. vmware virtual platform/440bx desktop reference platform, bios 6.00 07/02/2015
[37725.649761] rip: 0010:mid+0xc/0x80 [episode]
[37725.649768] rsp: 0018:ffffb94ac5697e28 eflags: 00010246
[37725.649777] rax: 0000000000000000 rbx: 0000000000000002 rcx: 0000000000000004
[37725.649783] rdx: 0000000000000000 rsi: 0000000001955600 rdi: ffffb94ac5697e5c
[37725.649789] rbp: ffffb94ac5697e90 r08: 0000000000000001 r09: 00000000000008cd
[37725.649795] r10: ffff8e9a5a8ff180 r11: 00000000000008cd r12: 0000000000000000
[37725.649801] r13: 0000000000000000 r14: 0000000000000000 r15: ffff8e9a5a8ff180
[37725.649809] fs: 00007f7c95277700(0000) gs:ffff8e9afa600000(0000) knlgs:0000000000000000
[37725.649814] cs: 0010 ds: 0000 es: 0000 cr0: 0000000080050033
[37725.649820] cr2: 0000000001955600 cr3: 000000000f48e003 cr4: 00000000003606f0
[37725.650020] call trace:
[37725.651102] ? episode_direct_write+0x13a/0x220 [episode]
[37725.652434] __vfs_write+0x1b/0x40
[37725.652458] vfs_write+0xb8/0x1b0
[37725.652467] ? do_sys_open+0x1b4/0x290
[37725.652477] sys_write+0x5c/0xe0
[37725.653225] do_syscall_64+0x73/0x130
[37725.653859] entry_syscall_64_after_hwframe+0x3d/0xa2
上面是擷取的一段內容。最後面的call trace顯示了出錯的地方的呼叫過程。
其中最後出錯在episode_direct_write函式。出錯的地方在0x13a,這裡指的是episode_direct_write編譯成機器碼後的長度為0x220位元組中的位置0x13a。
但要想確認到底錯在**了,就比較麻煩了。因為我不知道編譯成的機器碼長什麼樣,即使知道了,我可能也看不懂啊。
對於以下例子:
call trace:
[<123>] a+0x8/0x10
[<234>] b+0x0/0x10
a具體出錯的函式,0x10是a編譯成機器碼後的長度,0x8是出錯的指令在a裡的偏移。
Linux核心模組
核心模組 在整個啟動的過程中,是否能成功的驅動我們主句的硬體裝置,是核心完成的工作,而核心一般都是壓縮文件,在使用之前核心之前必須要將核心減壓到的記憶體中。為了應對日新月異的硬體,目前核心都具有可讀取模組化驅動程式的功能,也就是所謂的 modules模組化 所謂模組化。核心與核心模組放在 核心 bo...
Linux核心模組
1 核心模組註冊登出 塊載入函式有返回值,模組解除安裝函式無返回值。兩者都是無參函式,載入函式用 init修飾,解除安裝函式用 exit修飾。define init attribute section init.text define exit atrribute section exit,text...
Linux 核心模組
linux 核心模組程式結構 1 模組載入函式 2 模組解除安裝函式 3 模組許可證宣告 4 模組引數 5 模組匯出符號 6 模組作者等資訊宣告 模組載入函式 一般以 init 標識 在 linux 中,所有標識為 init 的函式如果直接編譯進核心,成為核心映象的一部分,在連線的時候都會放在 in...