Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 核心機制深度解析:異常與中斷處理機制詳解

編輯:Linux 教學

一、異常處理機制

Linux 利用異常機制達成兩大截然不同的目的:

  1. 向進程發送信號,通報異常狀況
    例如:進程執行除以零操作時,CPU 產生「除法錯誤」異常,對應的異常處理程式會向當前進程發送 SIGFPE 信號。進程接收後需採取恢復措施,若無對應處理常式則終止執行。
  2. 管理硬體資源
    此類異常不代表錯誤,而是核心資源管理的關鍵機制:
    • 「裝置不可用」異常:延遲載入浮點暫存器(僅在進程真正使用 FPU 時才載入,節省切換開銷)
    • 「缺頁」異常:延遲分配實體頁框給進程(按需分頁,實現虛擬記憶體)

異常處理標準流程

核心調用異常處理程式的標準結構包含三階段:

  1. 在核心堆疊保存大多數暫存器內容(組合語言實作)
  2. 呼叫 C 語言撰寫的異常處理函式
  3. 透過 ret_from_exception() 從異常返回

詳細的缺頁異常處理將於第六章記憶體管理章節深入探討,本節重點放在中斷處理。

二、中斷處理機制

中斷處理的緊迫性分級

中斷發生時,並非所有操作具備相同緊迫性。將所有操作塞進中斷處理常式不當,因為:

  • 執行時間過長會導致同 IRQ 線上的後續訊號被忽略
  • 中斷處理常式代表進程執行,必須處於 TASK_RUNNING 狀態,否則可能導致系統僵死
  • 中斷處理常式不可執行阻塞操作(如 I/O 裝置操作)

因此 Linux 將中斷操作分為三類:

(1)緊急操作

  • 中斷控制器應答、重新程式化中斷/裝置控制器
  • 修改處理器與裝置同時存取的資料結構
  • 立即執行,且在關閉中斷狀態下

(2)非緊急操作

  • 修改僅處理器存取的資料結構(如讀取鍵盤掃描碼)
  • 立即執行,但在開啟中斷狀態下

(3)非緊急可延遲操作

  • 資料複製到進程位址空間(如鍵盤緩衝區內容傳送給終端機處理程序)
  • 可延遲較長時間不影響核心運作
  • 由「下半部」函式執行(稍後詳細說明)

所有中斷處理常式的四大基本動作

  1. 在核心堆疊保存 IRQ 值與暫存器內容
  2. 向連接該 IRQ 的中斷控制器發送應答(允許後續中斷請求)
  3. 執行共享此 IRQ 的所有裝置的中斷服務常式(ISR)
  4. 跳轉至 ret_from_intr() 結束

下半部機制

「下半部」處理非緊急可延遲操作,主要機制包括:

  • Tasklets:高優先級、不可睡眠、同一 CPU 序列化執行
  • Workqueues:可睡眠、在進程上下文執行、適合耗時操作
  • Threaded IRQs:將 ISR 拆分為快速頂半部 + 執行緒化下半部

現代核心(2.6+)推薦使用 threaded IRQ 或 workqueue 取代傳統 tasklet,獲得更好的調度靈活性與即時性保證。

關鍵差異總結表

分類 執行時機 中斷狀態 典型範例 實作機制
緊急立即關閉中斷PIC 應答、硬體重設ISR 頂半部
非緊急立即開啟中斷讀取硬體暫存器ISR 頂半部
可延遲延後開啟中斷資料拷貝、協定處理Tasklet/Workqueue/Threaded IRQ

深入理解異常與中斷機制,是進行核心模組開發、驅動程式撰寫與系統效能調校的基石。建議搭配核心原始碼(kernel/irq/, arch/x86/kernel/irq.c)與 Documentation/DocBook/kernel-hacking.tmpl 閱讀,並配合 ftrace/perf 進行實際追蹤分析。

Copyright © Windows教程網 All Rights Reserved