核心空間和使用者空間是作業系統理論的基礎之一,即核心功能模組執行在核心空間,而應用程式執行在使用者空間。現代的cpu都具有不同的操作模式,代表不同的級別,不同的級別具有不同的功能,在較低的級別中將禁止某些操作。linux系統設計時利用了這種硬體特性,使用了兩個級別,最高端別和最低級別,核心執行在最高端別(核心態),這個級別可以進行所有操作,而應用程式執行在較低級別(使用者態),在這個級別,處理器控制著對硬體的直接訪問以及對記憶體的非授權訪問。核心態和使用者態有自己的記憶體對映,即自己的位址空間。
正是有了不同執行狀態的劃分,才有了上下文的概念。使用者空間的應用程式,如果想要請求系統服務,比如操作乙個物理裝置,或者對映一段裝置空間的位址到使用者空間,就必須通過系統呼叫來(作業系統提供給使用者空間的介面函式)實現。如下圖所示:
通過系統呼叫,使用者空間的應用程式就會進入核心空間,由核心代表該程序執行於核心空間,這就涉及到上下文的切換,使用者空間和核心空間具有不同的位址對映,通用或專用的暫存器組,而使用者空間的程序要傳遞很多變數、引數給核心,核心也要儲存使用者程序的一些暫存器、變數等,以便系統呼叫結束後回到使用者空間繼續執行,所謂的程序上下文,就是乙個程序在執行的時候,cpu的所有暫存器中的值、程序的狀態以及堆疊中的內容,當核心需要切換到另乙個程序時,它需要儲存當前程序的所有狀態,即儲存當前程序的程序上下文,以便再次執行該程序時,能夠恢復切換時的狀態,繼續執行。
同理,硬體通過觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理,中斷上下文就可以理解為硬體傳遞過來的這些引數和核心需要儲存的一些環境,主要是被中斷的程序的環境。
linux核心工作在程序上下文或者中斷上下文
。提供系統呼叫服務的核心**代表發起系統呼叫的應用程式執行在程序上下文;另一方面,中斷處理程式,非同步執行在中斷上下文。中斷上下文和特定程序無關。
執行在程序上下文的核心**是可以被搶占的(linux2.6支援搶占)。但是乙個中斷上下文,通常都會始終占有cpu(當然中斷可以巢狀,但我們一般不這樣做),不可以被打斷。正因為如此,執行在中斷上下文的**就要受一些限制,不能做下面的事情:
1、睡眠或者放棄cpu。
這樣做的後果是災難性的,因為核心在進入中斷之前會關閉程序排程,一旦睡眠或者放棄cpu,這時核心無法排程別的程序來執行,系統就會死掉
2、嘗試獲得訊號量
如果獲得不到訊號量,**就會睡眠,會產生和上面相同的情況
3、執行耗時的任務
中斷處理應該盡可能快,因為核心要響應大量服務和請求,中斷上下文占用cpu時間太長會嚴重影響系統功能。
4、訪問使用者空間的虛擬位址
因為中斷上下文是和特定程序無關的,它是核心代表硬體執行在核心空間,所以在終端上下文無法訪問使用者空間的虛擬位址
linux中斷 程序上下文和中斷上下文
中斷發生以後,cpu跳到核心設定好的中斷處理 中去,由這部分核心 來處理中斷。這個處理過程中的上下文就是中斷上下文。為什麼可能導致睡眠的函式都不能在中斷上下文中使用呢?首先睡眠的含義是將程序置於 睡眠 狀態,在這個狀態的程序不能被排程執行。然後,在一定的時機,這個程序可能會被重新置為 執行 狀態,從...
程序上下文和中斷上下文
程序上下文和中斷上下文是作業系統中很重要的兩個概念,這兩個概念在作業系統課程中不斷被提及,是最經常接觸 看上去很懂但又說不清楚到底怎麼回事。造成這種局面的原因,可能是原來接觸到的作業系統課程的教學總停留在一種淺層次的理論層面上,沒有深入去研究。處理器總處於以下狀態中的一種 核心態,執行於程序上下文,...
程序上下文和中斷上下文
程序上下文是一種核心所處的操作模式,此時核心代表程序執行 例如執行系統呼叫或執行核心執行緒。上下文context 上下文簡單說來就是乙個環境,相對於程序而言,就是程序執行時的環境。具體來說就是各個變數和資料,包括所有的暫存器變數 程序開啟的檔案 記憶體資訊等。乙個程序的上下文可以分為三個部分 使用者...