處理器在執行當前任務時出現突然事件導致執行控制從當前任務轉移到沖斷處理程式。處理器相應中斷或異常處理程式採取的行動稱為中斷
/異常處理。
中斷源:
1. 外部中斷:經過
cpu intr
引腳或nmi
引腳接收。當
intr
接收外部中斷,
cpu從系統匯流排上讀取外部中斷控制器提供的中斷向量號。
nmi
接收非遮蔽中斷,使用固定中斷向量號2 。
intr
接收的中斷時可遮蔽的,通過設定
eflags的if
位來控制是否遮蔽,
2. 軟體中斷:
int
指令產生中斷,
0-255
都可以作為
int指令中斷號。
if 標誌不能遮蔽軟中斷。
異常源:
1. 處理器檢測到程式錯誤,比如被0
除。2.
指令into
、int 3
、bound
可以產生軟異常。
3. int
指令也可以模擬異常,但不會產生錯誤碼,所以對於要處理錯誤碼的異常處理程式會吧
eip彈出
,需注意。
異常分類:
1. 故障(
fault
):一種可糾正異常,異常處理程式執行完後會再次執行產生異常的指令。
2. 陷阱(
trap
):異常處理程式執行完後執行產生異常的下一條指令。如
jmp
時產生trap
,返回指標指向
jmp指令的目標位址。
3. 中止(
abort
):不支援重新執行程式。通常用來收集異常產生時處理器資訊,並關閉系統。
開啟、禁止中斷:
1. 設定
eflags的if
標誌為0
來禁止intr
引腳的中斷,用
sti和
cli來設定和清除
if位。
2. popf
、任務切換、
iret
都會更行
eflags
中斷描描述符表(
idt):
idt用於將中斷向量與中斷處理程式聯絡起來,與
gdt和
ldt類似也是由
8位元組長描述符組成陣列。與
gdt不同的是表中第一項可以包含描述符。中斷向量號
*8 = idt
表索引值。
idtidtr
儲存idt
表線性位址(
32位)
+限長(
16位)。為保證處理器訪問效率,
idt基位址應對齊
8位元組邊界。
lidt
指令用於載入
idtr
內容,該指令只能執行在當前特權級為
0**中。
sidt
指令用於儲存
idtr
內容,該指令能執行在任何特權級上。
idt描述符:
1. 中斷門
:type= 01110 入口
(31--16)
p(15)| dpl(14--13)|type(12--8)|other
段選擇符
入口(15--0)
2. 陷阱門:
type= 01111
入口(31--16)
p(15)|dpl(14--13)|type(12--8)|other
段選擇符 入口
(15--0)
3. 任務門
:type= 00101
中斷門和陷阱門的主要區別是中斷門處理中斷時會清除
if位,從而禁止可遮蔽中斷。
異常和中斷處理:
與用call
指令呼叫門類似。
1. 處理過程將在高特權級執行時:a
)從當前任務
tss段中選擇中斷異常處理過程使用的新棧ss和
sp,然後處理器將當前ss和
sp入棧到新棧。
b) eflags,cs
,eip
壓入新棧。
c) 如有錯誤碼,則把錯誤碼壓入新棧
2. 處理過程在相同特權級執行時:a
)eflags, cs, eip
壓入當前棧。
b) 如有錯誤碼,則把錯誤碼壓入當前棧。
為從處理過程返回,必須使用
iret
指令。該指令會把儲存的
eflags
恢復到eflags
中,如果呼叫過程中有堆疊切換,
iret
也會把堆疊切回。
中斷保護:
利用軟體產生中斷時
cpl
必須<=
門的dpl
,防止使用者程式訪問高特權級程式。硬體產生的中斷則不做此檢查。
call
指令直接把控制轉移到另乙個特權級時:
如果是訪問非一致**,比如
cpl=dpl
,如果是訪問一致**,比如
cpl》
=dpl
中斷和異常
中斷和異常 中斷訊號的處理方式 分緊急部分和不緊急部分 中斷處理 必須能夠重入,以便能夠中斷巢狀 中斷和異常的產生 乙個irq interrupt request 代表中斷控制器上的一根中斷線,和乙個中斷向量 單cpu 可程式設計中斷控制器 pic 多cpu 改進的可程式設計中斷控制器 apic 乙...
中斷和異常
中斷通常定義為乙個事件,該事件改變處理器執行的指令順序。中斷通常分為同步中斷與非同步中斷。異常是同步的,i o中斷是非同步的。中斷可以分為 i o裝置發出的中斷請求 irq 都可以被遮蔽,乙個中斷被遮蔽以後,控制單元就忽略他。只有硬體故障等幾個危急事件才是非遮蔽中斷。異常可以分為 可以糾正的異常,例...
中斷和異常
1 中斷機制的誕生 早期計算機,各程式只能序列執行,系統資源利用率低,為了解決這個問題,從而誕生了作業系統 作為計算機的管理者 引入中斷機制,實現了多道程式併發執行。本質 發生中斷就意味著需要作業系統介入,開展管理工作。2 中斷的概念和作用 1 當中斷發生時,cpu立即進入核心態。2 當中斷發生後,...