從根上理解用戶態(tài)與內(nèi)核態(tài)

歡迎來到操作系統(tǒng)系列闯狱,采用圖解 + 大白話的形式來講解渊涝,讓小白也能看懂慎璧,幫助大家快速科普入門。

本篇文章開始探秘用戶態(tài)與內(nèi)核態(tài)跨释,雖然一般面試不會(huì)問這個(gè)胸私,但搞清楚這塊,對(duì)我們理解整個(gè)計(jì)算機(jī)系統(tǒng)是及其有意義的鳖谈,這會(huì)讓你在今后的學(xué)習(xí)中豁然開朗岁疼,你肯定會(huì)發(fā)出:“啊,原來如此的感嘆缆娃!”

內(nèi)容大綱

image

小故事

張三是某科技公司的初級(jí)Java開發(fā)工程師(低權(quán)限)捷绒,目前在15樓辦公碼代碼,公司提供的資源僅有一套電腦(用戶態(tài))贯要,張三想著這一線的房?jī)r(jià)暖侨,倍感壓力山大,于是給自己定下一個(gè)目標(biāo)崇渗,一定要做技術(shù)總監(jiān)字逗,在一線扎根,
奮斗B張三宅广,奮斗5年終于當(dāng)上了技術(shù)總監(jiān)(高權(quán)限)葫掉,之后張三搬到30樓,可以隨時(shí)向資源部(系統(tǒng)調(diào)用)申請(qǐng)公司各種資源與獲取公司的機(jī)密信息(內(nèi)核態(tài))乘碑,所謂是走上人生巔峰挖息。

通過這個(gè)故事,我們發(fā)現(xiàn)兽肤,低權(quán)限的資源范圍較小套腹,高權(quán)限的資源范圍更大绪抛,所謂的「用戶態(tài)與內(nèi)核態(tài)只是不同權(quán)限的資源范圍」。

C P U 指令集權(quán)限

在說用戶態(tài)與內(nèi)核態(tài)之前电禀,有必要說一下 C P U 指令集幢码,指令集是 C P U 實(shí)現(xiàn)軟件指揮硬件執(zhí)行的媒介,具體來說每一條匯編語句都對(duì)應(yīng)了一條 C P U 指令尖飞,而非常非常多的 C P U 指令 在一起症副,可以組成一個(gè)、甚至多個(gè)集合政基,指令的集合叫 C P U 指令集贞铣。

同時(shí) C P U 指令集 有權(quán)限分級(jí),大家試想沮明,C P U 指令集 可以直接操作硬件的辕坝,要是因?yàn)橹噶畈僮鞯牟灰?guī)范`,造成的錯(cuò)誤會(huì)影響整個(gè)計(jì)算機(jī)系統(tǒng)的荐健。好比你寫程序酱畅,因?yàn)閷?duì)硬件操作不熟悉,導(dǎo)致操作系統(tǒng)內(nèi)核江场、及其他所有正在運(yùn)行的程序纺酸,都可能會(huì)因?yàn)椴僮魇д`而受到不可挽回的錯(cuò)誤,最后只能重啟計(jì)算機(jī)才行址否。

而對(duì)于硬件的操作是非常復(fù)雜的餐蔬,參數(shù)眾多,出問題的幾率相當(dāng)大在张,必須謹(jǐn)慎的進(jìn)行操作用含,對(duì)開發(fā)人員來說是個(gè)艱巨的任務(wù),還會(huì)增加負(fù)擔(dān)帮匾,同時(shí)開發(fā)人員在這方面也不被信任啄骇,所以操作系統(tǒng)內(nèi)核直接屏蔽開發(fā)人員對(duì)硬件操作的可能,都不讓你碰到這些 C P U 指令集瘟斜。

image

針對(duì)上面的需求缸夹,硬件設(shè)備商直接提供硬件級(jí)別的支持,做法就是對(duì) C P U 指令集設(shè)置了權(quán)限螺句,不同級(jí)別權(quán)限能使用的 C P U 指令集 是有限的虽惭,以 Inter C P U 為例,Inter把 C P U 指令集 操作的權(quán)限由高到低劃為4級(jí):

  • ring 0
  • ring 1
  • ring 2
  • ring 3

其中 ring 0 權(quán)限最高蛇尚,可以使用所有 C P U 指令集芽唇,ring 3 權(quán)限最低,僅能使用常規(guī) C P U 指令集,不能使用操作硬件資源的 C P U 指令集匆笤,比如 I O 讀寫研侣、網(wǎng)卡訪問、申請(qǐng)內(nèi)存都不行炮捧,Linux系統(tǒng)僅采用ring 0 和 ring 3 這2個(gè)權(quán)限庶诡。

image

高情商

  • ring 0被叫做內(nèi)核態(tài),完全在操作系統(tǒng)內(nèi)核中運(yùn)行
  • ring 3被叫做用戶態(tài)咆课,在應(yīng)用程序中運(yùn)行

低情商

  • 執(zhí)行內(nèi)核空間的代碼末誓,具有ring 0保護(hù)級(jí)別,有對(duì)硬件的所有操作權(quán)限书蚪,可以執(zhí)行所有C P U 指令集喇澡,訪問任意地址的內(nèi)存,在內(nèi)核模式下的任何異常都是災(zāi)難性的殊校,將會(huì)導(dǎo)致整臺(tái)機(jī)器停機(jī)

  • 在用戶模式下撩幽,具有ring 3保護(hù)級(jí)別,代碼沒有對(duì)硬件的直接控制權(quán)限箩艺,也不能直接訪問地址的內(nèi)存,程序是通過調(diào)用系統(tǒng)接口(System Call APIs)來達(dá)到訪問硬件和內(nèi)存宪萄,在這種保護(hù)模式下艺谆,即時(shí)程序發(fā)生崩潰也是可以恢復(fù)的,在電腦上大部分程序都是在拜英,用戶模式下運(yùn)行的

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

通關(guān)了C P U 指令集權(quán)限静汤,現(xiàn)在再說用戶態(tài)與內(nèi)核態(tài)就十分簡(jiǎn)單了,用戶態(tài)與內(nèi)核態(tài)的概念就是C P U 指令集權(quán)限的區(qū)別居凶,進(jìn)程中要讀寫 I O虫给,必然會(huì)用到 ring 0 級(jí)別的 C P U 指令集,而此時(shí) C P U 的指令集操作權(quán)限只有 ring 3侠碧,為了可以操作ring 0 級(jí)別的 C P U 指令集抹估, C P U 切換指令集操作權(quán)限級(jí)別為 ring 0,C P U再執(zhí)行相應(yīng)的ring 0 級(jí)別的 C P U 指令集(內(nèi)核代碼)弄兜,執(zhí)行的內(nèi)核代碼會(huì)使用當(dāng)前進(jìn)程的內(nèi)核棧药蜻。

PS:每個(gè)進(jìn)程都有兩個(gè)棧,分別是用戶棧與內(nèi)核棧替饿,對(duì)應(yīng)用戶態(tài)與內(nèi)核態(tài)的使用

用戶態(tài)與內(nèi)核態(tài)的空間

在內(nèi)存資源上的使用语泽,操作系統(tǒng)對(duì)用戶態(tài)與內(nèi)核態(tài)也做了限制,每個(gè)進(jìn)程創(chuàng)建都會(huì)分配「虛擬空間地址」(不懂可以參考我的另一篇文章“15分鐘视卢!一文幫小白搞懂操作系統(tǒng)之內(nèi)存”)踱卵,以Linux32位操作系統(tǒng)為例,它的尋址空間范圍是 4G(2的32次方)据过,而操作系統(tǒng)會(huì)把虛擬控制地址劃分為兩部分惋砂,一部分為內(nèi)核空間妒挎,另一部分為用戶空間,高位的 1G(從虛擬地址 0xC0000000 到 0xFFFFFFFF)由內(nèi)核使用班利,而低位的 3G(從虛擬地址 0x00000000 到 0xBFFFFFFF)由各個(gè)進(jìn)程使用饥漫。

image
  • 用戶態(tài):只能操作 0-3G 范圍的低位虛擬空間地址
  • 內(nèi)核態(tài):0-4G 范圍的虛擬空間地址都可以操作,尤其是對(duì) 3-4G 范圍的高位虛擬空間地址必須由內(nèi)核態(tài)去操作
  • 補(bǔ)充:3G-4G 部分大家是共享的(指所有進(jìn)程的內(nèi)核態(tài)邏輯地址是共享同一塊內(nèi)存地址)罗标,是內(nèi)核態(tài)的地址空間庸队,這里存放在整個(gè)內(nèi)核的代碼和所有的內(nèi)核模塊,以及內(nèi)核所維護(hù)的數(shù)據(jù)

每個(gè)進(jìn)程的 4G 虛擬空間地址闯割,高位 1G 都是一樣的彻消,即內(nèi)核空間。只有剩余的 3G 才歸進(jìn)程自己使用宙拉,換句話說就是宾尚, 高位 1G 的內(nèi)核空間是被所有進(jìn)程共享的!

最后做個(gè)小結(jié)谢澈,我們通過指令集權(quán)限區(qū)分用戶態(tài)和內(nèi)核態(tài)煌贴,還限制了內(nèi)存資源的使用,操作系統(tǒng)為用戶態(tài)與內(nèi)核態(tài)劃分了兩塊內(nèi)存空間锥忿,給它們對(duì)應(yīng)的指令集使用

用戶態(tài)與內(nèi)核態(tài)的切換

相信大家都聽過這樣的話「用戶態(tài)和內(nèi)核態(tài)切換的開銷大」牛郑,但是它的開銷大在那里呢?簡(jiǎn)單點(diǎn)來說有下面幾點(diǎn)

  • 保留用戶態(tài)現(xiàn)場(chǎng)(上下文敬鬓、寄存器淹朋、用戶棧等)
  • 復(fù)制用戶態(tài)參數(shù),用戶棧切到內(nèi)核棧钉答,進(jìn)入內(nèi)核態(tài)
  • 額外的檢查(因?yàn)閮?nèi)核代碼對(duì)用戶不信任)
  • 執(zhí)行內(nèi)核態(tài)代碼
  • 復(fù)制內(nèi)核態(tài)代碼執(zhí)行結(jié)果础芍,回到用戶態(tài)
  • 恢復(fù)用戶態(tài)現(xiàn)場(chǎng)(上下文、寄存器数尿、用戶棧等)

實(shí)際上操作系統(tǒng)會(huì)比上述的更復(fù)雜仑性,這里只是個(gè)大概,我們可以發(fā)現(xiàn)一次切換經(jīng)歷了「用戶態(tài) -> 內(nèi)核態(tài) -> 用戶態(tài)」右蹦。

用戶態(tài)要主動(dòng)切換到內(nèi)核態(tài)虏缸,那必須要有入口才行,實(shí)際上內(nèi)核態(tài)是提供了統(tǒng)一的入口嫩实,下面是Linux整體架構(gòu)圖

image

從上圖我們可以看出來通過系統(tǒng)調(diào)用將Linux整個(gè)體系分為用戶態(tài)和內(nèi)核態(tài)刽辙,為了使應(yīng)用程序訪問到內(nèi)核的資源,如CPU甲献、內(nèi)存宰缤、I/O,內(nèi)核必須提供一組通用的訪問接口,這些接口就叫系統(tǒng)調(diào)用慨灭。

庫函數(shù)就是屏蔽這些復(fù)雜的底層實(shí)現(xiàn)細(xì)節(jié)朦乏,減輕程序員的負(fù)擔(dān),從而更加關(guān)注上層的邏輯實(shí)現(xiàn)氧骤,它對(duì)系統(tǒng)調(diào)用進(jìn)行封裝呻疹,提供簡(jiǎn)單的基本接口給程序員。

Shell顧名思義筹陵,就是外殼的意思刽锤,就好像把內(nèi)核包裹起來的外殼,它是一種特殊的應(yīng)用程序朦佩,俗稱命令行并思。Shell也是可編程的,它有標(biāo)準(zhǔn)的Shell 語法语稠,符合其語法的文本叫Shell腳本宋彼,很多人都會(huì)用Shell腳本實(shí)現(xiàn)一些常用的功能,可以提高工作效率仙畦。

最后來說說输涕,什么情況會(huì)導(dǎo)致用戶態(tài)到內(nèi)核態(tài)切換

  • 系統(tǒng)調(diào)用:用戶態(tài)進(jìn)程主動(dòng)切換到內(nèi)核態(tài)的方式,用戶態(tài)進(jìn)程通過系統(tǒng)調(diào)用向操作系統(tǒng)申請(qǐng)資源完成工作慨畸,例如 fork()就是一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用占贫,系統(tǒng)調(diào)用的機(jī)制核心使用了操作系統(tǒng)為用戶特別開放的一個(gè)中斷來實(shí)現(xiàn),如Linux 的 int 80h 中斷先口,也可以稱為軟中斷

  • 異常:當(dāng) C P U 在執(zhí)行用戶態(tài)的進(jìn)程時(shí),發(fā)生了一些沒有預(yù)知的異常瞳收,這時(shí)當(dāng)前運(yùn)行進(jìn)程會(huì)切換到處理此異常的內(nèi)核相關(guān)進(jìn)程中碉京,也就是切換到了內(nèi)核態(tài),如缺頁異常

  • 中斷:當(dāng) C P U 在執(zhí)行用戶態(tài)的進(jìn)程時(shí)螟深,外圍設(shè)備完成用戶請(qǐng)求的操作后谐宙,會(huì)向 C P U 發(fā)出相應(yīng)的中斷信號(hào),這時(shí) C P U 會(huì)暫停執(zhí)行下一條即將要執(zhí)行的指令界弧,轉(zhuǎn)到與中斷信號(hào)對(duì)應(yīng)的處理程序去執(zhí)行凡蜻,也就是切換到了內(nèi)核態(tài)。如硬盤讀寫操作完成垢箕,系統(tǒng)會(huì)切換到硬盤讀寫的中斷處理程序中執(zhí)行后邊的操作等划栓。

關(guān)聯(lián)好文章推薦

關(guān)于我

Hi這里是阿星,一個(gè)熱愛技術(shù)的93年Java程序猿委煤,在公眾號(hào) 「程序猿阿星」 里將會(huì)定期分享操作系統(tǒng)堂油、計(jì)算機(jī)網(wǎng)絡(luò)、Java碧绞、分布式府框、數(shù)據(jù)庫等精品原創(chuàng)文章,2021讥邻,與您在 Be Better 的路上共同成長迫靖!。

非常感謝各位人才能 看到這里计维,創(chuàng)作不易袜香,文章有幫助可以「點(diǎn)個(gè)贊」或「分享與評(píng)論」,都是支持(莫要白嫖)鲫惶!

愿你我都能奔赴在各自想去的路上蜈首,我們下篇文章見!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欠母,一起剝皮案震驚了整個(gè)濱河市欢策,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赏淌,老刑警劉巖踩寇,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異六水,居然都是意外死亡俺孙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門掷贾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睛榄,“玉大人,你說我怎么就攤上這事想帅〕⊙ィ” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵港准,是天一觀的道長旨剥。 經(jīng)常有香客問我,道長浅缸,這世上最難降的妖魔是什么轨帜? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衩椒,結(jié)果婚禮上阵谚,老公的妹妹穿的比我還像新娘蚕礼。我一直安慰自己,他們只是感情好梢什,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布奠蹬。 她就那樣靜靜地躺著,像睡著了一般嗡午。 火紅的嫁衣襯著肌膚如雪囤躁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天荔睹,我揣著相機(jī)與錄音狸演,去河邊找鬼。 笑死僻他,一個(gè)胖子當(dāng)著我的面吹牛宵距,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吨拗,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼满哪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了劝篷?” 一聲冷哼從身側(cè)響起哨鸭,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娇妓,沒想到半個(gè)月后像鸡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哈恰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年只估,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片着绷。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛔钙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蓬戚,到底是詐尸還是另有隱情,我是刑警寧澤宾抓,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布子漩,位于F島的核電站,受9級(jí)特大地震影響石洗,放射性物質(zhì)發(fā)生泄漏幢泼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一讲衫、第九天 我趴在偏房一處隱蔽的房頂上張望缕棵。 院中可真熱鬧孵班,春花似錦、人聲如沸招驴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽别厘。三九已至虱饿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間触趴,已是汗流浹背氮发。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冗懦,地道東北人爽冕。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像披蕉,于是被迫代替她去往敵國和親颈畸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容