2012-06-03 28 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