一.什么是內核態和用戶態
?
內核態:在內核空間執行,通常是驅動程序,中斷相關程序,內核調度程序,內存管理及其操作程序。
用戶態:用戶程序運行空間。
二.什么是進程上下文與中斷上下文
1.進程上下文:
(1)進程上文:其是指進程由用戶態切換到內核態是需要保存用戶態時cpu寄存器中的值,進程狀態以及堆棧上的內容,即保存當前進程的進程上下文,以便再次執行該進程時,能夠恢復切換時的狀態,繼續執行。
(2)進程下文:其是指切換到內核態后執行的程序,即進程運行在內核空間的部分。
2.中斷上下文:
(1)中斷上文:硬件通過中斷觸發信號,導致內核調用中斷處理程序,進入內核空間。這個過程中,硬件的一些變量和參數也要傳遞給內核,內核通過這些參數進行中斷處理。中斷上文可以看作就是硬件傳遞過來的這些參數和內核需要保存的一些其他環境(主要是當前被中斷的進程環境。
(2)中斷下文:執行在內核空間的中斷服務程序。
三.為什么要進行不同之間狀態的切換
在現在操作系統中,內核功能模塊運行在內核空間,而應用程序運行在用戶空間。現代的CPU都具有不同的操作模式,代表不同的級別,不同的級別具有不同的功能,其所擁有的資源也不同;在較低的級別中將禁止使用某些處理器的資源。Linux系統設計時利用了這種硬件特性,使用了兩個級別,最高級別和最低級別,內核運行在最高級別(內核態),這個級別幾乎可以使用處理器的所有資源,而應用程序運行在較低級別(用戶態),在這個級別的用戶不能對硬件進行直接訪問以及對內存的非授權訪問。內核態和用戶態有自己的內存映射,即自己的地址空間。
當工作在用戶態的進程想訪問某些內核才能訪問的資源時,必須通過系統調用或者中斷切換到內核態,由內核代替其執行。進程上下文和中斷上下文就是完成這兩種狀態切換所進行的操作總稱。我將其理解為保存用戶空間狀態是上文,切換后在內核態執行的程序是下文。
四.什么情況下進行用戶態到內核態的切換
1.進程上下文主要是異常處理程序和內核線程。內核之所以進入進程上下文是因為進程自身的一些工作需要在內核中做。例如,系統調用是為當前進程服務的,異常通常是處理進程導致的錯誤狀態等。
2.中斷上下文是由于硬件發生中斷時會觸發中斷信號請求,請求系統處理中斷,執行中斷服務子程序。
五.中斷上下文代碼中注意事項
運行于進程上下文的內核代碼是可搶占的,但中斷上下文則會一直運行至結束,不會被搶占。所以中斷處理程序代碼要受到一些限制,在中斷代碼中不能出現實現下面功能的代碼:
(1)睡眠或者放棄CPU。
因為內核在進入中斷之前會關閉進程調度,一旦睡眠或者放棄CPU,這時內核無法調度別的進程來執行,系統就會死掉。牢記:中斷服務子程序一定不能睡眠(或者阻塞)。
(2)嘗試獲得信號量
如果獲得不到信號量,代碼就會睡眠,導致(1)中的結果。
(3)執行耗時的任務
中斷處理應該盡可能快,因為如果一個處理程序是IRQF_DISABLED類型,他執行的時候會禁止所有本地中斷線,而內核要響應大量服務和請求,中斷上下文占用CPU時間太長會嚴重影響系統功能。中斷處理程序的任務盡可能放在中斷下半部執行。
?
(4)訪問用戶空間的虛擬地址
因為中斷運行在內核空間。