linux中斷 程序上下文和中斷上下文

2022-04-10 11:22:33 字數 2570 閱讀 6170

中斷發生以後,cpu跳到核心設定好的中斷處理**中去,由這部分核心**來處理中斷。這個處理過程中的上下文就是中斷上下文

為什麼可能導致睡眠的函式都不能在中斷上下文中使用呢?

首先睡眠的含義是將程序置於「睡眠」狀態,在這個狀態的程序不能被排程執行。然後,在一定的時機,這個程序可能會被重新置為「執行」狀態,從而可能被排程執行。 可見,「睡眠」與「執行」是針對程序而言的,代表程序的task_struct結構記錄著程序的狀態。核心中的「排程器」通過task_struct對程序進行排程。

但是,中斷上下文卻不是乙個程序,它並不存在task_struct,所以它是不可排程的。所以,在中斷上下文就不能睡眠。

那麼,中斷上下文為什麼不存在對應的task_struct結構呢?

中斷的產生是很頻繁的(至少每毫秒(看配置,可能10毫秒或其他值)會產生乙個時鐘中斷),並且中斷處理過程會很快。如果為中斷上下文維護乙個對應的task_struct結構,那麼這個結構頻繁地分配、**,並且影響排程器的管理,這樣會對整個系統的吞吐量有所影響。

但是在某些追求實時性的嵌入式linux中,中斷也可能被賦予task_struct結構。這是為了避免:如果出現大量中斷不斷的巢狀的情況,導致一段時間內cpu總是執行在中斷上下文,使得某些優先順序非常高的程序得不到執行。這種做法能夠提高系統的實時性,但是代價中吞吐量的降低。

核心空間和使用者空間是現代作業系統的兩種工作模式,核心模組執行在核心空間,而使用者態應用程式執行在使用者空間。它們代表不同的級別,而對系統資源具有不同的訪問許可權。核心模組執行在最高端別(核心態),這個級下所有的操作都受系統信任,而應用程式執行在較低級別(使用者態)。在這個級別,處理器控制著對硬體的直接訪問以及對記憶體的非授權訪問。核心態和使用者態有自己的記憶體對映,即自己的位址空間。

處理器總處於以下狀態中的一種:

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

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

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

也就是說,使用者態不能訪問核心位址空間的記憶體,也不能直接訪問硬體。要想這麼做,乙個通過系統呼叫進入核心態,也就產生了程序上下文;乙個通過中斷訪問硬體,也就產生了中斷上下文。兩種狀態的切換對應不同的目的(乙個訪問硬體,乙個使用系統呼叫),有不同的**(乙個使用系統呼叫進入,乙個使用硬體中斷進入)。

使用者空間的應用程式,通過系統呼叫,進入核心空間。由核心代表該程序執行於核心空間,這就涉及到上下文的切換,使用者空間和核心空間具有不同的位址對映、通用或專用的暫存器組,而使用者空間的程序要傳遞很多變數、引數給核心,核心也要儲存使用者程序的一些暫存器、變數等,以便系統呼叫結束後回到使用者空間繼續執行。

上下文context:上下文簡單說來就是乙個環境,相對於程序而言,就是程序執行時的環境。具體來說就是各個變數和資料,包括所有的暫存器變數、程序開啟的檔案、記憶體資訊等。

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

所謂「中斷上下文」,就是硬體通過觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理。中斷上下文,其實也可以看作就是硬體傳遞過來的這些引數和核心需要儲存的一些其他環境(主要是當前被中斷的程序環境)。

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

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

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

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

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

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

當發生程序排程時,進行程序切換就是上下文切換(context switch)。作業系統必須對上面提到的全部資訊進行切換,新排程的程序才能執行。而系統呼叫進行的是模式切換(mode switch)。模式切換與程序切換比較起來,容易很多,而且節省時間,因為模式切換最主要的任務只是切換程序暫存器上下文的切換。

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

程序上下文和中斷上下文

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

程序上下文和中斷上下文

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

程序上下文和中斷上下文

核心空間和使用者空間是現代作業系統的兩種工作模式,核心模組執行在核心空間,而使用者態應用程式執行在使用者空間。它們代表不同的級別,而對系統資源具有不同的訪問許可權。核心模組執行在最高端別 核心態 這個級下所有的操作都受系統信任,而應用程式執行在較低級別 使用者態 在這個級別,處理器控制著對硬體的直接...