汇编学习笔记(25) - 8259中断芯片

基本结构
  8259 有8个中断 记为 IRQ0 - IRQ7, 优先级自高到底,IRQ0 > IRQ7
  由于一个8259不够用所以 一般在 主8259的 IRQ2上接一个 从8259
  从8259 也有IRQ0-IRQ7 但是由于是接在主8259上的所以记做IRQ8-IRQ15, 也有是接在IRQ2上的,所以优先级是 IRQ0,IRQ1,IRQ 8 - IRQ15,IRQ3 - IRQ7

  IRR
    这是一个8位的寄存器,当中断触发的时候 对应的位就会被置位,比如 IRQ0触发的话 IRR的0位就会被置位

  ISR
    这是一个8位的寄存器,当有中断正在被CPU处理的时候,对应为就会被置位,也就是说如果ISR不等于0,会屏蔽同级或者更低级的中断,高优先级的还是会响应的

  IMR
    这是一个8位的寄存器,这是一个中断屏蔽寄存器,如果IMR对应的位被置位,则对应的中段不会被提交到CPU上执行

  触发流程
    当IRQ引脚上有中断触发,则8259会将IRR对应的位置1,如果这个IRQ没有在IMR中被屏蔽,那么8259就会向CPU INTR引脚发出信号,CPU之后会询问 8259中断号,8259会在根据IRR中的值选择一个优先级高的中断报告给CPU,同时设置ISR对应的位并清理IRR对应的位,CPU处理完中断之后需要发送一个EOI指令给8259告诉8259中断处理完毕,8259就会清理ISR的信息。

  edge / level
    是触发中断的两种方式
      edge 是在电平转换的时候触发,优点是只触发一次,缺点是可能丢失,
      level 是保持在高电平的时候触发,优点是不会丢失,缺点是可能多次触发,要处理还多次触发的情况
  AEOI
    Auto EOI 模式,就是中断完成的时候不用手动发送EOI信号



控制寄存器
  8259上有7个控制寄存器 初始化寄存器 ICW1-ICW4 , 操作寄存器OCW1-OCW3, 他们使用IO端口进行读写

  20h 主8259 ICW1 OCW2 OCW3
  21h 主8259 ICW2 ICW3 ICW4 OCW1

  A0h 从片 8259 ICW1 OCW2 OCW3
  A1h 从片 8259 ICW2 ICW3 ICW4 OCW1


  配置逻辑是这样的
    ICW1 的 第四位 必须是 1
    OCW2 的 第四位必须是 0 第三位必须是 0
    OCW3 的 第四位必须是 0 第三位必须是 1
  所以也就是说,在20/A0上是通过数据的 第三 第四 位的内容来区分是写入哪个寄存器的

  同时8259 要求ICW1 -ICW4必须是一次性顺序输入的不能打断的,所以当8259在 20/A0 收到 ICW1的数据后,他就默认了 接下来在 21/A1 收到的数据就是依次是 ICW2 ICW3 ICW4.
  这样对8259的配置就完成了。

  配置完成之后, 21/A1收到的数据就是OCW1, 20/A0 则仍然通过 三四两个转台位来判断是对应写到哪个寄存器

  ICW1
    0位: 指示是否需要使用ICW4 ,现在是必须置位1
    1位: 必须位0,表示连个8259 串联
    2位: 忽略,必须为0
    3位: 以前是edge和level模式的选择位,现在以忽略,必须为0
    4位: 必须为1
    其他位:必须为0
    所以ICW1的值是固定的 00010001B(11h)

  ICW2
    0-2 位必须为0
    3-7位,就是用来指定本8259的IRQ0对应在IDT中的中断号,依次累加的
    比如 3-7 的值是 80h 就表明本 8259 的IRQ0 的中断号是 80h, IRQ1 = 81h ,IRQ2 = 82h
    主从是分开的设置的。从片的IRQ0 从整体上来看就是IRQ8

  ICW3
    主片的值必须是 00000100, 表示从片接在 IRQ2上
    从片的值必须是00000010, 是从片的识别码 2h

  ICW4
    0位:必须位1 ,表示是intel体系
    1位: 表示开启AEOI模式,只能在主片上设置,从片必须位0
    2位: 必须位0
    3位: 必须为0
    4位:1 时表示使用 Special Full Nested Mode, 0时表示使用 Full Nested Mode, 从片必须位0
    其余位不洗位0


    Special Full Nested Mode 和 Full Nested Mode 的区别主要是在 从片的中断中断优先级上
    Full Nested Mode:
      对于主片来说,由于从片是接在主片的IRQ2上的,所以某个从片的的中断正在执行时,如果此时从片上有更高级点中断发生了,对于主片来说都是IRQ2的中断,所以此时会屏蔽到从片上的所有中断。简单来说正在从片上执行的 中断会屏蔽掉从片上所有中断,无论优先级。

    Special Full Nested Mode:
      所以正对以上情况就是,从片上正在执行的中断,还是会被从片上更高级的中断所中断,但是代价就是,当中断完成之后需要同时向从片和主片发送EOI清理指令。

  OCW1
    就是IMR寄存器

  OCW2
    0-2位: IRQ值
    3-4位: 必须为0
    5位:EOI, 置位表明则是一个EOI指令,否则就不是EOI指令
    6位:SPECIAL,指定 IRQ值,具体的IRQ值就是 0-2 位的内容,否则就是当前IRQ
    7位:ROTATE,将指定的IRQ设为最低优先级,优先级循序是个循环,如果将 5设为最低优先级那么优先级循序从高到低就变成 6 -15 > 0 - 5
    5 -7 位是组合使用的
    R S E 效果
    0 0 0 禁用AEOI模式下的自定义优先级顺序
    0 0 1 普通EOI指令,重置当前中断
    0 1 0 没意义
    0 1 1 重置 由 0-2位指定的IRQ
    1 0 0 开启AEOI模式下的自定义优先级顺序
    1 0 1 对当前IRQ发送EOI并,将当前IRQ设为最低优先级
    1 1 0 将0-2 指定的IRQ设置为最低优先级
    1 1 1 重置 0-2 指定的IRQ, 并将这个IRQ设置为最低优先级




  OCW3
    0-1位: 表示是下一个对OCW3的读操作是读IRR(10B) 还是ISR(11B)
    2位:表示下一个读操作是否被作为一次中断相应周期
    3位:必须位1
    4位:必须位0
    5位:SMM enable位
    6位:SMM 位
    7位:必须位0

    SMM 是special mask mode 的意思 5 6 两位同时设置为1才有效,作用就是告诉8259忽略 ISR寄存器的寄
比如,当IRQ0的时间中断正在处理的时候 由于IRQ0是坐高优先级,所以此时所有的ISR 0位置1,这回屏蔽掉所有中断的相应,如果此时开启 SMM,那么8259就会忽略掉ISR
如果这是键盘有中断,那么键盘中断就会被触发,也就是说在time中断处理过程中嵌套处理了键盘中断,此时 ISR就是 00000011B 同时有连个中断处理了,等键盘中断处理完成后会回到time中断的处理。

  ELCR1 / ELCR2
    前面提到ICW1的第三位本来是edge和level模式的选择位,现在被忽略了,取而代之的就是 ELCR1 /ELCR2寄存器,ELCR1对应主片 ELCR2对应从片,
    ELCR1 对应 IO端口4D0H
    ELCR2 对应 IO端口4D1H
    他们每一位设置了对应IRQ的edge和level, 0 表示edge模式, 1 表示level模式,其中 IRQ0,IRQ1,IRQ2,IRQ8,IRQ13 必须是0


各IRQ对应的中断内容

0 时钟中断
1 键盘中断
2 连接从片了
3 serial port A
4 serial port B
5 parallel port
6 floppy
7 parallel port
8 real time clock
9 generic
10 generic
11 generic
12 PS/2 鼠标
13 internal
14 SATA
15 SATA

posted @ 2021-03-13 19:16  蹦蹦骑士  阅读(2522)  评论(0编辑  收藏  举报