computer_knowledge_notes/Hardware/Intel/Interrupt/8259A_pic.md

4.9 KiB
Raw Blame History

中断概述

中断是由硬件设备产生的电信号它首先被中断控制器处理中断控制器再把与它唯一对应的数据发送到处理器的数据总线。之所以要唯一对应是因为处理器只有1个输入来接收设备中断它没法分清是哪个设备需要服务。英特尔32位处理器一般有2个中断控制器每个中断控制器可以处理8个输入由于一个从控制器的输出连到主控制器的输入所以2个中断控制器组合起来一共可以处理15个外设的中断。中断控制器里的0号插座是专有的只能接时钟输入其它插座则可以接任意设备。

主中断控制器的INT引脚连接CPU的INT引脚从中断控制器的INT引脚则连到主中断控制器的输入插座上。中断控制器就是通过这个INT引脚告诉CPU中断来了。CPU的INTA引脚和中断控制器的INTA引脚相连它通过向中断控制器的INTA引脚发信号使得中断控制器把数据发到系统数据总线上这样处理器就知道该执行哪个服务例程了。

CPU如何处理中断

当一个进行着的进程收到中断时,处理器会为中断服务设置一个新栈。这个栈的位置由任务状态段TSS)里的一个入口决定。处理器会自动把若干重要的寄存器压到这个栈上,包括恢复被中断进程自已的栈和程序计数器所必须的那些寄存器。

当从中断返回被中断的进程时,会执行iretd指令。iretd恢复中断前的状态,恢复被硬件压入的寄存器,并切换回中断发生之前的栈。

当CPU收到一个中断后会关闭所有的中断。这样就可以保证进程的栈桢不会溢出。当进程表之外的内核栈被使用时中断始终处于关闭的状态。当内核栈被使用时也有机制可以保证异常处理例程可以运行。可以把异常理解为不能关闭的中断。当异常发生时CPU把必要的寄存器压入当前的栈里。当内核运行时不应发生异常否则将产生panic。

iretd返回内核进程和返回用户进程的机制是类似的,处理器通过检查代码段选择器来决定如何处理iretd

8259A概述

8259A引脚

8259A芯片是一个中断管理芯片中断的来源除了来自于硬件自身的NMI中断和来自于软件的INT n指令造成的软件中断之外,还有来自于外部硬件设备的中断,这些中断是可屏蔽的。这些中断也都通过PIC(Programmable Interrupt Controller)进行控制并传递给CPU。

一个8259A芯片的可以接最多8个中断源但由于可以将2个或多个8259A芯片级连cascade并且最多可以级连到9个所以最多可以接64个中断源。如今绝大多数的PC都拥有两个8259A这样 最多可以接收15个中断源。

8259提供了两种屏蔽方式1,简单方式提供8位屏蔽字对应各个IR。2,特殊方式允许CPU让低优先级的外设去中断高优先级的服务程序。

8259芯片里保存了一个表这个表会生成一个8位的索引CPU使用它来为每个可能的中断输入找到正确的中断门描述符。这个表是由BIOS初始化的。当使用了中断的驱动程序启动的时候可以根据需要进行修改。驱动程序可以请求对相应的位进行重置来开启它需要的中断。

内部结构

8259A内部结构

  • IRR:中断请求寄存器8位IR0IR7每一位对应一个设备共可接收8个设备的中断请求。
  • IMR:中断屏蔽寄存器为8位设置需要屏蔽的中断请求
  • ISR中断服务寄存器为8位保存当前正在处理的中断请求
  • PR优先权判别器。当多个中断同时发生时将高优先级者优先传递给CPU。优先级选择方式有4种1,完全嵌套方式优先级从IR0到IR7依次降低。2,轮换方式A一个中断完成后立即把它放到最低优先级的位置上。3,轮换方式BCPU可以在任何时间规定最优优先级。4,查询方式CPU访问中断状态寄存器。
  • 控制逻辑向CPU发出中断请求信号INT并接受CPU的中断响应信号INTA。
  • 数据总线缓冲器:保存数据总线的数据,传输命令控制字、状态字和中断类型码。
  • 读/写逻辑确定数据总线缓冲器中数据的传输方向选择内部的各命令字寄存器。RD为读WR为写AO为I/O端口识别CS为设备选择。
  • 级联缓冲/比较器主从控制器的级联是由级联总线CAS0CAS1CAS2实现的。

工作原理

8259A级联

实例:两个中断控制器连接

8259A级联

Master 8259A:
0x20: ICW1,OCW2,OCW3,IRR,ISR
0x21: ICW2,ICW3,ICW4,IMR, address registers
Slave 8259A:
0xA0: ICW1,OCW2,OCW3,IRR,ISR
0xA1: ICW2,ICW3,ICW4,IMR, address registers