2012-06-03 74 views
14

在我們有一箇中斷控制器(IRC),其充當裝置之間的多路轉換器,其可以提高一箇中斷,並且CPU的mainbord:中斷處理(Linux的/通用)

       |--------| 
      |-----------|  |  | 
-(0)------| IRC _____|______| CPU | 
-(...)----| ____/  |  |  | 
-(15)-----|/   |  |--------| 
      |-----------| 

每個設備與相關聯的一個IRQ(左邊的數字)。每次執行後,CPU都會檢測到中斷請求線。如果檢測到信號,將執行狀態保存並且CPU加載一箇中斷處理程序例程,該例程可以在位於存儲器中的固定地址的中斷矢量中找到。據我所見,中斷向量中的IRQ和向量編號不一樣,因爲我有例如我的網卡註冊到IRQ 8.在Intel Pentium處理器上,這會指向一個使用的例程爲了表示一個錯誤條件,所以必須有一個指向正確處理程序的映射。

問題:

1)如果我寫一個設備驅動程序併爲它註冊一個IRQ X。系統從哪裏知道應該處理哪個設備?例如,我可以使用request_irq()和IRQ編號10,但系統如何知道該處理程序應該用於鼠標或鍵盤,還是用於寫驅動程序?

2)中斷向量看起來如何?我的意思是,如果我爲我的設備使用IRQ 10,則會覆蓋表中用於錯誤處理的標準處理程序(根據Silberschatz(操作系統概念),第一個可用的處理程序是32)。

3)誰最初設置IRQ? Bios?操作系統?

4)誰負責匹配IRQ和中斷向量中的偏移量?

5)可以共享IRQS。這怎麼可能?主板上有硬件通道,將設備連接到中斷控制器。如何將通道配置爲相同的中斷?必須有一張表格,表示第2道和第3道處理IRQ15例如這張桌子在哪裏,它是怎麼叫的?

+0

一個關於中斷設置更詳細的解釋,處理和製圖可以在這裏找到:[內核中斷骨架內部的代碼走查(http://linuxburps.blogspot.in/2013/10/linux-interrupt- handling.html) – 2013-10-02 04:02:05

回答

18

關於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"; 
      } 
     } 
+2

優秀的答案,thx! – fliX

+0

您在IDT上添加了一個說明,您可以爲IVT添加一個嗎? – einstein