作業系統 — Interrupt

慈慈
Oct 25, 2020

--

CPU&Devices間的互動

(Interaction Between CPU and Devices)

燒開水要怎麼知道水滾了?
1. 你一直站在旁邊看(Polling)
2. 聽是否有鳴笛聲(Interrupt)

Polling

step1. CPU命令某個Device做某個任務
step2. Device開始動作(執行任務)
step3. CPU不斷問Device是否完成任務
step4. Device終於完成任務
step5. CPU處理後續事宜,再去處理其他事情

Interrupt

step1. CPU命令某個Device做某個任務
step2. Device開始動作(執行任務)
step3. CPU去忙自己的事情
step4. Device終於完成任務,發出Interrupt給CPU
step5. CPU收到Interrupt,知道任務完成,處理後續事宜
step6. CPU再去處理其他事情

Interrupt其實就是一種signal(訊號)
以剛剛的例子來說
來源:水壺
接受者:人
時機:水燒開了
用途:轉小火(採取特定行動)

Purpose Of Interrupts

如何決定下一個指令?

都是根據上一個指令
看是PC+1 還是 jump 之類的
整個過程都是自動化的(效率高)

如何跳脫一個接著一個指令?

用Interrupt

但為什麼會需要跳脫?
1. 要從一個process到另一個process
2. 跳出無限迴圈
3. 需要反應外界的event(執行ISR)
ex. Device需要引起CPU的注意,讓CPU來幫Device做事

CPU Operation

處理流程

step1. Fetch Instruction
step2. Decode
step3. Execution
step4. Advance PC(+1 or jump)

PC:Program Counter Register(計數器)
IR:Instruction Register(指令暫存器)

每次都要等step4結束才會檢查是否有interrupt

Interrupt 後續事宜

step1. 儲存現在狀態
step2. 拿到Interrupt Number
step3. 找到對應的ISR
step4. 執行ISR
-> IRET指令 回到原始狀態

會發出IRQ(interrupt request)的來源有很多
CPU需要來分辨是哪個Device發出的
-> 給Device一個Number(Interrupt Number)讓CPU來判斷

每個IRQ都會有對應的處理方法
稱之為ISR(Interrupt service routine) interrupt handler
ISR通常會放在Device的驅動程式裡(也是作業系統的一部份)

Interrupt source(來源端) & Interrupt number & Interrupt service routine(ISR)
這三個都是一對一

CPU operation

Interrupt Hardware

Hardware to Software(更詳細的圖在下面)

step1. Device產生IRQ
step2. PIC收集所有Devices所發出的IRQs
step3. PIC(Programmable Interrupt Controller)判斷優先順序
step4. PIC傳Interrupt給CPU
step5. 若CPU決定要處理Interrupt,PIC會把Interrupt Number傳過去
step6. CPU去IDT找Interrupt Number對應的ISR(Interrupt Handler)

IDT(Interrupt Disable Table)

把ISR收集起來,照著interrupt number排好
可讓CPU查詢

Hardward to Software

Types of Interrupts

根據interrupt的來源是否跟CPU有關

  1. Asynchronous(非同步) <-無關
  2. Synchronous(同步) <-有關

Exceptions of Synchronous

Processor-detected exceptions
因為CPU的指令,而發生錯誤

Faults(違規)
因為CPU執行了某個指令,而發生錯誤
ex. 寫到某個記憶體位址,但它只能讀不能寫
若違規被修正了,指令可再執行一次

Traps(陷阱)
通常跟Debugger有關
你的程式原本應該做某件事情
但因為interrupt所以被trap放到其他地方

Programmed exceptions
一個軟體指令
通常用在system call

Handling of Interrupt

Interrupt的處理是誰要負責?

  1. Asynchronous(非同步)
    一定跟某個Device有關係
    ISR就會寫在Device Driver裡面
    (寫Device Driver的人要負責把ISR寫出來)

2. Synchronous(同步)

Processor-detected exceptions
大多數會產生signal給目前的行程
if 情況可修正->修正
else -> 行程會被殺掉

Programmed exceptions
基本上就是system call -> 就是處理system call

ISR需做的事情

若要用到暫存器,要先保留起來,不能被用走
需要有EOI command告訴PIC,CPU會處理這個Interrupt
幫device做事
恢復暫存器
iret指令 代表結束->回去原本的地方

總結

Interrupt完整流程

step1. Device產生IRQ
step2. PIC收集所有Devices所發出的IRQs
step3. PIC判斷優先順序
step4. PIC傳Interrupt給CPU
step5. 若CPU決定要處理Interrupt
step6. 儲存現在狀態
step7. 跟PIC要Interrupt Number
step8. 去IDT找對應的ISR
step9. 若要用到暫存器,要先保留起來,不能被用走
step10. 執行ISR做該做的事
setp11. 等做完事情後,傳EOI(End Of Interrupt) command過去
step12. 恢復暫存器
step13. iret指令 ->回去原本的地方

Interrupt分類

Asynchronous(非同步) -> 寫有人要寫(處理)
Synchronous(同步) ->
Processor-detected exceptions(faults, traps)
能修就修 不能修就殺
Programmed exceptions
處理system call

--

--