什麼是使用者態?什麼是核心態 如何區分?

2021-08-18 17:59:54 字數 1889 閱讀 2522

一般現代cpu都有幾種不同的指令執行級別。

在高執行級別下,**可以執行特權指令,訪問任意的實體地址,這種cpu執行級別就對應著核心態。

而在相應的低級別執行狀態下,**的掌控範圍會受到限制。只能在對應級別允許的範圍內活動。

舉例:intel x86 cpu有四種不同的執行級別0-3,linux只使用了其中的0級和3級分別來表示核心態和使用者態。

我想說,對於這個知識我問過我們學校的大牛廖建文老師有關程序問題fork的時候,他跟我說過核心0級環的概念,其實也就是處於核心態。用上面這幅圖可以表示出來。

如何區分使用者態和核心態?

cs暫存器的最低兩位表明了當前**的特權級。

cpu每條指令的讀取都是通過cs:eip這兩個暫存器:

其中cs是**段選擇暫存器,eip是偏移量暫存器。

上述判斷由硬體完成。

一般來說在linux中,位址空間是乙個顯著的標誌:0xc0000000以上的位址空間只能在核心態下訪問,

0x00000000-0xbfffffff的位址空間在兩種狀態下都可以訪問。

注意:這裡所說的位址空間是邏輯位址而不是實體地址。

其實孟寧老師在講解核心知識點已經把這個知識點最精華的部分提取出來了,那麼到底核心中有什麼樣的介面是跟老師說的相關的呢?

其實寫過linux核心驅動程式的同學應該就知道,實現乙個字元裝置驅動,在write方法和read方法中,核心態和使用者態之間的橋梁就是copy_to_user和copy_form_user這兩個介面,因為孟老師說了在高執行級別下,**可以執行特權指令,訪問任意的實體地址,這種cpu執行級別就對應著核心態,而在相應的低級別執行狀態下,**的掌控範圍會受到限制。只能在對應級別允許的範圍內活動。其實正好說明了這個問題,程式設計師或者軟體應用工程師在編寫應用程式去控制裝置驅動的時候,首先肯定是會開啟相應的檔案描述符,然後對相應的檔案描述符進行讀寫,ioctl,lseek之類的操作。當在應用層編寫程式即是屬於使用者態,在應用程式不能訪問任意的硬體實體地址,所以當使用者需要讀取檔案描述符的內的內容時,就需要呼叫read,當使用者需要寫資料進檔案描述符時,就需要用write,在使用者態呼叫這兩個介面,進而就會進行系統呼叫,產生相應的系統呼叫號,然後核心會根據系統呼叫號找到相應的驅動程式,此時系統就處在核心態中,在驅動程式中,首先進行驅動程式初始化,然後註冊,產生驅動程式最重要主裝置號和次裝置號。初始化的過程中由於對相應的read方法和wirte方法進行初始化,故使用者態執行read操作,就會進而使cpu產生異常,然後進入核心態找到相應的read,write當然也是一樣的。

就如同下面這張圖:

當然,我的分析依然還是處於非常片面的,只能說個大概,因為作業系統在執行系統呼叫的過程依然是非常複雜的,但是複雜歸複雜,對於這樣的乙個流程我們還是應當要去了解清楚。

還有乙個例子就是,假設我需要實現乙個led驅動或者其它的驅動,在核心驅動中,我需要將相應的實體地址ioremap成為乙個虛擬位址,當驅動呼叫結束後,還應當取消相應的位址對映,這其實就是在核心態進行的操作,因為在核心中,訪問這些位址以虛擬位址的形式進行相應的記憶體分配。為了使軟體訪問

i/o記憶體

,必須為裝置分配虛擬位址

.這就是

ioremap

的工作。

還有乙個例子就是在使用者態進行mmap操作。linux中的核心空間到使用者空間的位址對映讓使用者層應用可以直接訪問核心位址,這就是mmap方法。

關於這方面的知識,本人也是非常感興趣,當然完成的對這個過程進行剖析,還需要剖析程序的建立,然後程序的排程一系列的問題,還有乙個離不開的記憶體管理,有了記憶體管理那就一定存在mmu,一定需要頁表的對映等等。往後若有總結,我會將知識點分享出來!

如何理解使用者態與核心態

在cpu的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如 清記憶體 設定時鐘等。如果所有的程式都能使用這些指令,那麼你的系統一天宕機n回就不足為奇了。所以,cpu將指令分為特權指令和非特權指令,對於那些危險的指令,只允許作業系統及其相關模組使用,普通的應用程式只能使用那些不會...

什麼是核心

核心 kernel 它相對較小,控制計算機硬體資源,提供程式執行環境。它是程序的管理者。如 linux是gnu作業系統使用的核心 核心的介面被稱為系統呼叫 system call shell是一種特殊的應用程式,它為執行其他應用程式提供乙個介面 核心提供模組 module 模組是乙個目標檔案,其 可...

什麼是競態條件

1 什麼是競態條件?當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的 區稱作臨界區。在臨界區中使用適當的同步就可以避免競態條件。臨界區實現方法有兩種,一種是用synchronized,一種是用lock顯式鎖實現。2 例項 class counter 觀察執行...