进程上下文与中断上下文
最近學習驅動程序中總是發現在某些資料或書籍中提到進程上下文和中斷上下文,但是又都沒有講解什么是上下文;因此筆者查閱資料補充了一下所謂的Linux上下文知識。(注:以下知識度娘而來)
?
上下文(context):
指文章或說話中與某一詞語或文句相連的上文和下文:這個詞的含義聯系上下文不難理解。都不知道誰造出一個這么晦澀難懂的詞的,翻譯成語境和環境多好理解。
(注:以上是度娘對古代文人騷客創作該詞的百科)
?
???????? LINUX完全注釋中的一段話:當一個進程在執行時,CPU的所有寄存器中的值、進程的狀態以及堆棧中的內容被稱為該進程的上下文。當內核需要切換到另一個進程時,它需要保存當前進程的所有狀態,即保存當前進程的上下文,以便在再次執行該進程時,能夠必得到切換時的狀態執行下去。在LINUX中,當前進程上下文均保存在進程的任務數據結構中。在發生中斷時,內核就在被中斷進程的上下文中,在內核態下執行中斷服務例程。但同時會保留所有需要用到的資源,以便中繼服務結束時能恢復被中斷進程的執行。
由上面這段話知:
進程上下文:
當一個進程在執行時,CPU的所有寄存器中的值、進程的狀態以及堆棧中的內容
一個進程的上下文可以分為三個部分:用戶級上下文、寄存器上下文以及系統級上下文。
?????? 用戶級上下文: 正文、數據、用戶堆棧以及共享存儲區;
?????? 寄存器上下文: 通用寄存器、程序寄存器(IP)、處理器狀態寄存器(EFLAGS)、棧指針(ESP);
?????? 系統級上下文: 進程控制塊task_struct、內存管理信息(mm_struct、vm_area_struct、pgd、pte)、內核棧。
當發生進程調度時,進行進程切換就是上下文切換(context switch).操作系統必須對上面提到的全部信息進行切換,新調度的進程才能運行。而系統調用進行的是模式切換(mode switch)。模式切換與進程切換比較起來,容易很多,而且節省時間,因為模式切換最主要的任務只是切換進程寄存器上下文的切換。
?
中斷上下文:
當一個進程發生中斷時,首先保存當前進程的上下文信息,然后跳轉到中斷子程序去執行,那么此時在中斷子程序中又會產生當前堆棧及寄存器等值就稱為
中斷上下文。
內核進入中斷上下文是因為中斷信號而導致的中斷處理或軟中斷。而中斷信號的發生是隨機的,中斷處理程序及軟中斷并不能事先預測發生中斷時當前運行的是哪個進程。
?
?
處理器總處于以下狀態中的一種:
1、內核態,運行于進程上下文,內核代表進程運行于內核空間;
2、內核態,運行于中斷上下文,內核代表硬件運行于內核空間;
3、用戶態,運行于用戶空間。
內核可以處于兩種上下文:進程上下文和中斷上下文。在系統調用之后,用戶應用程序進入內核空間,此后內核空間針對用戶空間相應進程的代表就運行于進程上下文。異步發生的中斷會引發中斷處理程序被調用,中斷處理程序就運行于中斷上下文。中斷上下文和進程上下文不可能同時發生。
?
運行于進程上下文的內核代碼是可搶占的,但中斷上下文則會一直運行至結束,不會被搶占。因此,內核會限制中斷上下文的工作,不允許其執行如下操作:
1) 進入睡眠狀態或主動放棄CPU;
由于中斷上下文不屬于任何進程,它與current沒有任何關系(盡管此時current指向被中斷的進程),所以中斷上下文一旦睡眠或者放棄CPU,將無法被喚醒。所以也叫原子上下文(atomic context)。
?
2) 占用互斥體;
為了保護中斷句柄臨界區資源,不能使用互斥鎖(mutexes)。如果獲得不到信號量,代碼就會睡眠,會產生和上面相同的情況,如果必須使用鎖,則使用自旋鎖(spinlock)。
?
3) 執行耗時的任務;
中斷處理應該盡可能快,因為內核要響應大量服務和請求,中斷上下文占用CPU時間太長會嚴重影響系統功能。在中斷處理例程中執行耗時任務時,應該交由中斷處理例程底半部來處理。
?
4) 訪問用戶空間虛擬內存。
因為中斷上下文是和特定進程無關的,它是內核代表硬件運行在內核空間,所以在中斷上下文無法訪問用戶空間的虛擬地址
?
5) 中斷處理例程不應該設置成reentrant(可被并行或遞歸調用的例程)。
因為中斷發生時,preempt和irq都被disable,直到中斷返回。所以中斷上下文和進程上下文不一樣,中斷處理例程的不同實例,是不允許在SMP上并發運行的。
?
6)中斷處理例程可以被更高級別的IRQ中斷。
如果想禁止這種中斷,可以將中斷處理例程定義成快速處理例程,相當于告訴CPU,該例程運行時,禁止本地CPU上所有中斷請求。這直接導致的結果是,由于其他中斷被延遲響應,系統性能下降。
?
?
(注:盡管內核模塊不象應用程序一樣順序執行, 內核做的大部分動作是代表一個特定進程的. 內核代碼可以引用當前進程, 通過存取全局項 current, 它在 <asm/current.h> 中定義, 它產生一個指針指向結構 task_struct, 在 <linux/sched.h> 定義. current 指針指向當前在運行的進程. 在一個系統調用執行期間, 例如 open 或者 read, 當前進程是發出調用的進程. 內核代碼可以通過使用 current 來使用進程特定的信息, 如果它需要這樣.)
轉載于:https://www.cnblogs.com/xuyh/p/4185341.html
總結
以上是生活随笔為你收集整理的进程上下文与中断上下文的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sphinx全文检索功能 | windo
- 下一篇: 青春可长可短, 就看自己如何度过(亦或者