[英]What is the difference between request_irq and request_threaded_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.