2010-08-03 105 views
15

有人可以請我解釋一下中斷服務程序中發生了什麼(雖然它取決於具體的例程,一般的解釋就足夠了)?這對我來說一直是個黑盒子。中斷服務程序會發生什麼?

回答

16

interrupt handlers上有很好的維基百科頁面。

「中斷處理程序,也稱爲一箇中斷服務例程(ISR),是在一個操作系統或它們的執行是通過一箇中斷的接收觸發的設備驅動程序的回調子例程。中斷處理程序具有的多個函數,這些函數根據中斷產生的原因以及中斷處理程序完成其任務的速度而有所不同。「

基本上,當一塊硬件(一個硬件中斷)或某個OS任務(軟件中斷)需要運行時,它會觸發一箇中斷。如果這些中斷沒有被屏蔽(忽略),操作系統將停止它正在執行的操作,並調用一些特殊的代碼來處理這個新事件。

一個很好的例子是從硬盤讀取數據。驅動器速度很慢,您不希望操作系統等待數據恢復;你希望操作系統去做其他事情。因此,您設置了系統,以便在磁盤有請求的數據時引發中斷。在磁盤的中斷服務程序中,CPU將獲取現在已準備好的數據並將其返回給請求者。

ISR經常需要快速發生,因爲硬件可能有一個有限的緩衝區,如果它現在已經足夠快地被關閉,它將被新數據覆蓋。 當CPU正在服務一個ISR時,讓ISR快速完成也很重要,否則其他中斷將被屏蔽,這意味着如果CPU無法快速到達它們,則可能會丟失足夠的數據。

0

要理解的最好方法是自己做一些簡單的例子。

最小的16位例如

首先學習如何創建一個最小的bootloader OS和QEMU和實際的硬件上運行它,因爲我在這裏解釋:https://stackoverflow.com/a/32483545/895245

現在,你可以在16運行位實模式:

movw $handler0, 0x00 
    mov %cs, 0x02 
    movw $handler1, 0x04 
    mov %cs, 0x06 
    int $0 
    int $1 
    hlt 
handler0: 
    /* Do 0. */ 
    iret 
handler1: 
    /* Do 1. */ 
    iret 

這會怎麼做才能:

  • Do 0.
  • Do 1.
  • hlt:停止執行

注意處理器如何查找第一個處理程序的地址0,並且在4第二個:那就是處理程序表叫IVT,每個條目有4個字節。

Minimal example that does some IO使處理程序可見。

保護模式

現代操作系統在所謂的保護模式下運行。

在這種模式下處理有更多的選擇,所以它更復雜,但精神是一樣的。

Minimal example

參見

相關問題:What does "int 0x80" mean in assembly code?

相關問題