【发布时间】:2012-06-07 19:58:28
【问题描述】:
在主板上,我们有一个中断控制器 (IRC),它充当可以引发中断的设备和 CPU 之间的多路复用器:
|--------|
|-----------| | |
-(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?生物?操作系统?
4) 谁负责匹配中断向量中的IRQ和偏移量?
5) 可以共享 IRQS。这怎么可能?主板上有硬件通道将设备连接到中断控制器。如何将通道配置为相同的中断?必须有一张表,上面写着通道 2 和 3 处理 IRQ15,例如该表位于何处,如何调用?
【问题讨论】:
-
关于中断设置、处理和映射的更详细解释可以在这里找到:A code walk inside kernel interrupt framework
标签: linux operating-system interrupt