最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux 內核空間與用戶空間實現(xiàn)與分析

 更新時間:2018年02月24日 14:32:31   作者:sparkdev  
這篇文章主要介紹了Linux 內核空間與用戶空間實現(xiàn)與分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

內核空間和用戶空間

對 32 位操作系統(tǒng)而言,它的尋址空間(虛擬地址空間,或叫線性地址空間)為 4G(2的32次方)。也就是說一個進程的最大地址空間為 4G。操作系統(tǒng)的核心是內核(kernel),它獨立于普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限。為了保證內核的安全,現(xiàn)在的操作系統(tǒng)一般都強制用戶進程不能直接操作內核。具體的實現(xiàn)方式基本都是由操作系統(tǒng)將虛擬地址空間劃分為兩部分,一部分為內核空間,另一部分為用戶空間。針對 Linux 操作系統(tǒng)而言,最高的 1G 字節(jié)(從虛擬地址 0xC0000000 到 0xFFFFFFFF)由內核使用,稱為內核空間。而較低的 3G 字節(jié)(從虛擬地址 0x00000000 到 0xBFFFFFFF)由各個進程使用,稱為用戶空間。

對上面這段內容我們可以這樣理解:

每個進程的 4G 地址空間中,最高 1G 都是一樣的,即內核空間。只有剩余的 3G 才歸進程自己使用。

換句話說就是, 最高 1G 的內核空間是被所有進程共享的!

下圖描述了每個進程 4G 地址空間的分配情況(此圖來自互聯(lián)網(wǎng)):

為什么需要區(qū)分內核空間與用戶空間

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

所以,CPU 將指令分為特權指令和非特權指令,對于那些危險的指令,只允許操作系統(tǒng)及其相關模塊使用,普通應用程序只能使用那些不會造成災難的指令。比如 Intel 的 CPU 將特權等級分為 4 個級別:Ring0~Ring3。

其實 Linux 系統(tǒng)只使用了 Ring0 和 Ring3 兩個運行級別(Windows 系統(tǒng)也是一樣的)。當進程運行在 Ring3 級別時被稱為運行在用戶態(tài),而運行在 Ring0 級別時被稱為運行在內核態(tài)。

內核態(tài)與用戶態(tài)

好了我們現(xiàn)在需要再解釋一下什么是內核態(tài)、用戶態(tài):

當進程運行在內核空間時就處于內核態(tài),而進程運行在用戶空間時則處于用戶態(tài)。

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

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

對于以前的 DOS 操作系統(tǒng)來說,是沒有內核空間、用戶空間以及內核態(tài)、用戶態(tài)這些概念的。可以認為所有的代碼都是運行在內核態(tài)的,因而用戶編寫的應用程序代碼可以很容易的讓操作系統(tǒng)崩潰掉。
對于 Linux 來說,通過區(qū)分內核空間和用戶空間的設計,隔離了操作系統(tǒng)代碼(操作系統(tǒng)的代碼要比應用程序的代碼健壯很多)與應用程序代碼。即便是單個應用程序出現(xiàn)錯誤也不會影響到操作系統(tǒng)的穩(wěn)定性,這樣其它的程序還可以正常的運行(Linux 可是個多任務系統(tǒng)啊!)。

所以,區(qū)分內核空間和用戶空間本質上是要提高操作系統(tǒng)的穩(wěn)定性及可用性。

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

其實所有的系統(tǒng)資源管理都是在內核空間中完成的。比如讀寫磁盤文件,分配回收內存,從網(wǎng)絡接口讀寫數(shù)據(jù)等等。我們的應用程序是無法直接進行這樣的操作的。但是我們可以通過內核提供的接口來完成這樣的任務。

比如應用程序要讀取磁盤上的一個文件,它可以向內核發(fā)起一個 "系統(tǒng)調用" 告訴內核:"我要讀取磁盤上的某某文件"。其實就是通過一個特殊的指令讓進程從用戶態(tài)進入到內核態(tài)(到了內核空間),在內核空間中,CPU 可以執(zhí)行任何的指令,當然也包括從磁盤上讀取數(shù)據(jù)。具體過程是先把數(shù)據(jù)讀取到內核空間中,然后再把數(shù)據(jù)拷貝到用戶空間并從內核態(tài)切換到用戶態(tài)。此時應用程序已經(jīng)從系統(tǒng)調用中返回并且拿到了想要的數(shù)據(jù),可以開開心心的往下執(zhí)行了。

簡單說就是應用程序把高科技的事情(從磁盤讀取文件)外包給了系統(tǒng)內核,系統(tǒng)內核做這些事情既專業(yè)又高效。

對于一個進程來講,從用戶空間進入內核空間并最終返回到用戶空間,這個過程是十分復雜的。舉個例子,比如我們經(jīng)常接觸的概念 "堆棧",其實進程在內核態(tài)和用戶態(tài)各有一個堆棧。運行在用戶空間時進程使用的是用戶空間中的堆棧,而運行在內核空間時,進程使用的是內核空間中的堆棧。所以說,Linux 中每個進程有兩個棧,分別用于用戶態(tài)和內核態(tài)。

下圖簡明的描述了用戶態(tài)與內核態(tài)之間的轉換:

既然用戶態(tài)的進程必須切換成內核態(tài)才能使用系統(tǒng)的資源,那么我們接下來就看看進程一共有多少種方式可以從用戶態(tài)進入到內核態(tài)。概括的說,有三種方式:系統(tǒng)調用、軟中斷和硬件中斷。這三種方式每一種都涉及到大量的操作系統(tǒng)知識,所以這里不做展開。

整體結構

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

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

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python 虛擬環(huán)境安裝與卸載方法及遇到問題

    python 虛擬環(huán)境安裝與卸載方法及遇到問題

    這篇文章主要介紹了python 虛擬環(huán)境安裝與卸載方法及遇到問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Linux VPS安全設置之一 修改SSH端口(CentOS/Debian)

    Linux VPS安全設置之一 修改SSH端口(CentOS/Debian)

    我們在學會了VPS的安裝和建站之后,肯定需要附帶學習VPS的安全設置。因為VPS和主機不同,主機商可能會給我們備份,而且主機的安全性都有主機商承擔
    2012-09-09
  • Linux用戶與最小權限原則解析

    Linux用戶與最小權限原則解析

    這篇文章主要為大家解析了Linux用戶與最小權限原則,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 淺談Linux下免密碼切換到root用戶當注意的問題

    淺談Linux下免密碼切換到root用戶當注意的問題

    下面小編就為大家?guī)硪黄獪\談Linux下免密碼切換到root用戶當注意的問題。小編覺得挺不錯的?,F(xiàn)在就分享給大家。也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Linux磁盤設備與LVM管理命令示例詳解

    Linux磁盤設備與LVM管理命令示例詳解

    這篇文章主要給大家介紹了關于Linux磁盤設備與LVM管理命令的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Linux系統(tǒng)具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Linux下二進制編譯安裝MySql centos7的教程

    Linux下二進制編譯安裝MySql centos7的教程

    這篇文章主要介紹了Linux下二進制編譯安裝MySql centos7的教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Linux之性能監(jiān)測命令解讀

    Linux之性能監(jiān)測命令解讀

    這篇文章主要介紹了Linux之性能監(jiān)測命令,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Linux下忘記mysql密碼該如何修改mysql密碼

    Linux下忘記mysql密碼該如何修改mysql密碼

    這篇文章主要介紹了Linux下忘記mysql密碼該如何修改mysql密碼的相關資料,需要的朋友可以參考下
    2016-02-02
  • 在Linux服務器上部署War項目教程

    在Linux服務器上部署War項目教程

    文章講述了如何將War包上傳到Linux服務器上的步驟,包括使用FTP或SFTP上傳,確認并安裝Java運行環(huán)境和Web服務器(如ApacheTomcat或Nginx),將War包復制到相應的目錄,并重啟服務以確保部署成功,最后,通過瀏覽器訪問部署的應用
    2025-02-02
  • Linux進程管理工具supervisor安裝配置教程

    Linux進程管理工具supervisor安裝配置教程

    這篇文章主要介紹了Linux進程管理工具supervisor安裝配置教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05

最新評論

株洲市| 湄潭县| 囊谦县| 老河口市| 当雄县| 镶黄旗| 外汇| 阿克苏市| 芒康县| 长武县| 丁青县| 鞍山市| 葵青区| 青神县| 浦城县| 江城| 华阴市| 宁化县| 二连浩特市| 龙陵县| 永定县| 屏东市| 环江| 于都县| 麻栗坡县| 同德县| 巨鹿县| 郸城县| 永济市| 昆山市| 南平市| 大田县| 福鼎市| 南昌市| 黄石市| 金寨县| 榆林市| 尼勒克县| 密云县| 韩城市| 广河县|