欧美在线专区-欧美在线伊人-欧美在线一区二区三区欧美-欧美在线一区二区三区-pornodoxxx中国妞-pornodoldoo欧美另类

position>home>Football

什么是Linux內核空間與用戶空間?

[導讀]本文以32位系統為例,內核詳細介紹了內核空間(kernel space)和用戶空間(user space)。空間空間

作者:sparkdev

什么是Linux內核空間與用戶空間?

來源:http://www.cnblogs.com/sparkdev/


本文以 32 位系統為例介紹內核空間(kernel space)用戶空間(user space)。用戶

內核空間和用戶空間

對 32 位操作系統而言,內核它的空間空間尋址空間(虛擬地址空間,或叫線性地址空間)為 4G(2的用戶32次方)。也就是內核說一個進程的最大地址空間為 4G。

操作系統的空間空間核心是內核(kernel),它獨立于普通的用戶應用程序,可以訪問受保護的內核內存空間,也有訪問底層硬件設備的空間空間所有權限。為了保證內核的用戶安全,現在的內核操作系統一般都強制用戶進程不能直接操作內核。

具體的空間空間實現方式基本都是由操作系統將虛擬地址空間劃分為兩部分,一部分為內核空間,用戶另一部分為用戶空間。針對 Linux 操作系統而言,最高的 1G 字節(從虛擬地址 0xC0000000 到 0xFFFFFFFF)由內核使用,稱為內核空間。而較低的 3G 字節(從虛擬地址 0x00000000 到 0xBFFFFFFF)由各個進程使用,稱為用戶空間。

對上面這段內容我們可以這樣理解:「每個進程的 4G 地址空間中,最高 1G 都是一樣的,即內核空間。只有剩余的 3G 才歸進程自己使用。」

「換句話說就是, 最高 1G 的內核空間是被所有進程共享的!」下圖描述了每個進程 4G 地址空間的分配情況(此圖來自互聯網):

為什么需要區分內核空間與用戶空間

在 CPU 的所有指令中,有些指令是非常危險的,如果錯用,將導致系統崩潰,比如清內存、設置時鐘等。如果允許所有的程序都可以使用這些指令,那么系統崩潰的概率將大大增加。

所以,CPU 將指令分為特權指令和非特權指令,對于那些危險的指令,只允許操作系統及其相關模塊使用,普通應用程序只能使用那些不會造成災難的指令。

比如 Intel 的 CPU 將特權等級分為 4 個級別:Ring0~Ring3。其實 Linux 系統只使用了 Ring0 和 Ring3 兩個運行級別(Windows 系統也是一樣的)。

當進程運行在 Ring3 級別時被稱為運行在用戶態,而運行在 Ring0 級別時被稱為運行在內核態。

內核態與用戶態

好了我們現在需要再解釋一下什么是內核態、用戶態:「當進程運行在內核空間時就處于內核態,而進程運行在用戶空間時則處于用戶態。」

在內核態下,進程運行在內核地址空間中,此時 CPU 可以執行任何指令。運行的代碼也不受任何的限制,可以自由地訪問任何有效地址,也可以直接進行端口的訪問。

在用戶態下,進程運行在用戶地址空間中,被執行的代碼要受到 CPU 的諸多檢查,它們只能訪問映射其地址空間的頁表項中規定的在用戶態下可訪問頁面的虛擬地址,且只能對任務狀態段(TSS)中 I/O 許可位圖(I/O Permission Bitmap)中規定的可訪問端口進行直接訪問。

對于以前的 DOS 操作系統來說,是沒有內核空間、用戶空間以及內核態、用戶態這些概念的。可以認為所有的代碼都是運行在內核態的,因而用戶編寫的應用程序代碼可以很容易的讓操作系統崩潰掉。

對于 Linux 來說,通過區分內核空間和用戶空間的設計,隔離了操作系統代碼(操作系統的代碼要比應用程序的代碼健壯很多)與應用程序代碼。

即便是單個應用程序出現錯誤也不會影響到操作系統的穩定性,這樣其它的程序還可以正常的運行(Linux 可是個多任務系統啊!)。

「所以,區分內核空間和用戶空間本質上是要提高操作系統的穩定性及可用性。」

如何從用戶空間進入內核空間

其實所有的系統資源管理都是在內核空間中完成的。比如讀寫磁盤文件,分配回收內存,從網絡接口讀寫數據等等。

我們的應用程序是無法直接進行這樣的操作的。但是我們可以通過內核提供的接口來完成這樣的任務。

比如應用程序要讀取磁盤上的一個文件,它可以向內核發起一個 "系統調用" 告訴內核:"我要讀取磁盤上的某某文件"。

其實就是通過一個特殊的指令讓進程從用戶態進入到內核態(到了內核空間),在內核空間中,CPU 可以執行任何的指令,當然也包括從磁盤上讀取數據。具體過程是先把數據讀取到內核空間中,然后再把數據拷貝到用戶空間并從內核態切換到用戶態。

此時應用程序已經從系統調用中返回并且拿到了想要的數據,可以開開心心的往下執行了。簡單說就是應用程序把高科技的事情(從磁盤讀取文件)外包給了系統內核,系統內核做這些事情既專業又高效。

對于一個進程來講,從用戶空間進入內核空間并最終返回到用戶空間,這個過程是十分復雜的。舉個例子,比如我們經常接觸的概念 "堆棧",其實進程在內核態和用戶態各有一個堆棧。

運行在用戶空間時進程使用的是用戶空間中的堆棧,而運行在內核空間時,進程使用的是內核空間中的堆棧。所以說,Linux 中每個進程有兩個棧,分別用于用戶態和內核態。

下圖簡明的描述了用戶態與內核態之間的轉換:

既然用戶態的進程必須切換成內核態才能使用系統的資源,那么我們接下來就看看進程一共有多少種方式可以從用戶態進入到內核態。

概括的說,有三種方式:系統調用、軟中斷和硬件中斷。這三種方式每一種都涉及到大量的操作系統知識,所以這里不做展開。

整體結構

接下來我們從內核空間和用戶空間的角度看一看整個 Linux 系統的結構。它大體可以分為三個部分,從下往上依次為:硬件 ->內核空間 ->用戶空間。如下圖所示(此圖來自互聯網):

在硬件之上,內核空間中的代碼控制了硬件資源的使用權,用戶空間中的代碼只有通過內核暴露的系統調用接口(System Call Interface)才能使用到系統中的硬件資源。其實,不光是 Linux,Windows 操作系統的設計也是大同小異。

實際上我們可以將每個處理器在任何指定時間點上的活動概括為下列三者之一:

  • 運行于用戶空間,執行用戶進程。
  • 運行于內核空間,處于進程上下文,代表某個特定的進程執行。
  • 運行于內核空間,處于中斷上下文,與任何進程無關,處理某個特定的中斷。

以上三點幾乎包括所有的情況,比如當 CPU 空閑時,內核就運行一個空進程,處于進程上下文,但運行在內核空間。

說明:Linux 系統的中斷服務程序不在進程的上下文中執行,它們在一個與所有進程都無關的、專門的中斷上下文中執行。

之所以存在一個專門的執行環境,就是為了保證中斷服務程序能夠在第一時間響應和處理中斷請求,然后快速地退出。

總結

現代的操作系統大都通過內核空間和用戶空間的設計來保護操作系統自身的安全性和穩定性。所以在我們閱讀有關操作系統的資料時經常遇到內核空間、用戶空間和內核態、用戶態等概念,希望本文能夠幫助您理解這些基本的概念。

參考:

1、https://www.cnblogs.com/Anker/p/3269106.html

2、https://blog.csdn.net/linux12121/article/details/52628941

免責聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯系我進行刪除。

猜你喜歡

wireshark抓包工具的使用及分析

熱門問題:C++在嵌入式中表現如何?

記一個OLED編程中文顯示函數的坑(留意變量數據類型的范圍)


加好友,回暗號【嵌入式大雜燴】,進微信群

免責聲明:本文內容由21ic獲得授權后發布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!

Popular articles

主站蜘蛛池模板: 日本午夜精品一区二区三区电影 | 四虎1515hh丶com| 免费高清a级毛片在线播放 | 中文字幕制服诱惑| 亚洲国产日韩在线人成蜜芽| 国产日韩一区二区三区在线观看| 2021国产麻豆剧果冻传媒入口| 日本三人交xxx69| 人人爽人人澡人人高潮| 久久婷婷国产综合精品| 2018av男人天堂| 国产日韩精品欧美一区喷水| 精品国偷自产在线| 暖暖直播在线观看| 黑人干白人| 国产69精品久久久久777| 波多野结衣mxgs-983| 亚洲国产成人久久综合一区| 巨大黑人极品hdvideo| 欧美激情一区二区| 电车上强制波多野结衣| 精品伊人久久大线蕉地址| 久久狠狠躁免费观看2020| 最近高清中文在线国语字幕| 亚洲欧洲日韩在线电影| 好爽~好大~不要| 亚洲日韩中文字幕天堂不卡| 超级香蕉97在线观看视频| 四虎国产精品免费久久影院| 深夜a级毛片| 亚洲黄色在线看| 成人口工漫画网站免费| 131美女爽爽爽爱做视频| 久操视频免费观看| 校园春色欧美| 午夜影皖| 亚洲香蕉免费有线视频| 岛国免费v片在线播放| 青草国产在线| 色成快人播电影网| 免费中日高清无专码有限公司|