中斷向量表
在存儲器地址空間中,規定最低的1K空間,即00000H到003FFH為中斷向量表。全表共含256個中斷向量,每個向量的長度為4位元組,包含
中斷處理程序的起始地址。共有從0到255共256個中斷類型碼,每個中斷類型碼對應的中斷向量所在地址為該類型碼乘以4。舉例而言,如果中斷類型碼為
1,則對應中斷向量所在地址為00004H;如果中斷類型碼為33,則對應中斷向量所在地址為00084H。這樣,如果已知一個中斷類型碼,則需要通過兩
次地址轉換(中斷類型碼到中斷向量表地址;中斷向量表地址到中斷處理程序地址)才能到達中斷處理程序。另外應注意每一個中斷向量所包含的地址是以低二位元
組存儲偏移量,高二位元組存儲段地址的形式存儲目標地址值的。
在全部256個中斷中,前32個(0—31)為硬體系統所預留。後224個可由用戶設定。在初始化8259A時,可設定其上各中斷引腳(共8條)對應的中斷類型碼。同時,將對應此中斷之處理程序的起始地址保存在該中斷類型碼乘4的地址位中,作為中斷向量。
在INTEL後續的32位CPU中,使用中斷描述符表來代替中斷向量表。中斷描述符表的起始地址由中斷描述符表暫存器(IDTR)來定位,因此不再
限於底部1K位置。另一方面,中斷描述符表的每一個項目——稱作門描述符——除了含有中斷處理程序地址信息外,還包括許多屬性/類型位。門描述符分為三
類:任務門、中斷門和自陷門。CPU對不同的門有不同的調用(處理)方式。
中斷處理過程
在實際運行中,一旦設備通過某引腳N向8259A發出中斷指令,後者便向8086A的INTR引腳發送中斷信號。8086A通過INTA引腳通知
8259A中斷有效(這個過程實際上還包括對此8259A的選址),後者即通過地址匯流排將對應引腳N的中斷類型碼(已預先存好,見上節)發送給CPU。
CPU得到中斷類型碼後,先進行現場保護,主要包括:
- 狀態暫存器FLAGS壓棧(同時堆疊暫存器SP-2);
- 關閉中斷(將FLAGS暫存器的IF位置零);
- 將當前代碼段暫存器CS和程序計數器IP壓棧(同時堆疊暫存器SP-4)。
現場保護完成後,CPU開始按照前述的兩步驟翻譯中斷程序入口地址。在得到中斷處理程序地址之後但調用中斷處理程序之前,CPU會再檢查一下NMI引腳是否有信號,以防在剛才的處理過程中忽略了可能的NMI中斷。NMI的優先順序始終高於INTR。
中斷處理程序雖然是由程式設計師編寫,但須循一定規範。作為常式,中斷處理程序應該先將各暫存器信息(除了IP和CS,此二暫存器現已指向當前中斷
程序)壓入堆疊予以保存,這樣才能在中斷處理程序內部使用這些暫存器。在程序結束時,應該按與壓棧保護時相反的順序彈出各暫存器的值。中斷程序的最後一句
始終是IRET指令,這條指令將棧頂6個位元組分別彈出並存入IP、CS和FLAGS暫存器,完成了現場的還原。
當然,如果是作業系統的中斷處理程序,則未必——通常不會——還原中斷前的狀態。這樣的中斷處理程序通常會在調用完暫存器保存常式後,調用進程調度
程序(多由高級語言編寫),並決定下一個運行的進程。隨後將此進程的暫存器信息(上次中斷時保存下來的)存入暫存器並返回。在中斷程序結束之後,主程序也
發生了改變。
留言列表

