0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux的用戶態(tài)與內(nèi)核態(tài)區(qū)分

汽車玩家 ? 來源:未知 ? 作者:李威 ? 2020-04-12 19:39 ? 次閱讀

我們先來看一張 Linux 整體架構(gòu)圖。

Linux的用戶態(tài)與內(nèi)核態(tài)區(qū)分

系統(tǒng)調(diào)用

系統(tǒng)調(diào)用時操作系統(tǒng)的最小功能單位。根據(jù)不同的應(yīng)用場景,不同的 Linux 發(fā)行版本提供的系統(tǒng)調(diào)用數(shù)量也不盡相同,大致在240-350之間。這些系統(tǒng)調(diào)用組成了用戶態(tài)跟內(nèi)核態(tài)交互的基本接口,例如:用戶態(tài)想要申請一塊20K大小的動態(tài)內(nèi)存,就需要brk系統(tǒng)調(diào)用,將數(shù)據(jù)段指針向下偏移,如果用戶態(tài)多處申請20K動態(tài)內(nèi)存,同時又釋放呢?這個內(nèi)存的管理就變得非常的復(fù)雜。

庫函數(shù)

庫函數(shù)就是屏蔽這些復(fù)雜的底層實現(xiàn)細節(jié),減輕程序員的負擔,從而更加關(guān)注上層的邏輯實現(xiàn)。它對系統(tǒng)調(diào)用進行封裝,提供簡單的基本接口給用戶,這樣增強了程序的靈活性,當然對于簡單的接口,也可以直接使用系統(tǒng)調(diào)用訪問資源,例如: open() , write() , read() 等等。庫函數(shù)根據(jù)不同的標準也有不同的版本,例如: glibc 庫, posix 庫等。

Shell

Shell 顧名思義,就是外殼的意思。就好像把內(nèi)核包裹起來的外殼。它是一種特殊的應(yīng)用程序,俗稱命令行。為了方便用戶和系統(tǒng)交互,一般一個 Shell 對應(yīng)一個終端,呈現(xiàn)給用戶交互窗口。當然 Shell 也是編程的,它有標準的 shell 語法,符合其語法的文本叫 Shell 腳本。很多人都會用 Shell 腳本實現(xiàn)一些常用的功能,可以提高工作效率。

為什么要區(qū)分用戶態(tài)與內(nèi)核態(tài)?

CPU 的所有指令中,有一些指令是非常危險的,如果錯用,將導(dǎo)致整個系統(tǒng)崩潰。比如:清內(nèi)存、設(shè)置時鐘等。如果所有的程序都能使用這些指令,那么你的系統(tǒng)一天死機N回就不足為奇了。所以, CPU 將指令分為特權(quán)指令和非特權(quán)指令,對于那些危險的指令,只允許操作系統(tǒng)及其相關(guān)模塊使用,普通的應(yīng)用程序只能使用那些不會造成災(zāi)難的指令。 Intel 的 CPU 將特權(quán)級別分為4個級別: RING0 、 RING1 、 RING2 、 RING3 。

當一個任務(wù)(進程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時,我們就稱進程處于內(nèi)核運行態(tài)(或簡稱為內(nèi)核態(tài))。此時處理器處于特權(quán)級最高的(0級)內(nèi)核代碼中執(zhí)行。

當進程處于內(nèi)核態(tài)時,執(zhí)行的內(nèi)核代碼會使用當前進程的內(nèi)核棧。每個進程都有自己的內(nèi)核棧。

當進程在執(zhí)行用戶自己的代碼時,則稱其處于用戶運行態(tài)(用戶態(tài))。即此時處理器在特權(quán)級最低的(3級)用戶代碼中運行。

當正在執(zhí)行用戶程序而突然被中斷程序中斷時,此時用戶程序也可以象征性地稱為處于進程的內(nèi)核態(tài)。 Linux 使用了 Ring3 級別運行用戶態(tài), Ring0 作為 內(nèi)核態(tài),沒有使用 Ring1 和 Ring2 。 Ring3 狀態(tài)不能訪問 Ring0 的地址空間,包括代碼和數(shù)據(jù)。 Linux 進程的 4GB 地址空間,3G-4G部分大家是共享的,是內(nèi)核態(tài)的地址空間,這里存放在整個內(nèi)核的代碼和所有的內(nèi)核模塊,以及內(nèi)核所維護的數(shù)據(jù)。用戶運行一個程序,該程序所創(chuàng)建的進程開始是運 行在用戶態(tài)的,如果要執(zhí)行文件操作,網(wǎng)絡(luò)數(shù)據(jù)發(fā)送等操作,必須通過 write , send 等系統(tǒng)調(diào)用,這些系統(tǒng)調(diào)用會調(diào)用內(nèi)核中的代碼來完成操作,這時,必 須切換到 Ring0 ,然后進入 3GB-4GB 中的內(nèi)核地址空間去執(zhí)行這些代碼完成操作,完成后,切換回 Ring3 ,回到用戶態(tài)。

這樣,用戶態(tài)的程序就不能 隨意操作內(nèi)核地址空間,具有一定的安全保護作用。

處理器總處于以下狀態(tài)中的一種:

1、內(nèi)核態(tài),運行于進程上下文,內(nèi)核代表進程運行于內(nèi)核空間;

2、內(nèi)核態(tài),運行于中斷上下文,內(nèi)核代表硬件運行于內(nèi)核空間;

3、用戶態(tài),運行于用戶空間。

用戶態(tài)到內(nèi)核態(tài)怎樣切換?

從用戶態(tài)到內(nèi)核態(tài)切換可以通過三種方式:

系統(tǒng)調(diào)用:這是用戶態(tài)進程主動要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進程通過系統(tǒng)調(diào)用申請使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如前例中fork()實際上就是執(zhí)行了一個創(chuàng)建新進程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機制其核心還是使用了操作系統(tǒng)為用戶特別開放的一個中斷來實現(xiàn),例如Linux的int 80h中斷。

異常:當CPU在執(zhí)行運行在用戶態(tài)下的程序時,發(fā)生了某些事先不可知的異常,這時會觸發(fā)由當前運行進程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁異常。

外設(shè)中斷:當外圍設(shè)備完成用戶請求的操作后,會向CPU發(fā)出相應(yīng)的中斷信號,這時CPU會暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應(yīng)的處理程序,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個轉(zhuǎn)換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤讀寫操作完成,系統(tǒng)會切換到硬盤讀寫的中斷處理程序中執(zhí)行后續(xù)操作等。

這3種方式是系統(tǒng)在運行時由用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的最主要方式,其中系統(tǒng)調(diào)用可以認為是用戶進程主動發(fā)起的,異常和外圍設(shè)備中斷則是被動的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11213

    瀏覽量

    208735
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2980

    瀏覽量

    73824
收藏 人收藏

    評論

    相關(guān)推薦

    國產(chǎn)實時操作系統(tǒng):和RT-Linux,Zephyr的實時性對比

    基于RT-Thread內(nèi)核,并具備POSIX用戶態(tài)運行環(huán)境的高性能實時操作系統(tǒng)。它類似Linux、Windows的架構(gòu),具備用戶
    的頭像 發(fā)表于 11-12 01:07 ?100次閱讀
    國產(chǎn)實時操作系統(tǒng):和RT-<b class='flag-5'>Linux</b>,Zephyr的實時性對比

    為什么gv7601在spi用戶態(tài)訪問寄存器時,讀取音頻寄存器讀不到信息,是要設(shè)置什么嗎?

    為什么gv7601在spi用戶態(tài)訪問寄存器時。讀取視頻寄存器正常。讀取音頻寄存器讀不到信息。是要設(shè)置什么嗎?
    發(fā)表于 11-04 08:21

    態(tài)緩沖器的工作原理和應(yīng)用

    態(tài)緩沖器(Three-state buffer),又稱為三態(tài)門、三態(tài)驅(qū)動器,是一種特殊的邏輯門電路,其工作原理主要基于三態(tài)輸出控制。三態(tài)
    的頭像 發(fā)表于 08-02 17:47 ?2666次閱讀

    態(tài)邏輯電路的工作原理及其四種三態(tài)緩沖器介紹

    態(tài)邏輯作為一種數(shù)字電子技術(shù)中的邏輯類型,允許信號線在三種狀態(tài)之間切換。本文介紹了三態(tài)邏輯電路原理并介紹了四種基本類型的三態(tài)緩沖器。如果你對三態(tài)邏輯感興趣,相信這篇內(nèi)容會讓你對其有基礎(chǔ)
    的頭像 發(fā)表于 08-01 09:59 ?1490次閱讀
    三<b class='flag-5'>態(tài)</b>邏輯電路的工作原理及其四種三<b class='flag-5'>態(tài)</b>緩沖器介紹

    鎖存器原態(tài)和新態(tài)的定義

    鎖存器(Latch)是一種存儲單元,用于存儲一位二進制信息。在數(shù)字電路中,鎖存器是一種基本的存儲元件,廣泛應(yīng)用于寄存器、計數(shù)器、觸發(fā)器等電路中。鎖存器的原態(tài)和新態(tài)是描述鎖存器狀態(tài)變化的兩個重要概念
    的頭像 發(fā)表于 07-23 10:21 ?427次閱讀

    具有三態(tài)輸出的BiCMOS八態(tài)總線轉(zhuǎn)換器CD74FCT623數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《具有三態(tài)輸出的BiCMOS八態(tài)總線轉(zhuǎn)換器CD74FCT623數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-30 10:36 ?0次下載
    具有三<b class='flag-5'>態(tài)</b>輸出的BiCMOS八<b class='flag-5'>態(tài)</b>總線轉(zhuǎn)換器CD74FCT623數(shù)據(jù)表

    TTL三態(tài)輸出門能否實現(xiàn)“線與”?為什么?

    TTL三態(tài)輸出門是一種特殊的數(shù)字邏輯門,它具有高電平、低電平和高阻抗(三態(tài))三種輸出狀態(tài)。
    的頭像 發(fā)表于 05-28 16:14 ?3089次閱讀

    TTL三態(tài)門電路的輸出狀態(tài)?

    TTL(晶體管-晶體管邏輯)三態(tài)門是一種特殊類型的數(shù)字邏輯門,它具有三種輸出狀態(tài):高電平、低電平和高阻抗狀態(tài)(也稱為三態(tài)或高阻態(tài))。
    的頭像 發(fā)表于 05-28 16:04 ?1699次閱讀

    STM8單片機的IO口是否可實現(xiàn)三態(tài):輸出高電平、低電平、高阻態(tài)?

    大家好: 請教一下大家,STM8單片機的IO口是否可實現(xiàn)三態(tài):輸出高電平、低電平、高阻態(tài)。
    發(fā)表于 05-07 07:07

    AD5420的SDO是否是三態(tài)輸出腳?

    1、AD5420的SDO是否是三態(tài)輸出腳 2、MCU的SPI接口配置CPOL=0、CPAH=0,是否正確
    發(fā)表于 12-20 08:08

    ARM處理器7種工作模式

    轉(zhuǎn)為Linux內(nèi)核態(tài)) 在CPSR寄存器中設(shè)置M[4:0]位,分別對應(yīng)如下七種模式(注意:用戶模式和系統(tǒng)模式只有對CPSR的讀權(quán)限,因此、這兩種模式下不可以通過直接設(shè)置CPSR進入其他
    發(fā)表于 12-15 10:15

    電機的冷態(tài)、熱態(tài)是怎樣定義的?

    電機的冷態(tài)、熱態(tài)是怎樣定義的?兩者如何判斷?滿負載時是熱態(tài)否則就是冷態(tài)是這樣嗎?
    發(fā)表于 12-13 08:16

    三極管三態(tài)分析

    三極管三態(tài)分析
    的頭像 發(fā)表于 12-05 11:49 ?923次閱讀
    三極管三<b class='flag-5'>態(tài)</b>分析

    進程由執(zhí)行態(tài)變?yōu)樽枞?b class='flag-5'>態(tài)的主要原因

    進程在運行過程中,可能由于各種原因而從執(zhí)行態(tài)變?yōu)樽枞?b class='flag-5'>態(tài)。主要原因包括以下幾個方面。 首先,進程可能由于等待外部資源而進入阻塞態(tài)。例如,當進程需要從硬盤讀取數(shù)據(jù)時,由于硬盤的讀取速度相對較慢,進程需要
    的頭像 發(fā)表于 11-17 14:14 ?2777次閱讀

    阻塞態(tài)可以直接到運行態(tài)

    的過渡。當一個進程或線程處于阻塞態(tài)時,實際上是在等待某種事件或資源的狀態(tài)。只有在這些事件或資源可用并且滿足執(zhí)行條件時,進程或線程才能夠從阻塞態(tài)轉(zhuǎn)換到運行態(tài)。 通常,阻塞態(tài)到運行
    的頭像 發(fā)表于 11-17 11:43 ?2239次閱讀