用戶態和內核態的理解和區別

1、linux進程有4GB地址空間,如圖所示:

3G-4G大部分是共享的,是內核態的地址空間。這里存放整個內核的代碼和所有的內核模塊以及內核所維護的數據。

2、特權級的概念:

對于任何操作系統來說,創建一個進程是核心功能。創建進程要做很多工作,會消耗很多物理資源。比如分配物理內存,父子進程拷貝信息,拷貝設置頁目錄頁表等等,這些工作得由特定的進程去做,所以就有了特權級別的概念。最關鍵的工作必須交給特權級最高的進程去執行,這樣可以做到集中管理,減少有限資源的訪問和使用沖突。inter x86架構的cpu一共有四個級別,0-3級,0級特權級最高,3級特權級最低。

3、用戶態和內核態的概念:

當一個進程在執行用戶自己的代碼時處于用戶運行態(用戶態),此時特權級最低,為3級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態。Ring3狀態不能訪問Ring0的地址空間,包括代碼和數據;當一個進程因為系統調用陷入內核代碼中執行時處于內核運行態(內核態),此時特權級最高,為0級。執行的內核代碼會使用當前進程的內核棧,每個進程都有自己的內核棧。

用戶運行一個程序,該程序創建的進程開始時運行自己的代碼,處于用戶態。如果要執行文件操作、網絡數據發送等操作必須通過write、send等系統調用,這些系統調用會調用內核的代碼。進程會切換到Ring0,然后進入3G-4G中的內核地址空間去執行內核代碼來完成相應的操作。內核態的進程執行完后又會切換到Ring3,回到用戶態。這樣,用戶態的程序就不能隨意操作內核地址空間,具有一定的安全保護作用。這說的保護模式是指通過內存頁表操作等機制,保證進程間的地址空間不會互相沖突,一個進程的操作不會修改另一個進程地址空間中的數據。

4、用戶態和內核態的切換

當在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成一些用戶態自己沒有特權和能力完成的操作時就會切換到內核態。

用戶態切換到內核態的3種方式

(1)系統調用

這是用戶態進程主動要求切換到內核態的一種方式。用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作。例如fork()就是執行了一個創建新進程的系統調用。系統調用的機制和新是使用了操作系統為用戶特別開放的一個中斷來實現,如Linux的int 80h中斷。

(2)異常

當cpu在執行運行在用戶態下的程序時,發生了一些沒有預知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關進程中,也就是切換到了內核態,如缺頁異常。

(3)外圍設備的中斷

當外圍設備完成用戶請求的操作后,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令而轉到與中斷信號對應的處理程序去執行,如果前面執行的指令時用戶態下的程序,那么轉換的過程自然就會是 由用戶態到內核態的切換。如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行后邊的操作等。

這三種方式是系統在運行時由用戶態切換到內核態的最主要方式,其中系統調用可以認為是用戶進程主動發起的,異常和外圍設備中斷則是被動的。從觸發方式上看,切換方式都不一樣,但從最終實際完成由用戶態到內核態的切換操作來看,步驟有事一樣的,都相當于執行了一個中斷響應的過程。系統調用實際上最終是中斷機制實現的,而異常和中斷的處理機制基本一致。

5、用戶態到內核態具體的切換步驟:

(1)從當前進程的描述符中提取其內核棧的ss0及esp0信息。

(2)使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,這個過程也完成了由用戶棧到內核棧的切換過程,同時保存了被暫停執行的程序的下一條指令。

(3)將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器,開始執行中斷處理程序,這時就轉到了內核態的程序執行了。
--------------------- ?
作者:As you will ?
來源:CSDN ?
原文:https://blog.csdn.net/qq_39823627/article/details/78736650 ?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

轉載于:https://www.cnblogs.com/fengff/p/10485066.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248405.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248405.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面經-多益網絡

面試時間:2019.07.22 QQ視頻面試 面試崗位:人工智能及大數據/一面 面試時長:35分鐘 面試內容: 自我介紹項目-視頻召回實際場景題-怎么通過數學公式查找相似的數學公式對加班怎么看對比實習公司的特點主動詢問落地方向面試評價&…

區塊鏈基礎語言(三)——Go語言開發工具

一、在Windows系統安裝Goland 1.1 下載 官網地址&#xff1a;https://www.jetbrains.com/go/download/#sectionwindows 1.2 安裝 a. 雙擊“goland-2018.1.5.exe”&#xff0c;單擊“運行”&#xff0c;如圖1所示&#xff1b; <圖1> b. 如圖2所示&#xff0c;單擊“next”…

最小的K個數

最小的K個數 題目描述 輸入n個整數&#xff0c;找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字&#xff0c;則最小的4個數字是1,2,3,4,。 未完, 待續, 好像設計堆排序 先排序在遍歷, 此處使用插曲排序 class Solution { public:void insertSort(vector<int> &am…

準備重新開始寫了

工作很忙,而且前一段時間項目組由于方向和人員調整一直很動蕩,所以就沒有心情和時間來整理技術.準備重新開張了,好好寫,爭取每個月出一到兩篇說得過去的文章.轉載于:https://www.cnblogs.com/sun/archive/2008/06/12/1218220.html

Georgia and Bob POJ - 1704 階梯Nim

$ \color{#0066ff}{ 題目描述 }$ Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, number the grids from left to right by 1, 2, 3, ..., and place N chessmen on different grids, as shown in the following figure for exampl…

Tomcat總結

Tomcat調優原理&#xff1a; 1、增加最大連接數&#xff08;增大值避免隊列請求過多&#xff0c;導致響應緩慢&#xff09; 2、調整工作模式 Bio(BlockingI/O)&#xff1a;默認工作模式&#xff0c;阻塞式I/O操作&#xff0c;沒有任何優化技術處理&#xff0c;性能比較低。Nio(…

Android中寫文本文件的方法

下面是我在Android開發中&#xff0c;一個寫文本文件的方法&#xff0c;代碼如下&#xff1a; //將字符串寫入到文本文件中 public static void WriteTxtFile(String strcontent,String strFilePath) { //每次寫入時&#xff0c;都換行寫 String strConten…

前端筆記-jquery

jquery簡介 兼容性強,輕量級庫,js的框架,國外的大神寫好我們只要調用就好了,jquery可以把js寫的更加簡單 jquery使用 <script srcjquery-x.x.x.js></script> 引入文件就行了 jquery語法 $(selector).action() jquery選擇器 1.基本選擇器 $("*") $(&quo…

JVM的監控工具之jstack

參考博客&#xff1a;https://www.jianshu.com/p/213710fb9e40 jstack&#xff08;Stack Trace for Java&#xff09;命令用于生成虛擬機當前時刻的線程快照&#xff08;一般稱為threaddump或者javacore文件&#xff09;。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧…

liunx驅動----異步通知

查詢&#xff1a;消耗資源 中斷&#xff1a;read 一直要去讀poll &#xff1a;指定起始時間異步通知signal 測試程序include <stdio.h> include <signal.h>void my_signal(int signum) {static unsigned int cnt;printf("signum %d, %d timer\n",signum…

面試官: 用css實現android系統的loading動畫

源碼: github.com/any86/any-u… ios/android web常用的loading圖標有2種, 一種是ios的"菊花", 一種是android的"環". 今天我們用svg實現android的"環"動畫, 下節課實現ios的"菊花". 注意: gif幀數少的原因, 實際動畫效果是很平滑的.d…

2018-06-29 西游記主題Python入門示例嘗試-數據結構 5.1-5.1.2

(見前: 中文代碼示例視頻演示Python入門第五章 數據結構 仍然基于官方文檔, 歡迎建議(尤其是如何取材). 5. Data Structures - More on Lists 列表詳述 >>> 人物 [佛, 妖, 凡人, 菩薩, 妖, 凡人] >>> 人物.count(妖) 2 >>> 人物.count(圣人) 0 >…

Niginx 集群負載均衡策略

Niginx 集群負載均衡策略 所需物料 1.Nginx服務 步驟略 本人 nginx version: nginx/1.16.0 2.Java Servlet 測試項目 新建java web 項目&#xff0c;項目名稱為&#xff1a;tt import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annot…

C#循環給多個控件賦值

需要給 多個 文本框重新賦值 1 textBox1.Text"ss"; 2 3 textBox2.Text"ss"; 4 5 textBox999.Text"ss"; 6 7 textBox99999.Text"ss"; 這樣太麻煩&#xff0c;控件過多不方便寫 通過遍歷 一次性賦值&#xff0c;再多也不怕了 將所有T…

記號一次更換IBM X3650M4主板后RAID無法啟動的解決

https://wenku.baidu.com/view/9d503ef367ec102de2bd89d7.html 強烈感謝上面分享文檔的大俠&#xff01;&#xff01; 1、更換主板后&#xff0c;linux系統&#xff0c;無法加載引導。需要設置主板的啟動項 2、選擇boot manager&#xff0c;進到下面的畫面 3、選擇add boot opt…

關于REST API設計的一些小經驗

版權聲明&#xff1a;轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明http://phoenixtoday.blogbus.com/logs/45855234.html 最近小組里有一些關于REST API設計的討論&#xff0c;有些收獲&#xff0c;打算在這里寫一下。通常來講設計第一個版本的REST API并不難&…

1037 在霍格沃茨找零錢

題目傳送門&#xff1a;https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232 題解&#xff1a; #include<iostream> using namespace std;int main() {int Galleon1, Sickle1, Knut1, Galleon2, Sickle2, Knut2;char c;cin >> Galleon…

我對創業和管理的一些看法

創業&#xff0c;對于剛工作的人&#xff0c;會比較興奮&#xff0c;因為創業充滿想象力&#xff1b;對于工作幾年的人&#xff0c;會比較向往&#xff0c;因為壓抑得太久。其實&#xff0c;創業和就業一樣&#xff0c;只是實現自己人生價值的兩種方式&#xff0c;關鍵是心態問…

關于Anaconda的環境和包管理

Anaconda相對于原生python解釋器具有更好的包管理功能&#xff0c;它有一個env文件夾&#xff0c;里面包含所要管理的所有環境&#xff1b;日常操作時我們可能會使用pytorch、Tensorflow等多個環境&#xff0c;由于每個環境對Python的包的兼容性都不一樣&#xff0c;所以我們可…

WCF basicHttpBinding之Message Security Mode

原創地址&#xff1a;http://www.cnblogs.com/jfzhu/p/4067873.html 轉載請注明出處 前面的文章《WCF Security基本概念》介紹了WCF的security mode&#xff0c;簡單說Transport是transport級別上的加密&am…