中斷上下文 程序上下文

2021-07-10 15:47:55 字數 3516 閱讀 7372

在學習與作業系統相關的知識時候,我們經常遇到程序上下文、中斷上下文,看似熟悉又感覺不是特別清晰。這裡我們從如下幾個方面進行描述。

上下文是從英文中context翻譯過來的,指的是一種環境。

上下文我們看起來不怎麼熟悉,但是我們可以看context的中文翻譯,或者我們能更加的情形些。context :n 語境;上下文;背景;環境。如過我們對上下文這個詞確實不習慣,可以把它理解成環境來講。

在軟體工程中,上下文是一種屬性的有序序列,它們為駐留在環境內的物件定義環境。在物件的啟用過程中建立上下文,物件被配置為要求某些自動服務,如同步、事務、實時啟用、安全性等等。又比如計算機技術中,相對於程序而言,上下文就是程序執行時的環境。具體來說就是各個變數和資料,包括所有的暫存器變數、程序開啟的檔案、記憶體資訊等。

所謂的「程序上下文」,就是乙個程序在執行的時候,cpu的所有暫存器中的值、程序的狀態以及堆疊上的內容,當核心需要切換到另乙個程序時,它需要儲存當前程序的所有狀態,即儲存當前程序的程序上下文,以便再次執行該程序時,能夠恢復切換時的狀態,繼續執行。

簡單來講,當乙個程序在執行時,cpu的所有暫存器中的值、程序的狀態以及堆疊中的內容被稱為該程序的上下文

乙個程序的上下文可以分為三個部分:使用者級上下文、暫存器上下文以及系統級上下文。

使用者級上下文: 正文、資料、使用者堆疊以及共享儲存區;

暫存器上下文: 通用暫存器、程式暫存器(ip)、處理器狀態暫存器(eflags)、棧指標(esp);

系統級上下文: 程序控制塊task_struct、記憶體管理資訊(mm_struct、vm_area_struct、pgd、pte)、核心棧。

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

處理器是處於以下三種情況中的一種:

1、核心態,執行於程序上下文,核心代表程序執行於核心空間;

2、核心態,執行於中斷上下文,核心代表硬體執行於核心空間;

3、使用者態,執行於使用者空間。

核心功能模組執行在核心空間,而應用程式執行在使用者空間。現代的cpu都具有不同的操作模式,代表不同的級別,不同的級別具有不同的功能,在較低的級別中將禁止某些操作。

linux系統設計時利用了這種硬體特性,使用了兩個級別,最高端別和最低級別,核心執行在最高端別(核心態),這個級別可以進行所有操作,而應用程式執行在較低級別(使用者態),在這個級別,處理器控制著對硬體的直接訪問以及對記憶體的非授權訪問。核心態和使用者態有自己的記憶體對映,即自己的位址空間。

linux

系統只能通過系統呼叫硬體中斷完成從使用者空間到核心空間的控制轉移。

正是因為核心有了不同執行狀態的劃分,才用了上下文的概念。

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

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

引用linux核心完全注釋中的一段話:

當乙個程序在執行時,cpu的所有暫存器中的值、程序的狀態以及堆疊中的內容被稱為該程序的上下文。當核心需要切換到另乙個程序時,它需要儲存當前程序的所有狀態,即儲存當前程序的上下文,以便在再次執行該程序時,能夠必得到切換時的狀態執行下去。在linux中,當前程序上下文均儲存在程序的任務資料結構中。在發生中斷時,核心就在被中斷程序的上下文中,在核心態下執行中斷服務例程。但同時會保留所有需要用到的資源,以便中繼服務結束時能恢復被中斷程序的執行。

中斷上下文:當核心執行乙個中斷處理程式時,核心處於中斷上下文中。中斷上下文和程序無關。因為沒有後備程序,所以中斷上下文不可以睡眠,不能在裡面進行有可能使它睡眠的操作。中斷上下文會一直執行至結束,不會被搶占。

程序上下文主要是異常處理程式和核心執行緒。核心之所以進入程序上下文是因為程序自身的一些工作需要在核心中做。例如,系統呼叫是為當前程序服務的,異常通常是處理程序導致的錯誤狀態等。所以在程序上下文中引用current是有意義的。

核心進入中斷上下文是因為中斷訊號而導致的中斷處理或軟中斷。而中斷訊號的發生是隨機的,中斷處理程式及軟中斷並不能事先**發生中斷時當前執行的是哪個程序,所以在中斷上下文中引用current是可以的,但沒有意義。事實上,對於a程序希望等待的中斷訊號,可能在b程序執行期間發生。例如,a程序啟動寫磁碟操作,a程序睡眠後b程序在執行,當磁碟寫完後磁碟中斷訊號打斷的是b程序,在中斷處理時會喚醒a程序。

核心可以處於兩種上下文:程序上下文和中斷上下文。在系統呼叫之後,使用者應用程式進入核心空間,此後核心空間針對使用者空間相應程序的代表就執行於程序上下文。非同步發生的中斷會引發中斷處理程式被呼叫,中斷處理程式就執行於中斷上下文。中斷上下文和程序上下文不可能同時發生

核心會限制中斷上下文的工作,不允許其執行如下操作:

(1) 進入睡眠狀態或主動放棄cpu;

由於中斷上下文不屬於任何程序,它與current沒有任何關係(儘管此時current指向被中斷的程序),所以中斷上下文一旦睡眠或者放棄cpu,將無法被喚醒。所以也叫原子上下文(atomic context)。

(2) 占用互斥體;

為了保護中斷控制代碼臨界區資源,不能使用mutexes。如果獲得不到訊號量,**就會睡眠,會產生和上面相同的情況,如果必須使用鎖,則使用spinlock。

(3) 執行耗時的任務;

中斷處理應該盡可能快,因為核心要響應大量服務和請求,中斷上下文占用cpu時間太長會嚴重影響系統功能。在中斷處理例程中執行耗時任務時,應該交由中斷處理例程底半部來處理。

(4) 訪問使用者空間虛擬記憶體;

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

(5) 中斷處理例程不應該設定成reentrant(可被並行或遞迴呼叫的例程);

因為中斷發生時,preempt和irq都被disable,直到中斷返回。所以中斷上下文和程序上下文不一樣,中斷處理例程的不同例項,是不允許在smp上併發執行的。

(6)中斷處理例程可以被更高階別的irq中斷。

如果想禁止這種中斷,可以將中斷處理例程定義成快速處理例程,相當於告訴cpu,該例程執行時,禁止本地cpu上所有中斷請求。這直接導致的結果是,由於其他中斷被延遲響應,系統效能下降。

《linux核心設計與實現》

《linux核心完全註解》

程序上下文和中斷上下文

程序上下文和中斷上下文是作業系統中很重要的兩個概念,這兩個概念在作業系統課程中不斷被提及,是最經常接觸 看上去很懂但又說不清楚到底怎麼回事。造成這種局面的原因,可能是原來接觸到的作業系統課程的教學總停留在一種淺層次的理論層面上,沒有深入去研究。處理器總處於以下狀態中的一種 核心態,執行於程序上下文,...

程序上下文和中斷上下文

程序上下文是一種核心所處的操作模式,此時核心代表程序執行 例如執行系統呼叫或執行核心執行緒。上下文context 上下文簡單說來就是乙個環境,相對於程序而言,就是程序執行時的環境。具體來說就是各個變數和資料,包括所有的暫存器變數 程序開啟的檔案 記憶體資訊等。乙個程序的上下文可以分為三個部分 使用者...

程序上下文 中斷上下文

請問程序上下文是什麼意思?1.程序上下文一般在程序切換中提到,也就是當程序要切換時關於當前程序的暫存器內容以及記憶體頁表的詳細資訊等等內容,一句話概括也就是關於描述程序的資訊。2.同意樓上的,就是很多書本上提到的程序控制塊pcb,儲存著程序的很多詳細資訊 3.補充 linux完全注釋中的一段話 當乙...