簡體   English   中英

使用內聯匯編將中斷 11 提升到內核模塊時出錯

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM