中斷,異常,陷阱,軟硬中斷,同非同步中斷??

1. 首先是中斷和異常還有陷阱的區別和聯繫

2. 同步中斷和 非同步中斷

3. 軟中斷和硬中斷

按照《深入理解linux內核》中的分析,中斷分為同步中斷和非同步中斷。

同步中斷是當指當指令執行時由cpu控制單元產生的,只有在一條指令終止執行之後cpu才會發生中斷。那麼也可以理解為這個中斷是cpu主動產生的,或者說是cpu可以預知的中斷。這個中斷被稱為 異常。有的也說是陷阱????

非同步中斷是由其他硬體設備按照cpu時鐘信號隨機產生的。也可以理解為產生這個中斷時cpu是被動的,或者說這個中斷cpu是不可預知的。這個中斷被稱為中斷。

而硬中斷和軟中斷都屬於非同步中斷,分別是一個中斷的上下部,上部一般是純硬體中斷,而中斷的下部就是所謂的軟中斷。

總結一下,

1.廣泛意義上的中斷分為同步中斷和非同步中斷

2. 同步中斷又被稱為異常和陷阱

3. 非同步中斷分為軟中斷和硬中斷

以上是我的理解,不知道是否正確,求各位不吝賜教。


IA-32 Intel ? Architecture

Software Developer』s Manual Volume 1: Basic Architecture給出的解釋:

6.4.INTERRUPTS AND EXCEPTIONS

The processor provides two mechanisms for interrupting program execution: interrupts andexceptions:An interrupt is an asynchronous event that is typically triggered by an I/O device.An exception is a synchronous event that is generated when the processor detects one ormore predefined conditions while executing an instruction. The IA-32 architecturespecifies three classes of exceptions: faults, traps, and aborts.

The processor responds to interrupts and exceptions in essentially the same way. When an inter-rupt or exception is signaled, the processor halts execution of the current program or task andswitches to a handler procedure that has been written specifically to handle the interrupt orexception condition.

The processor accesses the handler procedure through an entry in the inter-rupt descriptor table (IDT). When the handler has completed handling the interrupt or exception,program control is returned to the interrupted program or task.

The operating system, executive, and/or device drivers normally handle interrupts and excep-tions independently from application programs or tasks. Application programs can, however,access the interrupt and exception handlers incorporated in an operating system or executivethrough assembly-language calls. The remainder of this section gives a brief overview of theprocessor』s interrupt and exception handling mechanism. See Chapter 5, Interrupt and Excep-tion Handling in the IA-32 Intel Architecture Software Developer』s Manual, Volume 3, for adetailed description of this mechanism.

The IA-32 Architecture defines 17 predefined interrupts and exceptions and 224 user definedinterrupts, which are associated with entries in the IDT. Each interrupt and exception in the IDTis identified with a number, called a vector. Table 6-1 lists the interrupts and exceptions withentries in the IDT and their respective vector numbers. Vectors 0 through 8, 10 through 14, and16 through 19 are the predefined interrupts and exceptions, and vectors 32 through 255 are theuser-defined interrupts, called maskable interrupts.

定義:

中斷異常是強制性的執行流的轉移,從當前正在執行的程序或任務轉移到一個特殊的常式或任務。當處理器收到中斷信號或檢測到異常時,便掛起當前正在運行的進程或者任務,而轉去執行中斷或異常處理常式。中斷或異常處理常式執行完畢之後,處理器繼續執行被中斷的進程或任務。

分類:

中斷:又稱為非同步中斷,是其他硬體依照CPU時鐘信號隨機產生的。中斷又被分為可屏蔽硬體中斷不可屏蔽中斷。在微機原理課程中,處理器中有兩個引腳NMI和INTR負責接受中斷信號,還有高級可編程中斷控制器(APIC),如8259A管理中斷信號。則可屏蔽硬體中斷:任何通過INTR或著局部APIC傳遞到處理器的中斷信號都被稱為可屏蔽硬體中斷,由IO設備產生的IRQ(Interrupt ReQuest)也是可屏蔽硬體中斷。但是通過INTR引腳傳遞的可屏蔽硬體中斷可使用Intel架構定義的中斷向量(0-255),而局部的APIC傳遞的部分只能使用16-255號向量。若中斷信號從NMI引腳傳遞過來,則發生的是一個不可屏蔽中斷。

異常:又稱為同步中斷,是當指令執行時CPU控制單元產生的,之所以稱為同步,是因為只有在一條指令終止執行後CPU才會發出中斷。在不失進程執行連續性的同時,按引起的異常的指令是否能重新執行,且依據它們被報告的方式,異常分為錯誤陷阱,和終止三種情況。

錯誤:錯誤是一種通常可以能夠被修正的異常,一旦修正,程序能夠不失去連續性地接著執行。當報告錯誤發生時,處理器將機器狀態恢復到執行錯誤之前的狀態。錯誤處理常式的返回地址指向產生錯誤的指令,而不是錯誤指令之後的的那條指令。如頁錯誤。

陷阱:當引起陷阱的指令發生時,馬上產生該異常。陷阱允許程序不失去連續性的繼續執行。陷阱處理常式的返回地址指向引起陷阱的指令的下一條指令(與錯誤本質上的區別)。如溢出。

終止:它並不總是報告產生異常的指令的確定位置,也不允許引起終止的進程或任務重新執行。如匯流排錯誤導致異常終止。

中斷向量:

Intel x86共支持256中向量中斷,Intel給每種中斷源編號,從0-255,並把這個無符號整數叫做一個中斷向量。不可屏蔽中斷的向量和異常的向量是固定的,而可屏蔽的硬體中斷可以通過對中斷控制器編程來改變。

Linux中的中斷向量:

0-19的中斷向量對應於異常和非屏蔽中斷。

20-31Intel保留

32-127可屏蔽硬體中斷

128用於系統調用的可編程異常

129-238可屏蔽硬體中斷

239本地APIC時鐘中斷

240本地APIC高溫中斷

241-250由Linux留作將來使用

251-253處理器間中斷

254本地APIC錯誤中斷

255本地APIC偽中斷(CPU屏蔽某個中斷時產生的)

中斷描述符表:

中斷描述符表(Interrupt Descriptor Table,IDT)是一個系統表,它與每一個中斷或異常向量相關,每一個向量在表中有相應的中斷或異常處理程序的入口地址。內核在允許中斷髮生前,必須適當地初始化IDT,用lidt彙編指令初始化idtr。

任務門:當中斷信號發生時,必須取代當前進程的那個進程的TSS選擇符存放在任務門中。

中斷門:包含段選擇符和中斷或異常處理程序的段內偏移量。當控制權轉移到一個適當的段時,處理器清IF標誌,從而關閉將來會發生的可屏蔽中斷。

陷阱門:與中斷門相似,只是控制權傳遞到一個適當的段時處理器不修改IF標誌。

Linux利用中斷門處理中斷,利用陷阱門處理異常。

上面是我自己的理解,來自shui ? 中斷和異常 ,但是關於軟中斷 ,我的理解為中斷的下半部分.


軟中斷又叫做編程異常,主要用於執行系統調用即int 0x80以及給調試程序通報一個特定的事件,所以軟中斷是異常的一種,屬於同步中斷。所以不能說非同步中斷分為軟中斷和硬中斷。

正如樓主所說,中斷分為同步中斷,也稱異常,和非同步中斷,也稱中斷。

同步中斷/異常:

當指令執行時由CPU控制單元產生,並且只有在該指令終止執行後CPU才會發出中斷。

異常可以進一步細分為處理器探測異常和前面提到的編程異常。

而處理器探測異常又可以細分為:

  1. 故障 故障很有特點,故障是可以糾正的,一旦糾正,會重新執行引起故障的指令。這就是缺頁異常的機制。
  2. 陷阱
  3. 異常中止

非同步中斷/中斷:

由其他硬體隨機產生。可以分為可屏蔽中斷和非屏蔽中斷。

對於中斷和異常的處理,主要是利用中斷描述符表IDT中的中斷描述符。中斷描述符屬於系統描述符,與代碼段描述符、數據段描述符不同。中斷描述符是系統描述符中的門描述符,具體可以分為3種:

  1. 任務門
  2. 中斷門
  3. 陷阱門

正如 @shuidu 提到的,Linux利用中斷門處理中斷,利用陷阱門處理異常

這是否意味著在Linux中可以將異常可以陷阱畫等號?我也是初學這些,有錯請大佬指正。


A trap
is an exception in a user process. Its caused by division by zero or
invalid memory access. Its also the usual way to invoke a kernel
routine (a system call)
because those run with a higher priority than user code. Handling is
synchronou
s (so the user code is suspended and continues afterwards). In
a sense they are "active" - most of the time, the code expects the trap
to happen and relies on this fact.

An interrupt
is something generated by the hardware (devices like the hard disk,
graphics card, I/O ports, etc). These are asynchronous (i.e. they dont
happen at predictable places in the user code) or "passive" since the
interrupt handler has to wait for them to happen eventually.

You can also see a trap as a kind of CPU-internal interrupt since the
handler for trap handler looks like an interrupt handler (registers and
stack pointers are saved, there is a context switch, execution can
resume in some cases where it left off).

x86 - What is the difference between Trap and Interrupt?

加黑部分應該可以回答題主的問題:


推薦閱讀:

為什麼Linux內核代碼鮮有中國人的貢獻?
linux內核中,對於字元設備/塊設備/匯流排/設備/驅動等概念,如何正確理解?
全局變數什麼時候在內存中申請空間呢?
linux CFS調度演算法的疑問?
如何理解Linux一切皆是文件?這當中又有哪些值得後人借鑒的思想?

TAG:計算機系統 | Linux內核 |