簡體   English   中英

IRQ 8 request_irq,不允許操作

[英]IRQ 8 request_irq, Operation not permitted

我是內核模塊開發的新手,在我的學習過程中,我轉向了中斷。 我的任務是為IRQ 8編寫一個中斷處理程序模塊,它將簡單地計算在這一行上發生的中斷的數量並將值存儲在kobject中。 乍一看,這項任務聽起來相對容易,但我遇到了奇怪的行為。 我寫了一個處理函數,它只是增加計數器並返回處理后的中斷

static int ir=0;
static irq_handler_t my_handler(int irq_no, void *dev_id, struct pt_regs *regs)
{
    ir++;
    return (irq_handler_t) IRQ_HANDLED;
}

為了掛鈎中斷處理程序,我在__init中調用request_irq()函數,第一個參數是8 ,因此處理了IRQ 8 (由 rtc 保留)線中斷

#define RTC_IRQ 8

[...]

int err;
err = request_irq(RTC_IRQ, (irq_handler_t) my_handler,IRQF_SHARED,"rtc0",NULL);
if (err != 0)
    return -1;

使用上面顯示的實現,加載內核模塊會給我err等於-22 ,即EINVAL 谷歌搜索后,我發現對於IRQF_SHARED標志,最后一個參數不能指定為NULL 我試圖找到一種在模塊中獲取rtc->dev_id的方法,但在某些示例中,他們只是將處理程序類型轉換為(void *)所以我嘗試傳遞(void *) my_handler 這給了我一個關於insmod的標志不匹配警告

genirq: Flags mismatch irq 8. 00000080 (rtc0) vs. 00000000 (rtc0)

並且錯誤值設置為-16 ,我從某些來源讀到的意思是“忙”。 在試圖找到一種獲取設備 ID 的方法時,我發現中斷是由rtc0設備發送的,該設備是從rtc-cmos父設備“繼承”的。

關於這個問題,我在互聯網上的不同來源中發現了不同的有爭議的線索。 有人說內核在軟件時鍾同步后禁用 rtc,但事實並非如此,因為使用sudo bash -c ' echo +20 > /sys/class/rtc/rtc0/wakealarm '並讀取IRQ 8行上的/proc/interrupts表明中斷按預期工作

其他來源指出,所有指向該線路的request_irq都必須安裝IRQF_SHARED標志才能共享中斷線路。 讀取rtc-cmos的源文件什么也沒給我,因為它們是通過直接讀寫CMOS設置中斷

我花了很多時間試圖找出問題的解決方案,但似乎 RTC 中斷在內核模塊開發中並不常用,因此很難找到有關該案例的相關和最新信息,大多數討論並且示例與使用SA_SHIRQ標志並且/drivers/examples文件夾存在於內核源文件中時的實現有關,這是內核版本2.6左右的內容。 從那時起,中斷和 rtc 內核實現都發生了變化

任何可能有助於解決此問題的提示/建議將不勝感激。 這是我的第一個 StackOverflow 問題,所以如果它的格式有任何錯誤或令人不安的地方,也歡迎您在評論中指出

提前感謝您的幫助

我很久以前就解決了這個問題,但這里有一些像我這樣的新手的解釋。 @stark 為這個問題提供了一個很好的提示。

要理解的主要事情是內核空間中的不負責任的行為很快會導致各種“災難”。 看起來,這是 Linux 開發人員關閉用戶/開發人員越來越多區域的主要原因。

在這里閱讀解決方案

因此,在現代內核版本中,您不會將處理程序隨機綁定到一行並將中斷標記為已解決。 但是您仍然可以使用IRQF_SHARED標志“收聽”它們,並在處理程序結束時通過返回IRQ_NONE讓中斷保持不變,因此如果中斷對某些事情至關重要,則不會破壞內核其余部分的正確操作別的。

解決方案結束,接下來關於內核開發的一些額外建議

一開始,重要的是要了解這不是用戶空間,您的操作最多會導致內存泄漏或某些文件損壞。 在這里,您的操作很容易損壞您的內核。 如果類似的情況發生在 Windows 上,您將別無選擇,只能完全重新安裝整個操作系統,但在 GNU/Linux 中並非如此。 您可以切換到不同的內核,而無需像以前一樣經歷恢復一切的繁瑣過程,因此,如果您是一個懶得使用虛擬機的鐵桿愛好者,那么學習交換內核很快就會派上用場:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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