版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國]-異常陷阱

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

簡介陷阱

計(jì)算機(jī)有兩種運(yùn)行模式:用戶態(tài), 內(nèi)核態(tài)。 其中操作系統(tǒng)運(yùn)行在內(nèi)核態(tài),在內(nèi)核態(tài)中,操作系統(tǒng)具有對(duì)所有硬件的完全訪問權(quán)限,可以使機(jī)器運(yùn)行任何指令;相反,用戶程序運(yùn)行在用戶態(tài),在用戶態(tài)下,軟件只能使用少數(shù)指令,它們并不具備直接訪問硬件的權(quán)限。這就出現(xiàn)了問題,假如軟件需要訪問硬件或者需要調(diào)用內(nèi)核中的函數(shù)該怎么辦呢,這就是陷阱的作用了。陷阱指令可以使執(zhí)行流程從用戶態(tài)陷入內(nèi)核(這也就是為什么叫做陷阱,而不是捕獵的陷阱)并把控制權(quán)轉(zhuǎn)移給操作系統(tǒng),使得用戶程序可以調(diào)用內(nèi)核函數(shù)和使用硬件從而獲得操作系統(tǒng)所提供的服務(wù),比如用視頻軟件放一個(gè)電影,視頻軟件就發(fā)出陷阱使用顯示器和聲卡從而訪問硬件。

操作系統(tǒng)有很多系統(tǒng)調(diào)用接口供用程序調(diào)用。陷阱的發(fā)生時(shí)間是固定的,比如第一次用視頻軟件時(shí),在加載視頻時(shí)軟件會(huì)向操作系統(tǒng)發(fā)送陷阱指令,第二次播放時(shí),軟件仍然會(huì)在同樣的時(shí)刻發(fā)送陷阱指令。這一點(diǎn)是和中斷的明顯的差別之一。下面介紹中斷。

中斷中斷是由外部事件導(dǎo)致并且它發(fā)生的時(shí)間是不可預(yù)測的,這一點(diǎn)和陷阱不同。外部事件主要是指時(shí)鐘中斷,硬件中斷等。由于CPU一次只能運(yùn)行一條指令,所以在一個(gè)時(shí)刻只能有一個(gè)程序運(yùn)行,但我們感覺在我們的計(jì)算機(jī)中明明可以同時(shí)運(yùn)行很多程序啊,這是由于CPU在多個(gè)進(jìn)程之間快速切換所導(dǎo)致的偽并行。如果某一個(gè)程序運(yùn)行了足夠長用完了分配給它的時(shí)間片,CPU決定切換到另一個(gè)進(jìn)程運(yùn)行,就會(huì)產(chǎn)生一個(gè)時(shí)鐘中斷,切換到下一個(gè)進(jìn)程運(yùn)行。

硬件中斷顧名思義就是由硬件引起的中斷,比如一個(gè)程序需要用戶輸入一個(gè)數(shù)據(jù),但用戶一直沒有輸入,操作系統(tǒng)決定是一直等待用戶輸入還是轉(zhuǎn)而運(yùn)行別的進(jìn)程,一般情況是轉(zhuǎn)而運(yùn)行別的進(jìn)程,如果用戶的輸入到來了,那么鍵盤驅(qū)動(dòng)器會(huì)產(chǎn)生一個(gè)中斷通知操作系統(tǒng),操作系統(tǒng)保存正在運(yùn)行的程序的狀態(tài),從而切換到原來的進(jìn)程處理到來的數(shù)據(jù)。

所以中斷發(fā)生是隨機(jī)的且主要作用是完成進(jìn)程間切換,從而支持CPU和設(shè)備之間的并行。

中斷和異常的另一個(gè)重要差別是,CPU處理中斷的過程中會(huì)屏蔽中斷,不接受新的中斷直到此次中斷處理結(jié)束。而陷阱的發(fā)生并不屏蔽中斷,可以接受新的中斷。

異常異常就是程序執(zhí)行過程中的異常行為。比如除零異常,緩沖區(qū)溢出異常等。不同的操作系統(tǒng)定義了不同種類和數(shù)量的異常并且每個(gè)異常都有一個(gè)唯一的異常號(hào),異常會(huì)擾亂程序的正常執(zhí)行流程,所以異常是在CPU執(zhí)行指令時(shí)本身出現(xiàn)的問題,比如除數(shù)為零而出現(xiàn)的除零異常。異常的產(chǎn)生表示程序設(shè)計(jì)不合理,所以在編程的時(shí)候要盡量避免異常的產(chǎn)生。

異常陷阱的基本概念中斷是指計(jì)算機(jī)在執(zhí)行期間,系統(tǒng)內(nèi)發(fā)生任何非尋常的或非預(yù)期的急需處理事件,使得CPU暫時(shí)中斷當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的事件處理程序,待處理完畢后又返回原來被中斷處繼續(xù)執(zhí)行或調(diào)度新的進(jìn)程執(zhí)行的過程。引起中斷發(fā)生的事件被稱為中斷源。中斷源向CPU發(fā)出的請(qǐng)求中斷處理信號(hào)稱為中斷請(qǐng)求,而CPU收到中斷請(qǐng)求后轉(zhuǎn)到相應(yīng)的事件處理程序稱為中斷響應(yīng)。

在有些情況下,盡管產(chǎn)生了中斷源和發(fā)出了中斷請(qǐng)求,但CPU內(nèi)部的處理器狀態(tài)字PSW的中斷允許位已被清除,從而不允許CPU響應(yīng)中斷。這種情況稱為禁止中斷。CPU禁止中斷后只有等到PSW的中斷允許位被重新設(shè)置后才能接收中斷。禁止中斷也稱為關(guān)中斷,PSW的中斷允許位的設(shè)置也被稱為開中斷。開中斷和關(guān)中斷是為了保證某段程序執(zhí)行的原子性。

還有一個(gè)比較常用的概念是中斷屏蔽。中斷屏蔽是指在中斷請(qǐng)求產(chǎn)生之后,系統(tǒng)有選擇地封鎖一部分中斷而允許另一部分中斷仍能得到響應(yīng)。不過,有些中斷請(qǐng)求是不能屏蔽甚至不能禁止的,也就是說,這些中斷具有最高優(yōu)先級(jí),只要這些中斷請(qǐng)求一旦提出,CPU必須立即響應(yīng)。例如,電源掉電事件所引起的中斷就是不可禁止和不可屏蔽的。

分類與優(yōu)先級(jí)根據(jù)系統(tǒng)對(duì)中斷處理的需要,操作系統(tǒng)一般對(duì)中斷進(jìn)行分類并對(duì)不同的中斷賦予不同的處理優(yōu)先級(jí),以便在不同的中斷同時(shí)發(fā)生時(shí),按輕重緩急進(jìn)行處理。

根據(jù)中斷源產(chǎn)生的條件,可把中斷分為外中斷和內(nèi)中斷。外中斷是指來自處理器和內(nèi)存外部的中斷,包括I/0設(shè)備發(fā)出的I/O中斷、外部信號(hào)中斷(例如用戶鍵人ESC鍵)。各種定時(shí)器引起的時(shí)鐘中斷以及調(diào)試程序中設(shè)置的斷點(diǎn)等引起的調(diào)試中斷等。外中斷在狹義上一般被稱為中斷。

內(nèi)中斷主要指在處理器和內(nèi)存內(nèi)部產(chǎn)生的中斷。內(nèi)中斷一般稱為陷阱(trap)或異常。它包括程序運(yùn)算引起的各種錯(cuò)誤,如地址非法、校驗(yàn)錯(cuò)、頁面失效、存取訪問控制錯(cuò)、算術(shù)操作溢出、數(shù)據(jù)格式非法、除數(shù)為零、非法指令、用戶程序執(zhí)行特權(quán)指令、分時(shí)系統(tǒng)中的時(shí)間片中斷以及從用戶態(tài)到核心態(tài)的切換等都是陷阱的例子。

為了按中斷源的輕重緩急處理響應(yīng)中斷,操作系統(tǒng)為不同的中斷賦予不同的優(yōu)先級(jí)。例如在UNIX系統(tǒng)中,外中斷和陷阱的優(yōu)先級(jí)共分為8級(jí)。為了禁止中斷或屏蔽中斷,CPU的處理器狀態(tài)字PSW中也設(shè)有相應(yīng)的優(yōu)先級(jí)。如果中斷源的優(yōu)先級(jí)高于PSW的優(yōu)先級(jí),則CPU響應(yīng)該中斷源的請(qǐng)求;反之,CPU屏蔽該中斷源的中斷請(qǐng)求。

各中斷源的優(yōu)先級(jí)在系統(tǒng)設(shè)計(jì)時(shí)給定,在系統(tǒng)運(yùn)行時(shí)是固定的。而處理器的優(yōu)先級(jí)則根據(jù)執(zhí)行情況由系統(tǒng)程序動(dòng)態(tài)設(shè)定。除了在優(yōu)先級(jí)的設(shè)置方面有區(qū)別之外,中斷和陷阱還有如下主要區(qū)別:

陷阱通常由處理器正在執(zhí)行的現(xiàn)行指令引起,而中斷則是由與現(xiàn)行指令無關(guān)的中斷源引起的。陷阱處理程序提供的服務(wù)為當(dāng)前進(jìn)程所用,而中斷處理程序提供的服務(wù)則不是為了當(dāng)前進(jìn)程的。中斷是由硬件引起的,而異常是由軟件引起的;中斷是異步的,而異常是同步的。

CPU執(zhí)行完一條指令之后,下一條指令開始之前響應(yīng)中斷,而在一條指令執(zhí)行中也可以響應(yīng)陷阱。例如執(zhí)行指令非法時(shí),盡管被執(zhí)行的非法指令不能執(zhí)行結(jié)束,但CPU仍可對(duì)其進(jìn)行處理。

異常陷阱類指令BKPT斷點(diǎn)格式:BKPT1

操作:

(SSP)一(SP)一6

((SP))一(PC)

((SSP))一(PSW)

(PSW)+-代碼存貯器(斷點(diǎn)向量)

(PC.15一o)一代碼存貯器(斷點(diǎn)向量)

說明:引起一個(gè)斷點(diǎn)陷阱。它類似于立即中斷,使用某一向量調(diào)用一個(gè)將在系統(tǒng)方式下被執(zhí)行的代碼塊。該指令用于仿真器系統(tǒng),以提供執(zhí)行硬件斷點(diǎn)的一種簡單方法。

對(duì)于一個(gè)在所有條件下均適合工作的斷點(diǎn),其指令長度必須不大于處理器中最短的其它指令。這種情況下,為單字節(jié)NOP。這種要求是困為斷點(diǎn)可能被插入后隨其它指令的NOP位置,該指令為轉(zhuǎn)移或者不通過斷點(diǎn)執(zhí)行。若斷點(diǎn)指令長于NOP。它在執(zhí)行指令序列時(shí)將與下一條指令發(fā)生沖突。

斷點(diǎn)指令操作碼特定為全1(FF)。這樣,未編程的EPROM代碼存貯器將包括斷點(diǎn)。類似的,NOP指令操作碼為全0,以便兩個(gè)“空白”碼說明無害指令。

長度:無

影響標(biāo)志:無

字節(jié)數(shù):1

周期數(shù):23/19(PZ)

RESET軟件復(fù)位格式:RESET

操作:(PC)