🧠 第 3.7.3 章:擷取-執行週期與中斷
你好!歡迎來到電腦科學的核心。本章將介紹讓電腦成為「電腦」的基礎運作過程。無論是載入網頁還是輸入一個字母,你電腦執行的每一條指令都必須經過這個週期。只要掌握了這個概念,你就真正理解了中央處理器(CPU)的運作原理!
如果寄存器(Registers)聽起來名稱很複雜,不用擔心。我們會將這個複雜的過程拆解為簡單易懂的步驟,並輔以比喻,讓你輕鬆記住!
1. 擷取-執行週期 (Fetch-Execute Cycle, FEC):CPU 的日常運作
擷取-執行週期 (FEC) 是指處理器 (CPU) 為了執行儲存在主記憶體中的機器碼程式而不斷重複進行的過程。它通常也被稱為「指令週期」。
1.1 重要寄存器(CPU 的工具)
在深入了解週期之前,我們需要先快速回顧一下涉及的專用寄存器(這些是位於 CPU 內部的小型、超高速記憶體位置)。
- 程式計數器 (Program Counter, PC): 儲存即將執行的「下一條」指令的記憶體位址。(*可以把它想像成食譜書上的書籤。*)
- 記憶體位址寄存器 (Memory Address Register, MAR): 儲存目前正在存取(無論是讀取還是寫入)的記憶體位址。
- 記憶體緩衝寄存器 (Memory Buffer Register, MBR): 暫時存放剛從記憶體擷取,或即將寫入記憶體的資料或指令。(也稱為記憶體資料寄存器/MDR。)
- 當前指令寄存器 (Current Instruction Register, CIR): 儲存目前正在解碼和執行的機器碼指令。
- 狀態寄存器 (Status Register, SR): 保存指示 CPU 目前狀態的標記(位元),例如運算結果是否產生溢位 (Overflow) 或為零。
1.2 擷取-執行週期的三個階段
這個週期包含三個核心階段:擷取 (Fetch)、解碼 (Decode) 和執行 (Execute)。
階段 1:擷取 (FETCH)
此階段從主記憶體中獲取下一條指令。
- 下一條指令的位址從程式計數器 (PC) 複製到記憶體位址寄存器 (MAR)。
(PC → MAR) - MAR 中的位址透過位址匯流排 (Address Bus) 發送到主記憶體。
- 控制單元 (Control Unit) 沿著控制匯流排 (Control Bus) 發送一個讀取 (READ) 訊號。
- 位於該位址的指令從主記憶體中取出,並透過資料匯流排 (Data Bus) 傳回到 CPU,抵達記憶體緩衝寄存器 (MBR)。
- MBR 中的內容(即指令)被複製到當前指令寄存器 (CIR)。
(MBR → CIR) - 程式計數器 (PC) 會自動遞增,指向程式序列中下一條指令的位址。
階段 2:解碼 (DECODE)
控制單元負責解讀指令的含義。
- CIR 中的指令被拆分為兩個部分:運算碼 (Opcode)(要做什麼,例如 ADD, LOAD)和運算元 (Operand)(要使用什麼資料或位址)。
- 控制單元解釋運算碼,並準備必要的硬體組件(如 ALU 或其他寄存器)來執行操作。
- 如果指令涉及記憶體中的資料(例如 LOAD R1, [Address]),控制單元會使用指令中的位址部分,將所需的資料擷取到 MBR 中,為下一階段做好準備。
階段 3:執行 (EXECUTE)
實際執行指令。
- 控制單元產生執行該操作所需的特定控制訊號。
- 如果指令是算術或邏輯運算(如 ADD 或 AND),算術邏輯單元 (ALU) 會使用通常儲存在通用寄存器 (General-Purpose Registers) 中的資料進行計算。
- 如果指令是分支(跳轉),指令中指定的位址會直接載入到程式計數器 (PC) 中,從而改變程式的執行流程。
- 執行後,CPU 在重新開始週期之前會檢查是否有中斷 (Interrupts)(參見第 2 節)。
重點總結:CPU 的工作
FEC 是一個不斷擷取指令、理解指令,然後執行所需操作的連續迴圈。這種對機器碼的序列化執行正是儲存程式概念 (Stored Program Concept) 的定義。
2. 中斷 (Interrupts):為緊急事件暫停週期
通常情況下,CPU 會愉快地一條接一條地執行指令。但如果印表機沒紙了,或者網卡收到了一個高優先級的資料包,該怎麼辦?CPU 需要一種方法來停止當前的工作並處理緊急情況。
2.1 什麼是中斷?
中斷是由硬體或軟體發出的訊號,表示有事件需要 CPU 立即關注。
比喻: 想像 CPU 是一位正在照食譜(程式)做菜的廚師。中斷就像火災警報器響起。廚師必須中斷手邊的工作,處理緊急情況,然後再回到食譜中剛才停下來的地方繼續工作。
2.2 中斷服務常式 (ISRs) 的作用
- 當中斷發生時,CPU 必須執行一個專門處理該事件的小程式,這稱為中斷服務常式 (Interrupt Service Routine, ISR),有時也稱為中斷處理程式。
- ISR 負責解決引起中斷的原因(例如與故障裝置溝通、管理磁碟 I/O,或處理錯誤)。
2.3 中斷對擷取-執行週期的影響
CPU 會在執行 (Execute) 階段結束後,開始下一次擷取 (Fetch) 之前檢查中斷。
如果檢測到中斷:
- 暫停: CPU 暫停當前執行的程式。
- 儲存易失性環境 (Save Volatile Environment): 這是關鍵步驟!CPU 必須儲存暫存當前程式狀態的寄存器內容,以便稍後能從中斷點精確恢復。
- 處理中斷: CPU 將相應 ISR 的起始位址載入到程式計數器 (PC) 中,隨後開始執行 ISR。
- 恢復: 當 ISR 完成後,之前儲存在堆疊 (Stack) 中的寄存器值會被恢復到 CPU 寄存器中。
- 繼續: CPU 回到主程式,並從已恢復的 PC 位址開始重新啟動擷取週期。
儲存易失性環境
易失性環境 (Volatile environment) 指的是 CPU 寄存器中保存的臨時資料和狀態資訊。如果直接執行 ISR 而不儲存這些資訊,它們將會被覆蓋。這些環境必須被保存,通常是存放在主記憶體中一個稱為堆疊 (Stack) 的專用區域。
易失性環境包含:
- 程式計數器 (PC): 確定返回位址所必需。
- 狀態寄存器 (SR): 包含重要的標記(如溢位或零狀態)。
- 堆疊指標 (Stack Pointer): 如果 ISR 本身也使用堆疊,則需要此指標。
- 任何 ISR 可能會更改的其他通用寄存器。
🚨 快速複習:為什麼要儲存易失性環境?
如果 CPU 不儲存 PC,當中斷結束後,CPU 將不知道接下來該執行哪一條指令!如果它不儲存 SR,它可能會在恢復程式時使用錯誤的標記值,從而導致災難性的錯誤。
重點總結:控制與效率
中斷允許 CPU 高效地管理輸入、輸出和錯誤,而無需不斷檢查(或「輪詢」)每個裝置。這種處理緊急外部事件的能力是作業系統中斷處理角色的核心功能。