上下文context:上下文簡單說來就是一個環境,相對於進程而言,就是進程執行時的環境。具體來說就是各個變數和資料,包括所有的寄存器變數、進程開啟的檔案、記憶體資訊等。
一個進程的上下文可以分為三個部分:使用者級上下文、寄存器上下文以及系統級上下文。
使用者級上下文: 本文、資料、使用者堆棧以及共用儲存區;
寄存器上下文: 通用寄存器、程式寄存器(IP)、處理器狀態寄存器(EFLAGS)、棧指標(ESP);
系統級上下文: 進程式控制制塊task_struct、記憶體管理資訊(mm_struct、vm_area_struct、pgd、pte)、核心棧。
當發生進程調度時,進行進程切換就是環境切換(context switch).作業系統必須對上面提到的全部資訊進行切換,新調度的進程才能運行。而系統調用進行的模式切換(mode switch)。模式切換與進程切換比較起來,容易很多,而且節省時間,因為模式切換最主要的任務只是切換進程寄存器內容相關的切換。
處理器總處於以下狀態中的一種:
1、核心態,運行於進程上下文,核心代表進程運行於核心空間;
2、核心態,運行於中斷上下文,核心代表硬體運行於核心空間;
3、使用者態,運行於使用者空間。
使用者空間的應用程式,通過系統調用,進入核心空間。這個時候使用者空間的進程要傳遞很多變數、參數的值給核心,核心態啟動並執行時候也要儲存使用者進程的一些寄存器值、變數等。所謂的“進程上下文”,可以看作是使用者進程傳遞給核心的這些參數以及核心要儲存的那一整套的變數和寄存器值和當時的環境等。
硬體通過觸發訊號,導致核心調用中斷處理常式,進入核心空間。這個過程中,硬體的一些變數和參數也要傳遞給核心,核心通過這些參數進行中斷處理。所謂的“中斷上下文”,其實也可以看作就是硬體傳遞過來的這些參數和核心需要儲存的一些其他環境(主要是當前被打斷執行的進程環境)。
LINUX完全注釋中的一段話:
當一個進程在執行時,CPU的所有寄存器中的值、進程的狀態以及堆棧中的內容被稱為該進程的上下文。當核心需要切換到另一個進程時,它需要儲存當前進程的所有狀態,即儲存當前進程的上下文,以便在再次執行該進程時,能夠必得到切換時的狀態執行下去。在LINUX中,當前進程上下文均儲存在進程的任務資料結構中。在發生中斷時,核心就在被中斷進程的上下文中,在核心態下執行插斷服務常式。但同時會保留所有需要用到的資源,以便中繼服務結束時能恢複被中斷進程的執行。
當發生進程調度時,進行進程切換就是環境切換(context switch).作業系統必須對上面提到的全部資訊進行切換,新調度的進程才能運行。而系統調用進行的模式切換(mode switch)。模式切換與進程切換比較起來,容易很多,而且節省時間,因為模式切換最主要的任務只是切換進程寄存器內容相關的切換。
在進程上下文中,可以用current宏關聯當前進程,也可以睡眠,也可以調用發送器。
看《LInux核心設計與實現 第二版》時,看到一句 “當執行一個中斷處理常式或下半部時,核心處於中斷上下文。”
中斷上下文和進程上下文是兩個沒有瓜葛的概念,儘管中斷內容相關的current宏會被指向被中斷的進程。
因為沒有進程的背景,所以中斷上下文不可以睡眠,也不能調用會引起睡眠的函數,如kmalloc。中斷上下文中的代碼應該儘可能迅速簡潔。