首页 文章

CPU如何找到ISR并区分设备

提问于
浏览
9

我应该先分享我所知道的一切 - 那就是完全混乱 . 关于这个主题有几个不同的问题,所以请不要生气:) .

1)为了找到ISR,CPU具有中断号 . 在x86机器(286/386及以上)中,有一个带有ISR的IVT;每个4字节大小的条目 . 所以我们需要将中断数乘以4才能找到ISR . 所以第一堆问题是 - 我完全混淆了CPU接收中断的机制 . 为了引发中断,首先设备应该探测IRQ - 然后是什么?中断号在“IRQ”上向CPU传输?我还读过像数据总线上设置ISR地址的设备;什么呢?覆盖ISR的设备的概念是什么?有人可以告诉我几个CPU轮询中断的示例设备吗?它在哪里找到它们的ISR?

2)如果两个设备共享IRQ(这是非常可能的),它们之间的CPU有何不同?如果两个设备同时引发相同优先级的中断怎么办我知道会有相同类型和低优先级中断的屏蔽 - 但这种通信是如何在CPU和设备控制器之间发生的?我研究了PIC和APIC在这个问题上的作用,但是无法理解 .

谢谢阅读 . 非常感谢您的回答 .

2 回答

  • 13

    CPU不会轮询中断,至少不是软件意义上的 . 关于软件,中断是异步事件 .

    发生的事情是CPU内的硬件识别中断请求,中断请求是中断线上的电输入,并且作为响应,将事件的正常执行放在一边以响应中断 . 在大多数现代CPU中,接下来发生的事情取决于特定于CPU类型的硬件握手,但是大多数CPU会从中断设备接收到某种类型的硬件握手 . 该数字可以是8位或32或其他任何值,具体取决于CPU的设计 . 然后CPU使用该中断号索引到中断向量表中,以找到开始执行中断服务程序的地址 . 一旦确定了该地址,(并且当前执行上下文被安全地保存到堆栈中),CPU就开始执行ISR .

    当两个设备共享一个中断请求线时,它们可以通过在该握手过程中返回不同的中断号来使不同的ISR运行 . 如果有足够的矢量编号,则每个中断设备都可以使用自己的中断向量 .

    但是,如果共享ISR足够聪明地返回到给定中断的所有可能源,并且检查状态寄存器以查看哪个设备请求服务,则两个设备甚至可以共享中断请求线和中断向量 .

    A little more detail

    假设您有一个由CPU,中断控制器和中断设备组成的系统 . 在过去,这些将是独立的物理设备,但现在这三个甚至可能存在于同一芯片中,但所有信号仍然存在于陶瓷外壳内 . 我将使用带有集成中断控制器的powerPC(PPC)CPU,它连接到PCI总线上的设备,作为一个应该很好用的例子 .

    假设该设备是一个传输一些数据的串口 . 典型的串行端口驱动程序会将一堆数据加载到设备的FIFO中,并且CPU可以在设备完成其工作时进行常规工作 . 通常,这些设备可以配置为在设备运行不足的数据时生成中断请求,以便设备驱动程序可以返回并向其中提供更多信息 .

    设备中的硬件逻辑将需要PCI总线中断确认,此时可能会发生一些事情 . 有些设备使用'autovectoring',这意味着它们依赖中断控制器来确保选择正确的服务例程 . 其他寄存器将有一个寄存器,设备驱动程序将对其进行预编程,该寄存器包含一个中断向量,器件将响应中断应答而放置在数据总线上,以便中断控制器接收 .

    PCI总线只有四条中断请求线,因此我们的串行设备必须断言其中一条 . (目前无论哪种情况,通常都与插槽有关 . )接下来是中断控制器(例如PIC / APIC),它将根据已设置的屏蔽位决定是否确认中断 . 它自己的寄存器 . 假设它确认中断,则它从中断设备(通过数据总线)获得矢量,或者如果这样编程则使用APIC自己的设备驱动器提供的“固定”值 . 到目前为止,CPU一直没有意识到所有这些事情,但这种情况即将发生变化 .

    现在是中断控制器引起CPU内核注意的时候了 . CPU将有自己的中断屏蔽位,这可能导致它忽略来自PIC的请求 . 假设CPU已准备好接受中断,现在是实际操作开始的时候了 . 在ISR开始之前,通常必须退出当前指令,因此使用流水线处理器这有点复杂,但是可以说在指令流的某个点处,处理器上下文被保存到堆栈和硬件中确定的ISR接管 .

    一些CPU内核具有多个请求线,并且可以通过硬件逻辑开始缩小ISR运行的过程,该硬件逻辑将CPU指令指针跳转到少数顶级处理程序之一 . 旧的68K,可能还有其他人这样做了 . powerPC(我相信,x86)有一个中断请求输入 . x86本身的行为有点像PIC,可以从外部PIC获得一个向量,但powerPC只是跳转到固定地址0x00000500 .

    在PPC中,0x0500处的代码可能只是立即跳到内存中的某个地方,那里有足够的空间来制作一些严肃的决策代码,但它仍然是中断服务程序 . 该例程将首先进入PIC并获取向量,并要求PIC停止向CPU内核发出中断请求 . 一旦知道了矢量,顶级ISR就会出现一个更具体的处理程序,该处理程序将为已知使用该矢量的所有设备提供服务 . 向量特定处理程序然后向下遍历分配给该向量的设备列表,检查这些设备中的中断状态位,以查看哪些设备需要服务 .

    当发现某个设备(如假设的串行端口)需要服务时,该设备的ISR会采取适当的操作,例如,将下一个FIFO的数据从操作系统缓冲区加载到端口的发送FIFO中 . 一些设备将响应于被访问而自动丢弃其中断请求,例如,将字节写入发送FIFO可能导致串行端口设备取消断言请求线 . 其他器件需要一个特殊的控制寄存器位来切换,设置,清零,有什么用,以便丢弃请求 . 有数以万计的不同I / O设备,其中没有两个似乎以同样的方式做到这一点,因此很难概括,但这通常是它的方式 .

    现在,显然还有更多要说的 - 中断优先级怎么样?在多核处理器中会发生什么?嵌套中断控制器怎么样?但是我在服务器上烧掉了足够的空间 . 希望这有任何帮助 .

  • 4

    我在3年后就遇到了这个问题 . 希望我可以帮忙;)

    英特尔8259A或简称“PIC”有8个引脚,IRQ0-IRQ7,每个引脚连接到一个器件 .

    让我们假设您按下了键盘上的一个按钮..连接到KBD的IRQ1引脚的电压为高..所以在CPU中断后,确认中断bla bla bla ... PIC只是做了在IRQ行的编号上加8,因此IRQ1表示1 8,表示9

    因此,CPU在向量表中的第9个条目上设置其CS和IP ..并且因为IVT是长数组,它只是将单元格数乘以4;)

    CPU.CS = IVT [9] .CS CPU.IP = IVT [9] .IP

    ESR通过I / O端口处理设备;)抱歉我的英文不好..虽然我是阿拉伯人:)

相关问题