天天看點

3、核心态和使用者态

當一個任務(程序)執行系統調用而執行核心代碼時,稱程序處于核心核心态,此時處理器處于特權級最高的(0級)核心代碼中執行,當程序處于核心态時,執行的核心代碼會使用目前程序的核心棧,每個程序都有自己的核心棧。當程序執行使用者代碼時,稱其處于使用者态,此時處理器在特權級最低的(3級)使用者代碼中運作。

當正在執行使用者程式而突然被中斷程式中斷時,此時使用者程式也可以象征性地稱為處于程序的核心态,因為中斷處理程式将使用目前程序的核心棧。這與處于核心态的程序的狀态有些類似。核心态與使用者态是作業系統的兩種運作級别,跟intel cpu沒有必然的聯系,intel cpu提供Ring0-Ring3三種級别的運作模式,Ring0級别最高,Ring3最低。

Linux使用了Ring3級别運作使用者态,Ring0作為核心态,沒有使用Ring1和Ring2。Ring3狀态不能通路Ring0的位址空間,包括代碼和資料。Linux程序的4GB位址空間,3G-4G部分大家是共享的,是核心态的位址空間,這裡存放在整個核心的代碼和所有的核心子產品,以及核心所維護的資料。使用者運作一個程式,該程式所建立的程序開始是運作在使用者态的,如果要執行檔案操作,網絡資料發送等操作,必須通過write,send等系統調用,這些系統調用會調用核心中的代碼來完成操作,這時,必須切換到Ring0,然後進入3GB-4GB中的核心位址空間去執行這些代碼完成操作,完成後,切換回Ring3,回到使用者态。這樣,使用者态的程式就不能随意操作核心位址空間,具有一定的安全保護作用。

保護模式,通過記憶體頁表操作等機制,保證程序間的位址空間不會互相沖突,一個程序的操作不會修改另一個程序的位址空間中的資料。在核心态下,CPU可執行任何指令,在使用者态下CPU隻能執行非特權指令。當CPU處于核心态,可以随意進入使用者态;而當CPU處于使用者态,隻能通過中斷的方式進入核心态。一般程式一開始都是運作于使用者态,當程式需要使用系統資源時,就必須通過調用軟中斷進入核心态.

使用nm檢視使用者态程式的符号表内容

使用System.map(核心符号表)檢視核心符号表内容

1. 測試程式中列印使用者态函數位址,并調用系統調用(在核心中列印系統調用函數位址),用"使用者态符号表"和"核心态符号表"示例說明核心态和使用者态位址空間的差異

2. 說明核心态位址映射ioremap();使用者态位址映射mmap()