基本結構
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