1. 程式人生 > >【轉】對Linux核心中程序上下文和中斷上下文的理解

【轉】對Linux核心中程序上下文和中斷上下文的理解

轉自:http://www.embedu.org/Column/Column240.htm

核心空間和使用者空間是作業系統理論的基礎之一,即核心功能模組執行在核心空間,而應用程式執行在使用者空間。現代的CPU都具有不同的操作模式,代表不同的級別,不同的級別具有不同的功能,在較低的級別中將禁止某些操作。Linux系統設計時利用了這種硬體特性,使用了兩個級別,最高級別和最低級別,核心執行在最高級別(核心態),這個級別可以進行所有操作,而應用程式執行在較低級別(使用者態),在這個級別,處理器控制著對硬體的直接訪問以及對記憶體的非授權訪問。核心態和使用者態有自己的記憶體對映,即自己的地址空間。

正是有了不同執行狀態的劃分,才有了上下文的概念。使用者空間的應用程式,如果想要請求系統服務,比如操作一個物理裝置,或者對映一段裝置空間的地址到使用者空間,就必須通過系統呼叫來(作業系統提供給使用者空間的介面函式)實現。如下圖所示:

通過系統呼叫,使用者空間的應用程式就會進入核心空間,由核心代表該程序運行於核心空間,這就涉及到上下文的切換,使用者空間和核心空間具有不同的地址對映,通用或專用的暫存器組,而使用者空間的程序要傳遞很多變數、引數給核心,核心也要儲存使用者程序的一些暫存器、變數等,以便系統呼叫結束後回到使用者空間繼續執行,所謂的程序上下文,就是一個程序在執行的時候,CPU的所有暫存器中的值、程序的狀態以及堆疊中的內容,當核心需要切換到另一個程序時,它需要儲存當前程序的所有狀態,即儲存當前程序的程序上下文,以便再次執行該程序時,能夠恢復切換時的狀態,繼續執行。

同理,硬體通過觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理,中斷上下文就可以理解為硬體傳遞過來的這些引數和核心需要儲存的一些環境,主要是被中斷的程序的環境。

Linux核心工作在程序上下文或者中斷上下文。提供系統呼叫服務的核心程式碼代表發起系統呼叫的應用程式執行在程序上下文;另一方面,中斷處理程式,非同步執行在中斷上下文。中斷上下文和特定程序無關。

在LINUX中,當前程序上下文均儲存在程序的任務資料結構中。在發生中斷時,核心就在被中斷程序的上下文中,在核心態下執行中斷服務例程。但同時會保留所有需要用到的資源,以便中繼服務結束時能恢復被中斷程序的執行。

執行在程序上下文的核心程式碼是可以被搶佔的(Linux2.6支援搶佔)。但是一箇中斷上下文,通常都會始終佔有CPU(當然中斷可以巢狀,但我們一般不這樣做),不可以被打斷。正因為如此,執行在中斷上下文的程式碼就要受一些限制,不能做下面的事情:

1、睡眠或者放棄CPU。

      這樣做的後果是災難性的,因為核心在進入中斷之前會關閉程序排程,一旦睡眠或者放棄CPU,這時核心無法排程別的程序來執行,系統就會死掉

2、嘗試獲得訊號量

      如果獲得不到訊號量,程式碼就會睡眠,會產生和上面相同的情況

3、執行耗時的任務

      中斷處理應該儘可能快,因為核心要響應大量服務和請求,中斷上下文佔用CPU時間太長會嚴重影響系統功能。

4、訪問使用者空間的虛擬地址

      因為中斷上下文是和特定程序無關的,它是核心代表硬體執行在核心空間,所以在終端上下文無法訪問使用者空間的虛擬地址