簡介
用戶態(user mode)在計算機結構指兩項類似的概念。在CPU的設計中,用戶態指非特權狀態。在此狀態下,執行的代碼被硬體限定,不能進行某些操作,比如寫入其他進程的存儲空間,以防止給作業系統帶來安全隱患。在作業系統的設計中,用戶態也類似,指非特權的執行狀態。核心禁止此狀態下的代碼進行潛在危險的操作,比如寫入系統配置檔案、殺掉其他用戶的進程、重啟系統等。
CPU設計中的用戶態
用戶態不允許程式進行處理器中要求特權態的操作,以避免作業系統崩潰。每個進程都在各自的用戶空間中運行,而不允許存取其他程式的用戶空間。
x86結構擁有四種級別,級別最高的是ring 0,也就是核心態。級別最低的是ring 3,也就是用戶態。ring 1和ring 2設計成供驅動程式使用,但一般很少使用。
作業系統設計中的用戶態
作業系統中的用戶態,指許可權等級中的一般級別,與之相對的是管理員或者超級用戶(類Unix系統中,名為“root”或“superuser”等)的特權級別。用戶態啟動的每個進程,根據運行該進程的用戶,都被系統賦予特定的許可權。
作業系統的用戶態通常是在相應的CPU用戶態中運行代碼,從而在硬體上,實現非法程式的控制。與CPU級別相比,作業系統容許用戶態有更加複雜的許可權設定。舉例而言,默認下的Unix系統中,運行在用戶態的代碼,不準通過偵聽1024以下的連線埠號,以偽裝成常見的服務,而超級用戶運行的代碼則有權這樣做。
linux用戶態
用戶態與核心態
當一個任務(進程)執行系統調用而陷入核心代碼中執行時,我們就稱進程處於核心運行態(或簡稱為核心態)。此時處理器處於特權級最高的(0 級)核心代碼中執行。當進程處於核心態時,執行的核心代碼會使用當前進程的核心棧。每個進程都有自己的核心棧。
當進程在執行用戶自己的代碼時,則稱其處於用戶運行態(用戶態)。即此時處理器在特權級最低的(3 級)用戶代碼中運行。當正在執行用戶程式而突然被中斷程式中斷時,此時用戶程式也可以象徵性地稱為處於進程的核心態。因為中斷處理程式將使用當前進程的核心棧。這與處於核心態的進程的狀態有些類似。
簡言之:
1、用系統調用時進入核心態。Linux 對硬體的操作只能在核心態,這可以通過寫驅動程式來控制。在用戶態操作硬體會造成core dump。
2、要注意區分系統調用和一般的函式。系統調用由核心提供,如read()、write()、open()等。而一般的函式由軟體包中的函式館提供,如sin()、cos()等。在語法上兩者沒有區別。
3、一般情況:系統調用運行在核心態,函式運行在用戶態。但也有一些函式在內部使用了系統調用(如fopen),這樣的函式在調用系統調用是進入核心態,其他時候運行在用戶態。
上下文關係
處理器總處於以下狀態中的一種:
1、核心態,運行於進程上下文,核心代表進程運行於核心空間;
2、核心態,運行於中斷上下文,核心代表硬體運行於核心空間;
3、用戶態,運行於用戶空間。
用戶空間的應用程式,通過系統調用,進入核心空間。這個時候用戶空間的進程要傳遞很多變數、參數的值給核心,核心態運行的時候也要保存用戶進程的一些暫存器值、變數等。所謂的“進程上下文”,可以看作是用戶進程傳遞給核心的這些參數以及核心要保存的那一整套的變數和暫存器值和當時的環境等。
硬體通過觸發信號,導致核心調用中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和參數也要傳遞給核心,核心通過這些參數進行中斷處理。所謂的“中斷上下文”,其實也可以看作就是硬體傳遞過來的這些參數和核心需要保存的一些其他環境(主要是當前被打斷執行的進程環境)。