title: 中斷、異常與併發
date: 2019-12-29 22:19:12
2. 異常
3. 併發
在學習了組合語言課程後,才總算有所領會,於是打算進行相應的歸納。
何為中斷?書本上的一種解釋如下:
中斷(interrupt)是一種使cpu掛起正在執行的程式而轉去處理特殊事件的操作。不嚴謹地說,中斷就是「函式」,這種「函式」可以由當前程式呼叫,也可以由作業系統呼叫,或者由硬體呼叫,相當於「庫函式」。
但,中斷比庫函式級別更高,庫函式需要引入庫才能呼叫,而中斷可以不引入任何庫直接呼叫。
而且,當沒有作業系統時,中斷也可以呼叫。
在組合語言中,程式可以通過int n
呼叫中斷,n
是中斷號。
在實模式下,當程式通過int n
呼叫中斷時,系統是如何找到對應的中斷程式並跳轉的呢?
在記憶體最低端的1kb空間中,存放著乙個中斷向量表。其中,每個中斷向量佔4個位元組,順序存放在中斷向量表中,比如,0號中斷向量在位址0*4
處,1號中斷向量在位址1*4
處。
那什麼是中斷向量呢?
其實,中斷向量就是中斷處理程式的入口位址。4位元組中,高兩位元組是入口位址的段值,低兩位元組是入口位址的偏移。
ia-32系列cpu能支援256種型別的中斷(1kb即有256個中斷向量),分別編號為 0 ~ 255,即中斷型別號,簡稱中斷號。其中,前32個中斷(0~31)保留給處理使用,剩餘的可由使用者(比如作業系統)自定義。
每個中斷都有各自的作用,並且對應乙個中斷處理程式。比如,屬於內部中斷的0號中斷,是出現除0時,執行相關操作;10號中斷是顯示i/o中斷,提供給使用者呼叫。
以實模式下的ia-32系統cpu為例,中斷響應和返回過程,由硬體完成,步驟如下:
根據int n
指令取得中斷號
將標誌暫存器值flags
壓棧
關閉外部中斷和單步中斷(if
和tf
標誌位清0)
中斷返回位址的段值cs
和偏移ip
壓棧
根據中斷號,從中斷向量表中取得中斷處理程式的入口位址
跳轉至中斷處理程式
執行中斷處理程式…
中斷返回時,從棧中恢復ip
,cs
,flags
可以看出,中斷響應和函式呼叫過程十分相似。而訪問暫存器(cs,ip,flags)的操作,也就是上下文切換。
在早期的intel 8086/8088
微處理器中,並不區分異常和中斷,統稱為中斷。所以,上述中斷內容都是在intel 8086 實模式基礎上的,而下述異常內容將在作業系統保護模式基礎上。
從80286
開始,intel
統一把內中斷稱為異常/內部異常,而把外中斷稱為中斷/外部中斷。
當異常或中斷發生時,正在執行的邏輯控制流被打斷,cpu轉而執行異常處理程式,從而引起異常控制流。
不同於實模式,ia-32保護模式,借助中斷描述符表來儲存異常處理程式或中斷處理程式的入口位址,並且由idtr
暫存器來指定idt表的位置。
中斷描述表與中斷向量表類似,共有256個表項,每個表項是乙個8位元組的中斷門描述符、陷阱門描述符或任務門描述符。
(為什麼總要取一些奇奇怪怪的名字呢?故意讓人看不懂嗎?不懂不懂)
linux
核心在系統初始化時,會設定好idt中的每個表項。
中斷與異常有著千絲萬縷的關係,但併發又跟這兩者有何關係呢?
首先,我們必須意識到,平時遇見的併發(多個程序同時執行),本質上是快速交替執行的程序(不考慮多cpu)。
而在某乙個時刻,只能有乙個程式在cpu執行,但由於各程序快速(毫秒級)交替執行,所以我們看起來像是同時執行的。
究其本質,併發,是由作業系統根據乙個定時器中斷,每過一會兒(xx毫秒)就幫我們切換執行程式,從而營造出來的假象。
在實模式中,硬體定時器每隔55ms會發出一次中斷請求,cpu接收到定時請求後,會轉入8號定時器中斷處理程式。
8號中斷處理程式中,含有一條中斷指令int 1ch
,而1ch號中斷處理程式並沒有做任何工作,可以認為它只有一條中斷返回指令。
如果我們將1ch
中斷處理程式設定為自定義的程式(將自定義程式的入口位址,填入中斷向量表1ch*4位址處),那麼每過一段時間自定義程式便會被呼叫。
假如有主程式a和自定義的1ch中斷處理程式b,那麼a、b程式會相互切換執行,每過55ms執行b程式,然後中斷返回執行a程式。
由於55ms肉眼無法察覺,所以我們會看到a、b程式同時執行的假象。
現在,我們將主程式a看作作業系統,程式b看作程序切換程式。
那麼,我們可以很明朗地發現,只要在程式b中,不斷儲存、恢復程序的上下文(程序的暫存器等),就可以實現程序的切換。
每過55ms(或者更久)執行程式b,切換執行程序,並跳轉到切換後的程序執行。從而實現多程序併發執行。
到這,是不是覺得併發竟然如此簡單呢?
中斷與異常的區別
一 中斷 系統停止當前正在執行的程式而轉向其他服務,可能是因為優先順序高的請求 服務了,或者是因為人為安排中斷。中斷是屬於正常現象。異常 是由於軟體錯誤而引起的 二 中斷是cpu所具備的功能 硬體 異常是軟體執行過程中的一種開發過程中沒有考慮到的程式錯誤 軟體 三 1.中斷的概念 所謂中斷是指cpu...
ZYNQ 異常與中斷原理
異常 cpu停止正常工作,執行專用的特權的一段軟體程式,使系統恢復正常。coretex a9的異常包括 1.中斷 fiq優先於irq irq interrupt request 指中斷模式。fiq fast interrupt request 指快速中斷模式。irq與fiq是arm處理器的兩種不同程...
中斷與異常詳解(五)
隨著看的東西的增多,之前不明白的地方也開始有了眉目,所以更新前幾節的東西,歡迎指正。想想馬上就中斷返回,進入程序描述了,還是挺激動的呢。中斷向量表多達256項 雖然預設使用的只有49條,但很明顯中斷服務程式必須支援smp,這也是在第三節為什麼在handle irq event irq,s,actio...