[英]Error while raising interrupt 11 with inline asm into kernel module
我正在嘗試在內核模塊 LKM 中使用內聯 asm 引發中斷 11
asm("int $0x3B");
但是在這一行之后,我在 dmesg 中閱讀了
do_IRQ: 1.59 No irq handler for vector
這是我從網站https://embetronicx.com/tutorials/linux/device-drivers/linux-device-driver-tutorial-part-13-interrupt-example-program-in-linux-kernel/獲取的驅動程序代碼當我嘗試執行“cat /dev/etx_device”時,我得到了 dmesg
do_IRQ: 1.59 No irq handler for vector
我的內核版本是 5.1.20-200.fc29.x86_64 AMD 處理器。 問題是什么?
cat /proc/interrupts:
CPU0 CPU1
0: 110 0 IO-APIC 2-edge timer
8: 1 0 IO-APIC 8-edge rtc0
9: 0 0 IO-APIC 9-fasteoi acpi
11: 0 0 IO-APIC 11-edge etx_device
這曾經適用於較舊的內核版本,但在更高版本上失敗。 原因是通用 IRQ 處理程序 do_IRQ() 已更改以獲得更好的 IRQ 處理性能。 它不是使用 irq_to_desc() 函數來獲取 IRQ 描述符,而是從每個 CPU 的數據中讀取它。 描述符在物理設備初始化期間放在那里。 由於這個偽設備驅動程序沒有物理設備,所以 do_IRQ() 在那里找不到它並返回一個錯誤。 如果我們想使用軟件中斷來模擬 IRQ,我們必須首先將 IRQ 描述符寫入 per-CPU 數據。 不幸的是,符號 vector_irq,每個 CPU 數據中的 IRQ 描述符數組,在內核編譯期間沒有導出到內核模塊。 改變它的唯一方法是重新編譯整個內核。 如果您認為值得付出努力,可以添加以下行:
EXPORT_SYMBOL (vector_irq);
在文件中: arch/x86/kernel/irq.c
在所有包含行之后。 從新編譯的內核編譯和引導后,按如下方式更改您的驅動程序:
添加一個包含行:
#include <asm/hw_irq.h>
將讀取功能更改為:
static ssize_t etx_read(struct file *filp,
char __user *buf, size_t len, loff_t *off)
{
struct irq_desc *desc;
printk(KERN_INFO "Read function\n");
desc = irq_to_desc(11);
if (!desc) return -EINVAL;
__this_cpu_write(vector_irq[59], desc);
asm("int $0x3B"); // Corresponding to irq 11
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.