關於linux內核的答案。應該也適用於大多數其他操作系統。
1)如果我寫一個設備驅動程序併爲它註冊一個IRQ X.系統從哪裏知道應該處理哪個設備?例如,我可以使用request_irq()和IRQ編號10,但系統如何知道該處理程序應該用於鼠標或鍵盤,還是用於寫驅動程序?
對此沒有1個答案。例如,如果這是一個定製的嵌入式系統,那麼硬件設計者會告訴驅動程序作者「我要將設備x路由到irq y」。爲了更大的靈活性,例如對於一般使用PCI協議的網卡。檢測到硬件/固件級別仲裁時,會爲新設備分配irq號碼。這將被寫入PCI配置寄存器之一。驅動程序首先讀取該設備寄存器,然後爲該特定的irq註冊其中斷處理程序。其他協議會有類似的機制。
你可以做的是在內核代碼中查找對request_irq的調用,以及驅動程序如何獲得irq值。每種駕駛員都會有所不同。
這個問題的答案是這樣的,系統不知道。硬件設計者或硬件協議將這些信息提供給驅動程序編寫者。然後驅動程序編寫者註冊該特定irq的處理程序,告訴系統在發現該irq時應該執行什麼操作。
2)中斷向量看起來如何?我的意思是,如果我爲我的設備使用IRQ 10,則會覆蓋表中用於錯誤處理的標準處理程序(根據Silberschatz(操作系統概念),第一個可用的處理程序是32)。
好問題。它有兩個部分。
a)當你request_irq(irq,handler)時。系統實際上不會在IVT或IDT中編入入口0。但是輸入N + irq。其中N是該CPU支持的錯誤處理程序或通用異常的數量。細節因系統而異。
b)如果您錯誤地請求另一個驅動程序使用的irq,會發生什麼情況。你會得到一個錯誤,IDT不會與你的處理程序一起編程。
注:IDT是中斷描述符表。
3)誰最初設置IRQ? Bios?操作系統?
Bios先OS然後OS。但是有一些操作系統的例子,MS-DOS不重新設置BIOS設置的IVT。更復雜的現代操作系統,如Windows或Linux,不想依賴於特定的BIOS功能,並且他們重新編程IDT。但是,BIOS只有在OS才能開始時才能做到。
4)誰負責匹配IRQ和中斷向量中的偏移量?
我真的不清楚你的意思。流程就是這樣。首先爲您的設備分配一個irq編號,然後使用該irq編號爲其註冊一個處理程序。如果您使用錯誤的irq號碼,然後在設備上啓用中斷,則系統將崩潰。因爲處理程序是從錯誤的irq號碼註冊的。
5)可以共享IRQS。這怎麼可能?主板上有硬件通道,將設備連接到中斷控制器。如何將通道配置爲相同的中斷?必須有一張表格,表示第2道和第3道處理IRQ15例如這張桌子在哪裏,它是怎麼叫的?
這是一個非常好的問題。額外的表格並不是如何在內核中解決的。而對於每個共享的irq,處理程序都保存在函數指針的鏈表中。內核循環遍歷所有的處理程序並一個接一個地調用它們,直到處理程序中的一個聲明該中斷爲自己的中斷爲止。
The code looks like this:
driver1:
d1_int_handler:
if (device_interrupted()) <------------- This reads the hardware
{
do_interrupt_handling();
return MY_INTERRUPT;
}else {
return NOT_MY_INTERRUPT;
}
driver2:
Similar to driver 1
kernel:
do_irq(irq n)
{
if (shared_irq(n))
{
irq_chain = get_chain(n);
while(irq_chain)
{
if ((ret = irq_chain->handler()) == MY_INTERRUPT)
break;
irq_chain = irq_chain->next;
}
if (ret != MY_INTERRUPT)
error "None of the drivers accepted the interrupt";
}
}
一個關於中斷設置更詳細的解釋,處理和製圖可以在這裏找到:[內核中斷骨架內部的代碼走查(http://linuxburps.blogspot.in/2013/10/linux-interrupt- handling.html) – 2013-10-02 04:02:05