перехват прерываний ядра Linux - PullRequest
0 голосов
/ 23 ноября 2011

Итак, моей последней домашней работой в ядре было перехватить прерывание, заменив адрес обработчика прерываний в IDT на адрес моей собственной процедуры перехвата. Мой модуль работает правильно; однако всякий раз, когда у меня есть оператор печати в моей подпрограмме угона, я получаю ядро ​​опа или панику. Так что, думаю, мне интересно, есть ли у кого-нибудь объяснение этому или есть способ отладить его? Я использую ядро ​​3.0.4, и вот некоторые сообщения об ошибках, которые я получаю

[ 2479.355359] general protection fault: 0000 [#2] SMP 
[ 2479.356972] Modules linked in: get_idt(P) cryptd aes_i586 aes_generic binfmt_misc pci_stub vboxpci vboxnetadp vboxnetflt vboxdrv nouveau ttm drm_kms_helper drm i2c_algo_bit mxm_wmi parport_pc ppdev snd_hda_codec_analog joydev pcmcia snd_hda_intel snd_hda_codec snd_hwdep snd_pcm arc4 snd_seq_midi yenta_socket pcmcia_rsrc pcmcia_core snd_rawmidi r852 sm_common nand nand_ids nand_ecc video ath5k ath snd_seq_midi_event mac80211 snd_seq snd_timer cfg80211 btusb snd_seq_device bluetooth psmouse thinkpad_acpi tpm_tis serio_raw sdhci_pci firewire_ohci sdhci mtd firewire_core crc_itu_t tpm tpm_bios nvram snd e1000e lp parport soundcore snd_page_alloc [last unloaded: get_idt]
[ 2479.358225] 
[ 2479.358225] Pid: 2872, comm: float Tainted: P      D     3.0.0 #46 LENOVO 64574JU/64574JU
[ 2479.358225] EIP: 0060:[<c1049244>] EFLAGS: 00210046 CPU: 0
[ 2479.358225] EIP is at vprintk+0x64/0x4a0
[ 2479.358225] EAX: ffffffff EBX: 00000000 ECX: 00000000 EDX: 00000000
[ 2479.358225] ESI: f0143fd8 EDI: 00000000 EBP: f0143fbc ESP: f0143f44
[ 2479.358225]  DS: 007b ES: 007b FS: 0000 GS: 00e0 SS: 0068
[ 2479.358225] Process float (pid: 2872, ti=f0142000 task=f08df230 task.ti=f0142000)
[ 2479.358225] Stack:
[ 2479.358225]  f08df230 f0398ab8 f0398a80 00000004 00200046 b7651c10 c10ff884 f84bd024
[ 2479.358225]  f0398a80 f0143f98 c1100889 ffffffef 00000004 ef85e7f4 f0398a84 ef85e9a0
[ 2479.358225]  b7799000 ef85e7e8 f0398a80 f0398ab8 b7788000 f0143fac c1101c9b b7783ff4
[ 2479.358225] Call Trace:
[ 2479.358225]  [<c10ff884>] ? remove_vma+0x44/0x60
[ 2479.358225]  [<c1100889>] ? do_munmap+0x1f9/0x270
[ 2479.358225]  [<c1101c9b>] ? sys_munmap+0x4b/0x60
[ 2479.358225]  [<c1516760>] ? spurious_fault+0xd0/0xd0
[ 2479.358225]  [<c1510af6>] printk+0x30/0x32
[ 2479.358225]  [<f84bc028>] take_over+0x28/0x30 [get_idt]
[ 2479.358225]  [<f84bc03e>] hijack+0x6/0x18 [get_idt]
[ 2479.358225] Code: 78 c1 00 0f 84 29 03 00 00 8b 1d ac 94 78 c1 85 db 0f 85 a6 03 00 00 9c 58 8d 74 26 00 89 45 98 fa 90 8d 74 26 00 a1 f4 6d 73 c1 
[ 2479.358225]  8b 15 c0 30 83 c1 89 55 9c 39 c2 0f 84 9f 03 00 00 b8 a0 d6 
[ 2479.358225] EIP: [<c1049244>] vprintk+0x64/0x4a0 SS:ESP 0068:f0143f44
[ 2479.358225] ---[ end trace bae1cb37e149735b ]---

и вот моя процедура угона, которая выдает мне ошибку:

asmlinkage void take_over(void) {
    printk("Divide by 0 has been hijacked\n");
}

Я создал другую подпрограмму для работы с целым числом, которая работала правильно, но я хотел бы, чтобы подпрограмма содержала оператор print.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Может ли быть так, что эти конкретные нажатия клавиш требуют особой обработки, и, возвращая IRQ_HANDLED, ядро ​​не вызывает другой общий обработчик? Вы пытались вернуть IRQ_NONE?

0 голосов
/ 28 ноября 2011

В вызовах printk должен стоять префикс KERN_*.Поэтому, пожалуйста, попробуйте:

 printk(KERN_INFO "Divide by 0 has been hijacked\n");

Да, это точно: между KERN_INFO и строкой нет запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...