作業系統核心

陷阱機制(trap、exception、interrupt)

正常情況下,CPU 只是一條接一條地執行你的指令。但有三類事件能打斷這個流程,迫使 CPU 放下手邊的事、切換進核心的特權模式,並跳到一個核心處理常式。這些合稱陷阱機制——硬體通往核心的萬用門鈴。它們正是核心得以執行的緣由:多數時候 CPU 在執行使用者程式碼,唯有一次陷阱才把控制權帶回作業系統。

它有三種風味,而其區別很重要。陷阱(trap,常稱軟體中斷)是刻意且同步的:你的程式故意執行一條特殊指令,向核心請求服務——系統呼叫就是這樣進入核心的。例外(exception,或稱 fault)也是同步的,但出乎計畫:某條指令做了 CPU 無法完成的事,例如除以零、存取一個未映射的分頁(分頁錯誤),或執行一條非法指令;CPU 停在那條指令並跳到處理常式,後者可能把事情修好(分頁錯誤可載入缺失的分頁再重試),或終結出錯的程式。真正的中斷(interrupt)是非同步且外部的:某個裝置——網路卡、磁碟、計時器——舉起一個與目前指令毫無關係的訊號,說「我現在需要關注」。CPU 完成目前的指令,然後跳到那個裝置的處理常式。

關鍵心智模型:在每一種情況下,硬體都自動儲存足夠的狀態(至少程式計數器)、提升特權,並用一張表找出該跳到的正確核心處理常式。這單一機制撐起了系統呼叫、虛擬記憶體(分頁錯誤)、可搶占式排程器(計時器中斷)以及所有裝置 I/O。一個常見的混淆是把它們混為一談:陷阱與例外是同步的(由執行中的指令所引起,在那一點可重現),而硬體中斷是非同步的(由外部世界所引起,在不可預期的時刻抵達)——這個差別形塑了各自處理方式的一切。

陷阱:'syscall' 指令 -> 核心(刻意)。例外:mov eax, [未映射位址] -> 分頁錯誤 -> 核心處理常式可載入分頁並重試。中斷:網卡舉起 IRQ -> CPU 完成目前指令,再跳到網卡處理常式。

通往核心的三種門鈴:刻意的(陷阱)、出乎計畫但同步的(例外),以及外部非同步的(中斷)。

別把「中斷」等同於這三者。陷阱/例外是同步的(由執行中的指令觸發,且會在那條指令重現),而硬體中斷是非同步的、與當下恰好在執行的任何指令無關——這正是為何中斷處理常式不能對被打斷的程式碼上下文做任何假設。

又称
interrupts and exceptionstrap/fault/interrupt陷阱、例外與中斷