1. 程式人生 > >結合中斷上下文切換和程序上下文切換分析Linux核心的一般執行過程

結合中斷上下文切換和程序上下文切換分析Linux核心的一般執行過程

# 結合中斷上下文切換和程序上下文切換分析Linux核心的一般執行過程 [toc] ## 一. 實驗準備 1. 詳細要求 > 結合中斷上下文切換和程序上下文切換分析Linux核心一般執行過程 > > - 以fork和execve系統呼叫為例分析中斷上下文的切換 > - 分析execve系統呼叫中斷上下文的特殊之處 > - 分析fork子程序啟動執行時程序上下文的特殊之處 > - 以系統呼叫作為特殊的中斷,結合中斷上下文切換和程序上下文切換分析Linux系統的一般執行過程 > > 完成一篇部落格總結分析Linux系統的一般執行過程,以期對Linux系統的整體運作形成一套邏輯自洽的模型,並能將所學的各種OS和Linux核心知識/原理融通進模型中 2. 實驗環境 > 發行版本:Ubuntu 18.04.4 LTS > > 處理器:Intel® Core™ i7-8850H CPU @ 2.60GHz × 3 > > 圖形卡:Parallels using AMD® Radeon pro 560x opengl engine > > GNOME:3.28.2 ## 二. 實驗過程 ### I 分析中斷上下文的切換 中斷髮生以後,CPU跳到核心設定好的中斷處理程式碼中去,由這部分核心程式碼來處理中斷。這個處理過程中的上下文就是**中斷上下文**。 幾乎所有的體系結構,都提供了中斷機制。當硬體裝置想和系統通訊的時候,它首先發出一個非同步的中斷訊號去打斷處理器的執行,繼而打斷核心的執行。中斷通常對應著一箇中斷號,核心通過這個中斷號找到中斷服務程式,呼叫這個程式響應和處理中斷。當你敲擊鍵盤時,鍵盤控制器傳送一箇中斷訊號告知系統,鍵盤緩衝區有資料到來,核心收到這個中斷號,呼叫相應的中斷服務程式,該服務程式處理鍵盤資料然後通知鍵盤控制器可以繼續輸入資料了。為了保證同步,核心可以使用中止---既可以停止所有的中斷也可以有選擇地停止某個中斷號對應的中斷,許多作業系統的中斷服務程式都不在程序上下文中執行,它們在一個與所有程序無關的、專門的中斷上下文中執行。之所以存在這樣一個專門的執行環境,為了保證中斷服務程式能夠在第一時間響應和處理中斷請求,然後快速退出。 對同一個CPU來說,中斷處理比程序擁有更高的優先順序,所以中斷上下文切換並不會與程序上下文切換同時發生。由於中斷程式會打斷正常程序的排程和執行,大部分中斷處理程式都短小精悍,以便儘可能快的執行結束。 一個程序的上下文可以分為三個部分:使用者級上下文、暫存器上下文以及系統級上下文。 **使用者級上下文**: 正文、資料、使用者堆疊以及共享儲存區; **暫存器上下文**: 通用暫存器、程式暫存器(IP)、處理器狀態暫存器(EFLAGS)、棧指標(ESP); **系統級上下文**: 程序控制塊task_struct、記憶體管理資訊(mm_struct、vm_area_struct、pgd、pte)、核心棧。 當發生程序排程時,進行程序切換就是上下文切換(context switch)。作業系統必須對上面提到的全部資訊進行切換,新排程的程序才能執行。而**系統呼叫**進行的是模式切換(mode switch)。模式切換與程序切換比較起來,容易很多,而且節省時間,因為模式切換最主要的任務只是切換程序暫存器上下文的切換。 --- ### **II 分析fork子程序啟動執行時程序上下文及其特殊之處** fork()系統呼叫會通過複製一個現有程序來建立一個全新的程序. 程序被存放在一個叫做任務佇列的雙向迴圈連結串列當中。連結串列當中的每一項都是型別為task_struct成為程序描述符的結構。 **首先我們來看一段程式碼** ```c #