2015-11-03 64 views
0

經過大量關於中斷處理等的閱讀後,我仍然可以從頭開始瞭解中斷處理的全部過程。例如: 除以零除。 CPU取指令將數字除以零,並將其發送給ALU。 假設ALU在啓動之前啓動了劃分過程或進行了一些檢查。瞭解處理器和硬件級別的硬件中斷和異常

  1. 異常如何發送給CPU?
  2. CPU如何從一個位信號中知道發生了什麼異常?是否有一個寄存器在讀取中斷後知道這一點? 2.我的應用程序如何捕獲異常? 我是否需要編寫一些函數來捕獲特定的SIGNAL或其他內容?當我寫expcepion處理例程,如 請嘗試{} Catch {} 而且會發生異常,我怎麼知道什麼exeption被拋出並處理好呢?

使我感到困惑的最重要的部分是,例如,當從鍵盤向PIC發出中斷信號時,輪到pic通過改變wite INT向CPU發信號通知中斷髮生。 但是CPU如何知道需要提供哪些設備? 當INTR引腳打開時,CPU正在執行什麼過程? 他有一個例程來檢查一些有中斷值的寄存器(當它打開INT線時由PIC設置嗎?)

請不要禁止帖子,這對我來說真的很重要理解這個話題,我讀了一個研究了一些弱點,但沒有把我的腦海中連接點。

謝謝。

+0

也許閱讀http://wiki.osdev.org/Interrupts(假設x86 arch) – BadZen

+0

已經讀過 – user3601643

+0

那麼,那麼,「當中斷進入時,IDT(由操作系統設置預先)用於跳轉到操作系統的代碼部分,它處理中斷....「不回答你的問題? – BadZen

回答

0

通常有幾件事情與中斷相關,而不僅僅是針腳。通常情況下,對於更新的微控制器,存在一箇中斷向量,該向量位於存儲器中,用於處理每個中斷調用,以及一個寄存器,用於通知中斷事件/標誌。

發生由中斷處理的事件並設置了特定標誌時。根據CPU的優先級和當前狀態,上下文切換時間可能會有所不同,例如,優先級較低的中斷會被標記,而較高優先級的中斷必須等待,直到高優先級中斷結束。在可能嵌套的情況下,優先級較高的中斷可能會中斷較低優先級的中斷。

在異常情況下,例如除以0,確實會被ALU檢測到,CPU可能會提供或不是派生的中斷,我們將在這樣的事件中調用派生的中斷。對於其他類型的例外情況,中斷可能不可用,並且CPU會相應地執行相應操作,例如重新啓動。

作爲結論中斷事件將發生以下方式:

  1. 中斷事件被標記,並且相應的標誌的寄存器被設置
  2. 屆時CPU將上下文切換到所述中斷處理函數。
  3. 在處理程序結束時,中斷標誌被清除,CPU準備好在下一個事件到來時重新標記中斷。

決定在同一時間到達的中斷或不同的優先級中斷因不同的硬件而異。

0

如果在最簡單的中斷模式下開始工作在Z80上的方式,那麼理解中斷可能是最簡單的。該處理器在每個指令期間檢查在某個點調用/ IRQ的引腳 的狀態;如果該引腳被置位且設置了「中斷使能」標誌,那麼當需要獲取下一條指令時,處理器不會使程序計數器前進或從存儲器中讀取一個字節,而是禁用「中斷使能」標誌並「假裝」它讀取了「RST 38h」指令。該指令的行爲類似於一個單字節的「CALL 0038h」指令,推送程序計數器並將控制轉移到該地址。

0038h的代碼可以在需要任何服務時輪詢各種外設,使用「ei」指令打開「啓用中斷」標誌並執行「ret」。如果當時沒有外設仍然立即需要服務,那麼代碼可以繼續執行中斷髮生前的任何操作。爲了防止在執行「ret」時中斷線仍然有效的問題,一些特殊的邏輯將確保中斷線在該指令期間(或緊隨「ei」之後的任何其他指令)被忽略。如果在中斷處理程序運行期間另一個外設已經開發了服務需求,則系統將返回到原始代碼,在返回後處理第一條指令時注意到/ IRQ的狀態,然後使用RST 38h重新啓動序列。

在簡單的Z80方法中,只有一種中斷;任何外設都可以斷言/ IRQ,並且如果有任何外設這樣做,則Z80需要詢問每個外設是否需要關注。在更高級的系統中,可能會有許多不同的中斷,所以當外設需要服務控制時,可以將其分派到專門處理該外設的例行程序中。然而,相同的通用原則仍然適用:中斷有效地將「調用」指令插入處理器正在做的任何事情,做一些事情以確保處理器能夠服務於任何需要的關注,而不會不斷中斷該過程[在Z80上,它只是禁用中斷,但是具有多箇中斷源的系統可以在服務較低優先級時啓用高優先級的源],然後返回到處理器在重新啓用中斷時所做的任何操作。