我們先來(lái)看一張 Linux 整體架構(gòu)圖。
系統(tǒng)調(diào)用
系統(tǒng)調(diào)用時(shí)操作系統(tǒng)的最小功能單位。根據(jù)不同的應(yīng)用場(chǎng)景,不同的 Linux 發(fā)行版本提供的系統(tǒng)調(diào)用數(shù)量也不盡相同,大致在240-350之間。這些系統(tǒng)調(diào)用組成了用戶態(tài)跟內(nèi)核態(tài)交互的基本接口,例如:用戶態(tài)想要申請(qǐng)一塊20K大小的動(dòng)態(tài)內(nèi)存,就需要brk系統(tǒng)調(diào)用,將數(shù)據(jù)段指針向下偏移,如果用戶態(tài)多處申請(qǐng)20K動(dòng)態(tài)內(nèi)存,同時(shí)又釋放呢?這個(gè)內(nèi)存的管理就變得非常的復(fù)雜。
庫(kù)函數(shù)
庫(kù)函數(shù)就是屏蔽這些復(fù)雜的底層實(shí)現(xiàn)細(xì)節(jié),減輕程序員的負(fù)擔(dān),從而更加關(guān)注上層的邏輯實(shí)現(xiàn)。它對(duì)系統(tǒng)調(diào)用進(jìn)行封裝,提供簡(jiǎn)單的基本接口給用戶,這樣增強(qiáng)了程序的靈活性,當(dāng)然對(duì)于簡(jiǎn)單的接口,也可以直接使用系統(tǒng)調(diào)用訪問(wèn)資源,例如: open() , write() , read() 等等。庫(kù)函數(shù)根據(jù)不同的標(biāo)準(zhǔn)也有不同的版本,例如: glibc 庫(kù), posix 庫(kù)等。
Shell
Shell 顧名思義,就是外殼的意思。就好像把內(nèi)核包裹起來(lái)的外殼。它是一種特殊的應(yīng)用程序,俗稱命令行。為了方便用戶和系統(tǒng)交互,一般一個(gè) Shell 對(duì)應(yīng)一個(gè)終端,呈現(xiàn)給用戶交互窗口。當(dāng)然 Shell 也是編程的,它有標(biāo)準(zhǔn)的 shell 語(yǔ)法,符合其語(yǔ)法的文本叫 Shell 腳本。很多人都會(huì)用 Shell 腳本實(shí)現(xiàn)一些常用的功能,可以提高工作效率。
為什么要區(qū)分用戶態(tài)與內(nèi)核態(tài)?
在 CPU 的所有指令中,有一些指令是非常危險(xiǎn)的,如果錯(cuò)用,將導(dǎo)致整個(gè)系統(tǒng)崩潰。比如:清內(nèi)存、設(shè)置時(shí)鐘等。如果所有的程序都能使用這些指令,那么你的系統(tǒng)一天死機(jī)N回就不足為奇了。所以, CPU 將指令分為特權(quán)指令和非特權(quán)指令,對(duì)于那些危險(xiǎn)的指令,只允許操作系統(tǒng)及其相關(guān)模塊使用,普通的應(yīng)用程序只能使用那些不會(huì)造成災(zāi)難的指令。 Intel 的 CPU 將特權(quán)級(jí)別分為4個(gè)級(jí)別: RING0 、 RING1 、 RING2 、 RING3 。
當(dāng)一個(gè)任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時(shí),我們就稱進(jìn)程處于內(nèi)核運(yùn)行態(tài)(或簡(jiǎn)稱為內(nèi)核態(tài))。此時(shí)處理器處于特權(quán)級(jí)最高的(0級(jí))內(nèi)核代碼中執(zhí)行。
當(dāng)進(jìn)程處于內(nèi)核態(tài)時(shí),執(zhí)行的內(nèi)核代碼會(huì)使用當(dāng)前進(jìn)程的內(nèi)核棧。每個(gè)進(jìn)程都有自己的內(nèi)核棧。
當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼時(shí),則稱其處于用戶運(yùn)行態(tài)(用戶態(tài))。即此時(shí)處理器在特權(quán)級(jí)最低的(3級(jí))用戶代碼中運(yùn)行。
當(dāng)正在執(zhí)行用戶程序而突然被中斷程序中斷時(shí),此時(shí)用戶程序也可以象征性地稱為處于進(jìn)程的內(nèi)核態(tài)。 Linux 使用了 Ring3 級(jí)別運(yùn)行用戶態(tài), Ring0 作為 內(nèi)核態(tài),沒(méi)有使用 Ring1 和 Ring2 。 Ring3 狀態(tài)不能訪問(wèn) Ring0 的地址空間,包括代碼和數(shù)據(jù)。 Linux 進(jìn)程的 4GB 地址空間,3G-4G部分大家是共享的,是內(nèi)核態(tài)的地址空間,這里存放在整個(gè)內(nèi)核的代碼和所有的內(nèi)核模塊,以及內(nèi)核所維護(hù)的數(shù)據(jù)。用戶運(yùn)行一個(gè)程序,該程序所創(chuàng)建的進(jìn)程開(kāi)始是運(yùn) 行在用戶態(tài)的,如果要執(zhí)行文件操作,網(wǎng)絡(luò)數(shù)據(jù)發(fā)送等操作,必須通過(guò) write , send 等系統(tǒng)調(diào)用,這些系統(tǒng)調(diào)用會(huì)調(diào)用內(nèi)核中的代碼來(lái)完成操作,這時(shí),必 須切換到 Ring0 ,然后進(jìn)入 3GB-4GB 中的內(nèi)核地址空間去執(zhí)行這些代碼完成操作,完成后,切換回 Ring3 ,回到用戶態(tài)。
這樣,用戶態(tài)的程序就不能 隨意操作內(nèi)核地址空間,具有一定的安全保護(hù)作用。
處理器總處于以下?tīng)顟B(tài)中的一種:
1、內(nèi)核態(tài),運(yùn)行于進(jìn)程上下文,內(nèi)核代表進(jìn)程運(yùn)行于內(nèi)核空間;
2、內(nèi)核態(tài),運(yùn)行于中斷上下文,內(nèi)核代表硬件運(yùn)行于內(nèi)核空間;
3、用戶態(tài),運(yùn)行于用戶空間。
用戶態(tài)到內(nèi)核態(tài)怎樣切換?
從用戶態(tài)到內(nèi)核態(tài)切換可以通過(guò)三種方式:
系統(tǒng)調(diào)用:這是用戶態(tài)進(jìn)程主動(dòng)要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進(jìn)程通過(guò)系統(tǒng)調(diào)用申請(qǐng)使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如前例中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機(jī)制其核心還是使用了操作系統(tǒng)為用戶特別開(kāi)放的一個(gè)中斷來(lái)實(shí)現(xiàn),例如Linux的int 80h中斷。
異常:當(dāng)CPU在執(zhí)行運(yùn)行在用戶態(tài)下的程序時(shí),發(fā)生了某些事先不可知的異常,這時(shí)會(huì)觸發(fā)由當(dāng)前運(yùn)行進(jìn)程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁(yè)異常。
外設(shè)中斷:當(dāng)外圍設(shè)備完成用戶請(qǐng)求的操作后,會(huì)向CPU發(fā)出相應(yīng)的中斷信號(hào),這時(shí)CPU會(huì)暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號(hào)對(duì)應(yīng)的處理程序,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個(gè)轉(zhuǎn)換的過(guò)程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤(pán)讀寫(xiě)操作完成,系統(tǒng)會(huì)切換到硬盤(pán)讀寫(xiě)的中斷處理程序中執(zhí)行后續(xù)操作等。
這3種方式是系統(tǒng)在運(yùn)行時(shí)由用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的最主要方式,其中系統(tǒng)調(diào)用可以認(rèn)為是用戶進(jìn)程主動(dòng)發(fā)起的,異常和外圍設(shè)備中斷則是被動(dòng)的。
-
Linux
+關(guān)注
關(guān)注
87文章
11469瀏覽量
212899 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3111瀏覽量
75025
發(fā)布評(píng)論請(qǐng)先 登錄
鴻蒙5開(kāi)發(fā)寶藏案例分享---折疊屏懸停態(tài)開(kāi)發(fā)實(shí)踐
關(guān)于晶振的三態(tài)
衍射級(jí)次偏振態(tài)的研究
衍射級(jí)次偏振態(tài)的研究
衍射級(jí)次偏振態(tài)的研究
SN74AVC2T244的使能引腳OE到底是OE=低電平時(shí)輸出三態(tài),還是OE=高電平時(shí)輸出三態(tài)?
DAC3162EVM的輸入阻抗不是高阻態(tài),怎么連接比較器和DAC呀?
國(guó)產(chǎn)實(shí)時(shí)操作系統(tǒng):和RT-Linux,Zephyr的實(shí)時(shí)性對(duì)比

為什么gv7601在spi用戶態(tài)訪問(wèn)寄存器時(shí),讀取音頻寄存器讀不到信息,是要設(shè)置什么嗎?
Linux內(nèi)核測(cè)試技術(shù)

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

評(píng)論