1. 程式人生 > >(轉)linux使用者態和核心態理解 Linux探祕之使用者態與核心態

(轉)linux使用者態和核心態理解 Linux探祕之使用者態與核心態

原文:https://blog.csdn.net/buptapple/article/details/21454167

Linux探祕之使用者態與核心態-----------https://www.cnblogs.com/bakari/p/5520860.html

1、特權級         Intel x86架構的cpu一共有0~4四個特權級,0級最高,3級最低,硬體上在執行每條指令時都會對指令所具有的特權級做相應的檢查。硬體已經提供了一套特權級使用的相關機制,軟體自然要好好利用,這屬於作業系統要做的事情,對於UNIX/LINUX來說,只使用了0級特權級別和3級特權級。也就是說在UNIX/LINUX系統中,一條工作在0級特權級的指令具有了CPU能提供的最高權力,而一條工作在3級特權的指令具有CPU提供的最低或者說最基本權力   2、使用者態和核心態       核心棧:Linux中每個程序有兩個棧,分別用於使用者態和核心態的程序執行,其中的核心棧就是用於核心態的堆疊,它和程序的task_struct結構,更具體的是thread_info結構一起放在兩個連續的頁框大小的空間內。    現在我們從特權級的排程來理解使用者態和核心態就比較好理解了,當程式執行在3級特權級上時,就可以稱之為執行在使用者態,因為這是最低特權級,是普通的使用者程序執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;反之,當程式執行在0級特權級上時,就可以稱之為執行在核心態。      雖然使用者態下和核心態下工作的程式有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。執行在使用者態的程式不能訪問作業系統核心資料結構合程式。  當我們在系統中執行一個程式時,大部分時間是執行在使用者態下的。在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態。    Linux程序的4GB地址空間,3G-4G部分大家是共享的,是核心態的地址空間,這裡存放在整個核心的程式碼和所有的核心模組,以及核心所維護的資料。使用者執行一個程式,該程式所建立的程序開始是執行在使用者態的,如果要執行檔案操作,網路資料傳送等操作,必須通過write,send等系統呼叫,這些系統呼叫會呼叫核心中的程式碼來完成操作,這時,必須切換到Ring0,然後進入3GB-4GB中的核心地址空間去執行這些程式碼完成操作,完成後,切換回Ring3,回到使用者態。這樣,使用者態的程式就不能隨意操作核心地址空間,具有一定的安全保護作用。 
 保護模式,通過記憶體頁表操作等機制,保證程序間的地址空間不會互相沖突,一個程序的操作不會修改另一個程序的地址空間中的資料。在核心態下,CPU可執行任何指令,在使用者態下CPU只能執行非特權指令。當CPU處於核心態,可以隨意進入使用者態;而當CPU處於使用者態,只能通過中斷的方式進入核心態。一般程式一開始都是運行於使用者態,當程式需要使用系統資源時,就必須通過呼叫軟中斷進入核心態.    3、使用者態和核心態的轉換          1)使用者態切換到核心態的3種方式                 a. 系統呼叫                             這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作。而系統呼叫的機制,其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如lx86的int 80h, powerpc的sc                 b. 異常               當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關的程式中,也就是轉到了核心態,比如缺頁異常。            c. 外圍裝置的中斷                   當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作的完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。          這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍中斷是被動的。     4、具體的切換操作         從觸發方式上看,可以認為純在前述3種不同的型別,但是從最終實際完成由使用者態到核心態的切換操作上來說,涉及的關鍵步驟是完全一致的,沒有任何區別,都相當於執行了一箇中斷響應的過程,因為系統呼叫實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的。關於中斷處理機制的細節合步驟這裡不做過多分析,涉及到有使用者態切換到核心態的步驟主要包括:       【1】從當前程序的描述符中提取其核心棧的ss0及esp0資訊     【2】使用ss0和esp0指向的核心棧將當前程序的cs,eip,eflags,ss,esp資訊儲存起來,這個過程也完成了由使用者棧到核心棧的切換過程,同時儲存了被暫停執行的程式的下一條指令。    【3】將先前又中斷向量檢索得到的中斷處理程式的cs,eip資訊裝入相應的暫存器,開始執行中斷處理程式,這時就轉到核心態的程式執行了。