LINUX中斷機制與信號(http://linux.chinaitlab.com/soft/878170.html)

 LINUX中斷機制與信號 中斷和異常
    中 斷(也稱硬件中斷)
    定義 :中斷是由其他硬件設備依照CPU 時鐘週期信號隨機產生的。
    分類 : 可屏蔽中斷
    非可屏蔽中斷
    來源: 間隔定時器和I/O
    異 常(也稱軟件中斷)
    定義 :當指令執行時由 CPU控制單元 產生的,異常也稱爲“異步中斷”是因爲只有在 一條指令終止執行後CPU 纔會發出中斷。
    分類 : 處理器探測到的異常
    故障
    陷阱
    異常終止
    編程異常( 也稱軟中斷 )
    int指令
    來源: 程序的錯誤產生的
    內核必須處理的異常( 例如:缺頁和內核服務的請求 -int)
    異常處理
    當發生異常時,CPU 控制單元產生一個硬件出錯碼。
    CPU根據該中斷嗎找到中斷向量表內的對應向量,根據該向量轉到中斷處理程序。
    中斷處理程序處理完之後向當前進程發送一個SIG*** 信號。
    若進程定義了相應的信號處理程序則轉移到相應的程序執行,若沒有,則執行內核定義的操作。
    中斷處理
    設備產生中斷
    PIC(可編程中斷控制器)會產生一個對應的中斷向量
    和中斷向量表中的每一箇中斷向量進行比較,轉到對應的中斷處理程序
    中斷處理程序進行保存現場,做相關處理,恢復現場
    內核調度,返回用戶進程
    硬件中斷的上半部和下半部及實現方式
    硬件中斷的分類
    緊急的 —— 這類中斷必須立即執行
    非緊急的 —— 也必須立即執行
    非緊急可延遲的 —— 上半部立即執行,下半部延遲執行
    硬件中斷任務(處理程序)是一個快速、異步、簡單地對硬件做出迅速響應並在最短時間內完成必要操作的中斷處理程序。硬中斷處理程序可以搶佔內核任務並且執 行時還會屏蔽同級中斷或其它中斷,因此中斷處理必須要快、不能阻塞。這樣一來對於一些要求處理過程比較複雜的任務就不合適在中斷任務中一次處理。比如,網卡接收數據的過程中, 首先網卡發送中斷信號告訴 CPU 來取數據,然後系統從網卡中讀取數據存入系統緩衝區中,再下來解析數據然後送入應用層。這些如果都讓中斷處理程序來處理顯然過程太長,造成新來的中斷丟失。因此 Linux 開發人員將這種任務分割爲兩個部分,一個叫上底,即中斷處理程序,短平快地處理與硬 件相關的操作(如從網卡讀數據到系統緩存);而把對時間要求相對寬鬆的任務(如解析數據的工作)放在另一個部分執行,這個部分就是我們這裏要講的下半底。
    下半底是一種推後執行任務,它將某些不那麼緊迫的任務推遲到系統更方便的時刻運行。因爲並不是非常緊急,通常還是比較耗時的, 因此由系統自行安排運行時機,不在中斷服務上下文中執行 。內核中實現 下半底的手段經過不斷演化,目前已經從最原始的BH(bottom thalf) 演生出 BH 、 任務隊列(Task queues ) 、 軟中斷(Softirq ) 、 Tasklet 、 工作隊列(Work queues ) (2.6 內核中新出現的)。
    其中的軟中斷和異常中提到的軟中斷的區別:
    主要是用來處理非緊急可延遲的硬件中斷
    Linux系統定定義的,不是用戶定義,並且個數有限
    關於軟中斷和硬中斷的其它解析:
    軟中斷一般是指由指令int 引起的 “ 僞 ” 中斷動作 —— 給 CPU 製造一箇中斷的假象;而硬中斷則是實實在在由 8259 的連線觸發的中斷。因此,嚴格的 講, int 與 IRQ 毫無關係,但二者均與中斷向量有關係。 int 引起的中斷, CPU 是從指令中取得中斷向量號;而 IRQ 引起的中斷, CPU 必須從數據線上取回中斷號,接下來 CPU 的工作就一樣了:保護現場、根據中斷號得到中斷處理程序地址、執行中斷處理、恢復現場繼續執行被中斷的指令。
    在軟中斷和硬中斷之間的區別是什麼?
    ①硬中斷是由外部事件引起的因此具有隨機性和突發性;軟中斷是執行中斷指令產生的,無面外部施加中斷請求信 號,因此中斷的發生不是隨機的而是由程序安排好的。
    ②硬中斷的中斷響應週期, CPU 需要發中斷回合信號( NMI 不需要),軟中斷的中斷響應周 期, CPU 不需發中斷回合信號。
    ③硬中斷的中斷號是由中斷控制器提供的( NMI 硬中斷中斷號系統指定爲 02H );軟中斷的中斷號由指令直接給出, 無需使用中斷控制器。
    ④硬中斷是可屏蔽的( NMI 硬中斷不可屏蔽),軟中斷不可屏蔽。
    LINUX信號機制
    信號本質
    信號是 異步的進程間通訊機制 ,是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一箇中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知 道信號到底什麼時候到達。
    信號是進程間通信機制中 唯一的異步通信機制, 可以看作是異步通知,通知接收信號的進程有哪些事情發生了。內核也可以因爲內部事件而給進程發送信號,通知進程發生了某個事件。注意,信號只是用來通知某進程發生了什麼事件,並不給 該進程傳遞任何數據。
    產生信號的條件主要有:
    1.  用戶在終端 按下某些鍵時,終端驅動程序會發送信號給前臺進程,例如Ctrl-C 產生 SIGINT 信 號, Ctrl-/ 產生 SIGQUIT 信號, Ctrl-Z 產生 SIGTSTP 信號。
    2.  硬件異常產生信號,這些條件由硬件檢測到並通知內核,然後內核向當前進程發送適當的信號。例如當前進程執行了 除以0 的指令, CPU 的運算單元會產生異常,內核將這個異常解釋爲 SIGFPE 信號發送給進 程。再比如當前進程訪問了非法內存地址, MMU 會產生異常,內核將這個異常解釋爲 SIGSEGV 信 號發送給進程。
    3.  一個進程調用kill(2) 函數可以發送信 號給另一個進程。
    4.  可以用kill(1) 命令發送信號給某個 進程, kill(1) 命令也是調用 kill(2) 函 數實現的,如果不明確指定信號則發送 SIGTERM 信號,該信號的默認處理動作是終止進程。
    5.  當 內核檢測到某種軟件條件發生時也可以通過信號通知進程,例如鬧鐘超時產生SIGALRM 信 號,向讀端已關閉的管道寫數據時產生 SIGPIPE 信號。
    l  進程對信號的處理:
    1.  忽略此信號。
    2.  執行該信號的默認處 理動作。
    3.  提供一個信號處理函數,要求內核在處理該信號時切換到用戶態執行這個處理函 數,這種方式稱爲捕捉(Catch ) 一個信號。
    l  信號與中斷的相似點:
    (1 )採用了相同的異步通信方式;
    (2 )當檢測出有信號或中斷請求時,都暫停正在執行的程序而轉去執行相應的處理程序;
    (3 )都在處理完畢後返回到原來的斷點;
    (4 )對信號或中斷都可進行屏蔽。
    l  信號與中斷的區別:
    (1 )中斷有優先級,而信號沒有優先級,所有的信號都是平等的;
    (2 )信號處理程序是在用戶態下運行的,而中斷處理程序是在覈心態下運行;
    (3 )中斷響應是及時的,而信號響應通常都有較大的時間延遲。
    l  信號機制具有以下三方面的功能:
    (1 )發送信號。發送信號的程序用系統調用 kill( ) 實現;
    (2 )預置對信號的處理方式。接收信號的程序用 signal( ) 來實現對處理方式的預置;
    (3 )收受信號的進程按事先的規定完成對相應事件的處理。
    l  信號捕獲過程
    注:從上圖可以看出,信號的處理時機是在當前進程由於系統調用、中斷或者異常而進 入系統空間以後,從系統空間返回到用戶空間前夕(這樣做主要是出於效率的考慮,和 進程的調用時機一致, 從系統調用返回意味着要離開內核態而返回到用戶態,而狀態的 轉換要花費一定的時間,因此,在返回到用戶態前,系統把在內核態該處理的事全部做 完 )。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章