從巨集觀上來看,linux作業系統的體系架構分為使用者態和核心態。核心從本質上看是一種軟體——控制計算機的硬體資源,並提供上層應用程式執行的環境。使用者態即上層應用程式的活動空間,應用程式的執行必須依託於核心提供的資源,包括cpu資源、儲存資源、i/o資源等。為了使上層應用能夠訪問到這些資源,核心必須為上層應用提供訪問的介面:即系統呼叫。
inter的cpu將特權級別分為4個級別:ring0,ring1,ring2,ring3。linux使用了ring3級別執行使用者態,ring0作為 核心態,沒有使用ring1和ring2。ring3狀態不能訪問ring0的位址空間,包括**和資料。
處理器總處於以下狀態中的一種:
1、核心態,執行於程序上下文,核心代表程序執行於核心空間;
2、核心態,執行於中斷上下文,核心代表硬體執行於核心空間;
3、使用者態,執行於使用者空間。
因為作業系統的資源是有限的,如果訪問資源的操作過多,必然會消耗過多的資源,而且如果不對這些操作加以區分,很可能造成資源訪問的衝突。所以,為了減少有限資源的訪問和使用衝突,unix/linux的設計哲學之一就是:對不同的操作賦予不同的執行等級,就是所謂特權的概念。簡單說就是有多大能力做多大的事,與系統相關的一些特別關鍵的操作必須由最高特權的程式來完成。intel的x86架構的cpu提供了0到3四個特權級,數字越小,特權越高,linux作業系統中主要採用了0和3兩個特權級,分別對應的就是核心態和使用者態。執行於使用者態的程序可以執行的操作和訪問的資源都會受到極大的限制,而執行在核心態的程序則可以執行任何操作並且在資源的使用上沒有限制。很多程式開始時執行於使用者態,但在執行的過程中,一些操作需要在核心許可權下才能執行,這就涉及到乙個從使用者態切換到核心態的過程。比如c函式庫中的記憶體分配函式malloc(),它具體是使用sbrk()系統呼叫來分配記憶體,當malloc呼叫sbrk()的時候就涉及一次從使用者態到核心態的切換,類似的函式還有printf(),呼叫的是wirte()系統呼叫來輸出字串,等等。
到底在什麼情況下會發生從使用者態到核心態的切換,一般存在以下三種情況:
當然就是系統呼叫:原因如上的分析。
異常事件: 當cpu正在執行執行在使用者態的程式時,突然發生某些預先不可知的異常事件,這個時候就會觸發從當前使用者態執行的程序轉向核心態執行相關的異常事件,典型的如缺頁異常。
外圍裝置的中斷:當外圍裝置完成使用者的請求操作後,會像cpu發出中斷訊號,此時,cpu就會暫停執行下一條即將要執行的指令,轉而去執行中斷訊號對應的處理程式,如果先前執行的指令是在使用者態下,則自然就發生從使用者態到核心態的轉換。
注意:系統呼叫的本質其實也是中斷,相對於外圍裝置的硬中斷,這種中斷稱為軟中斷,這是作業系統為使用者特別開放的一種中斷,如linux int 80h中斷。所以,從觸發方式和效果上來看,這三種切換方式是完全一樣的,都相當於是執行了乙個中斷響應的過程。但是從觸發的物件來看,系統呼叫是程序主動請求切換的,而異常和硬中斷則是被動的。
使用者態和核心態之間的切換也會消耗大量資源
核心態和使用者態
在核心態下,cpu可執行任何指令,在使用者態下cpu只能執行非特權指令。當cpu處於核心態,可以隨意進入使用者態 而當cpu處於使用者態,只能通過中斷的方式進入核心態。一般程式一開始都是執行於使用者態,當程式需要使用系統資源時,就必須通過呼叫軟中斷進入核心態。當乙個任務 程序 執行系統呼叫而陷入核心...
核心態和使用者態
複習的時候發現 作業系統 書上竟然沒有找到使用者態和核心態的概念,還納悶了半天以為是自己上課的時候沒有認真聽講.核心態 cpu可以訪問記憶體所有資料,包括外圍裝置,例如硬碟,網絡卡.cpu也可以將自己從乙個程式切換到另乙個程式 使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置.占用cpu的能力被...
核心態和使用者態
核心態 cpu可以訪問記憶體所有資料,包括外圍裝置,例如硬碟,網絡卡.cpu也可以將自己從乙個程式切換到另乙個程式 使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置.占用cpu的能力被剝奪,cpu資源可以被其他程式獲取 由於需要限制不同的程式之間的訪問能力,防止他們獲取別的程式的記憶體資料,或者...