本文以 32 位系統(tǒng)為例介紹內(nèi)核空間(kernel space)和用戶空間(user space)。
(資料圖片)
內(nèi)核空間和用戶空間
對 32 位操作系統(tǒng)而言,它的尋址空間(虛擬地址空間,或叫線性地址空間)為 4G(2的32次方)。也就是說一個(gè)進(jìn)程的最大地址空間為 4G。
操作系統(tǒng)的核心是內(nèi)核(kernel),它獨(dú)立于普通的應(yīng)用程序,可以訪問受保護(hù)的內(nèi)存空間,也有訪問底層硬件設(shè)備的所有權(quán)限。為了保證內(nèi)核的安全,現(xiàn)在的操作系統(tǒng)一般都強(qiáng)制用戶進(jìn)程不能直接操作內(nèi)核。
具體的實(shí)現(xiàn)方式基本都是由操作系統(tǒng)將虛擬地址空間劃分為兩部分,一部分為內(nèi)核空間,另一部分為用戶空間。針對 Linux操作系統(tǒng)而言,最高的 1G 字節(jié)(從虛擬地址 0xC0000000 到 0xFFFFFFFF)由內(nèi)核使用,稱為內(nèi)核空間。而較低的 3G 字節(jié)(從虛擬地址 0x00000000 到 0xBFFFFFFF)由各個(gè)進(jìn)程使用,稱為用戶空間。
對上面這段內(nèi)容我們可以這樣理解:
「每個(gè)進(jìn)程的 4G 地址空間中,最高 1G 都是一樣的,即內(nèi)核空間。只有剩余的 3G 才歸進(jìn)程自己使用?!埂笓Q句話說就是, 最高 1G 的內(nèi)核空間是被所有進(jìn)程共享的!」
下圖描述了每個(gè)進(jìn)程 4G 地址空間的分配情況(此圖來自互聯(lián)網(wǎng)):
為什么需要區(qū)分內(nèi)核空間與用戶空間
在 CPU的所有指令中,有些指令是非常危險(xiǎn)的,如果錯(cuò)用,將導(dǎo)致系統(tǒng)崩潰,比如清內(nèi)存、設(shè)置時(shí)鐘等。如果允許所有的程序都可以使用這些指令,那么系統(tǒng)崩潰的概率將大大增加。
所以,CPU 將指令分為特權(quán)指令和非特權(quán)指令,對于那些危險(xiǎn)的指令,只允許操作系統(tǒng)及其相關(guān)模塊使用,普通應(yīng)用程序只能使用那些不會(huì)造成災(zāi)難的指令。比如 Intel的 CPU 將特權(quán)等級分為 4 個(gè)級別:Ring0~Ring3。
其實(shí) Linux 系統(tǒng)只使用了 Ring0 和 Ring3 兩個(gè)運(yùn)行級別(Windows 系統(tǒng)也是一樣的)。當(dāng)進(jìn)程運(yùn)行在 Ring3 級別時(shí)被稱為運(yùn)行在用戶態(tài),而運(yùn)行在 Ring0 級別時(shí)被稱為運(yùn)行在內(nèi)核態(tài)。
內(nèi)核態(tài)與用戶態(tài)
好了我們現(xiàn)在需要再解釋一下什么是內(nèi)核態(tài)、用戶態(tài):
「當(dāng)進(jìn)程運(yùn)行在內(nèi)核空間時(shí)就處于內(nèi)核態(tài),而進(jìn)程運(yùn)行在用戶空間時(shí)則處于用戶態(tài)?!?/p>
在內(nèi)核態(tài)下,進(jìn)程運(yùn)行在內(nèi)核地址空間中,此時(shí) CPU 可以執(zhí)行任何指令。運(yùn)行的代碼也不受任何的限制,可以自由地訪問任何有效地址,也可以直接進(jìn)行端口的訪問。
在用戶態(tài)下,進(jìn)程運(yùn)行在用戶地址空間中,被執(zhí)行的代碼要受到 CPU 的諸多檢查,它們只能訪問映射其地址空間的頁表項(xiàng)中規(guī)定的在用戶態(tài)下可訪問頁面的虛擬地址,且只能對任務(wù)狀態(tài)段(TSS)中 I/O 許可位圖(I/O Permission Bitmap)中規(guī)定的可訪問端口進(jìn)行直接訪問。
對于以前的 DOS 操作系統(tǒng)來說,是沒有內(nèi)核空間、用戶空間以及內(nèi)核態(tài)、用戶態(tài)這些概念的??梢哉J(rèn)為所有的代碼都是運(yùn)行在內(nèi)核態(tài)的,因而用戶編寫的應(yīng)用程序代碼可以很容易的讓操作系統(tǒng)崩潰掉。
對于 Linux 來說,通過區(qū)分內(nèi)核空間和用戶空間的設(shè)計(jì),隔離了操作系統(tǒng)代碼(操作系統(tǒng)的代碼要比應(yīng)用程序的代碼健壯很多)與應(yīng)用程序代碼。即便是單個(gè)應(yīng)用程序出現(xiàn)錯(cuò)誤也不會(huì)影響到操作系統(tǒng)的穩(wěn)定性,這樣其它的程序還可以正常的運(yùn)行(Linux 可是個(gè)多任務(wù)系統(tǒng)?。?。
「所以,區(qū)分內(nèi)核空間和用戶空間本質(zhì)上是要提高操作系統(tǒng)的穩(wěn)定性及可用性。」
如何從用戶空間進(jìn)入內(nèi)核空間
其實(shí)所有的系統(tǒng)資源管理都是在內(nèi)核空間中完成的。比如讀寫磁盤文件,分配回收內(nèi)存,從網(wǎng)絡(luò)接口讀寫數(shù)據(jù)等等。我們的應(yīng)用程序是無法直接進(jìn)行這樣的操作的。但是我們可以通過內(nèi)核提供的接口來完成這樣的任務(wù)。
比如應(yīng)用程序要讀取磁盤上的一個(gè)文件,它可以向內(nèi)核發(fā)起一個(gè)「"系統(tǒng)調(diào)用"」告訴內(nèi)核:"我要讀取磁盤上的某某文件"。其實(shí)就是通過一個(gè)特殊的指令讓進(jìn)程從用戶態(tài)進(jìn)入到內(nèi)核態(tài)(到了內(nèi)核空間),在內(nèi)核空間中,CPU 可以執(zhí)行任何的指令,當(dāng)然也包括從磁盤上讀取數(shù)據(jù)。
具體過程是先把數(shù)據(jù)讀取到內(nèi)核空間中,然后再把數(shù)據(jù)拷貝到用戶空間并從內(nèi)核態(tài)切換到用戶態(tài)。此時(shí)應(yīng)用程序已經(jīng)從系統(tǒng)調(diào)用中返回并且拿到了想要的數(shù)據(jù),可以開開心心的往下執(zhí)行了。
簡單說就是應(yīng)用程序把高科技的事情(從磁盤讀取文件)外包給了系統(tǒng)內(nèi)核,系統(tǒng)內(nèi)核做這些事情既專業(yè)又高效。
對于一個(gè)進(jìn)程來講,從用戶空間進(jìn)入內(nèi)核空間并最終返回到用戶空間,這個(gè)過程是十分復(fù)雜的。舉個(gè)例子,比如我們經(jīng)常接觸的概念 "堆棧",其實(shí)進(jìn)程在內(nèi)核態(tài)和用戶態(tài)各有一個(gè)堆棧。運(yùn)行在用戶空間時(shí)進(jìn)程使用的是用戶空間中的堆棧,而運(yùn)行在內(nèi)核空間時(shí),進(jìn)程使用的是內(nèi)核空間中的堆棧。所以說,Linux 中每個(gè)進(jìn)程有兩個(gè)棧,分別用于用戶態(tài)和內(nèi)核態(tài)。
下圖簡明的描述了用戶態(tài)與內(nèi)核態(tài)之間的轉(zhuǎn)換:
既然用戶態(tài)的進(jìn)程必須切換成內(nèi)核態(tài)才能使用系統(tǒng)的資源,那么我們接下來就看看進(jìn)程一共有多少種方式可以從用戶態(tài)進(jìn)入到內(nèi)核態(tài)。
概括的說,有三種方式:系統(tǒng)調(diào)用、軟中斷和硬件中斷。這三種方式每一種都涉及到大量的操作系統(tǒng)知識(shí),所以這里不做展開。
整體結(jié)構(gòu)
接下來我們從內(nèi)核空間和用戶空間的角度看一看整個(gè) Linux 系統(tǒng)的結(jié)構(gòu)。它大體可以分為三個(gè)部分,從下往上依次為:硬件 -> 內(nèi)核空間 -> 用戶空間。如下圖所示(此圖來自互聯(lián)網(wǎng)):
在硬件之上,內(nèi)核空間中的代碼控制了硬件資源的使用權(quán),用戶空間中的代碼只有通過內(nèi)核暴露的「系統(tǒng)調(diào)用接口(System Call Interface)」才能使用到系統(tǒng)中的硬件資源。其實(shí),不光是 Linux,Windows 操作系統(tǒng)的設(shè)計(jì)也是大同小異。
實(shí)際上我們可以將每個(gè)處理器在任何指定時(shí)間點(diǎn)上的活動(dòng)概括為下列三者之一:
「運(yùn)行于用戶空間,執(zhí)行用戶進(jìn)程?!?/p>
「運(yùn)行于內(nèi)核空間,處于進(jìn)程上下文,代表某個(gè)特定的進(jìn)程執(zhí)行?!?/p>
「運(yùn)行于內(nèi)核空間,處于中斷上下文,與任何進(jìn)程無關(guān),處理某個(gè)特定的中斷?!?/p>
以上三點(diǎn)幾乎包括所有的情況,比如當(dāng) CPU 空閑時(shí),內(nèi)核就運(yùn)行一個(gè)空進(jìn)程,處于進(jìn)程上下文,但運(yùn)行在內(nèi)核空間。
說明:Linux 系統(tǒng)的中斷服務(wù)程序不在進(jìn)程的上下文中執(zhí)行,它們在一個(gè)與所有進(jìn)程都無關(guān)的、專門的中斷上下文中執(zhí)行。之所以存在一個(gè)專門的執(zhí)行環(huán)境,就是為了保證中斷服務(wù)程序能夠在第一時(shí)間響應(yīng)和處理中斷請求,然后快速地退出。
總結(jié)
現(xiàn)代的操作系統(tǒng)大都通過內(nèi)核空間和用戶空間的設(shè)計(jì)來保護(hù)操作系統(tǒng)自身的安全性和穩(wěn)定性。所以在我們閱讀有關(guān)操作系統(tǒng)的資料時(shí)經(jīng)常遇到內(nèi)核空間、用戶空間和內(nèi)核態(tài)、用戶態(tài)等概念,希望本文能夠幫助您理解這些基本的概念。
審核編輯:湯梓紅
關(guān)鍵詞:
凡本網(wǎng)注明“XXX(非中國微山網(wǎng))提供”的作品,均轉(zhuǎn)載自其它媒體,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和其真實(shí)性負(fù)責(zé)。
汽車服務(wù)板塊持續(xù)走高,浩物股份(000757)直線封板,漳州發(fā)展(000753)、
2023-06-14 11:28
興業(yè)銀錫(000426)近日接待前海開源、國信證券等幾十家機(jī)構(gòu)調(diào)研時(shí)介紹,
2023-06-14 11:42
13日,武陵區(qū)人民政府與華自科技(300490)集團(tuán)舉行戰(zhàn)略合作簽約儀式。此
2023-06-14 11:42
攜程發(fā)布的2023年端午假期出游趨勢預(yù)測數(shù)據(jù)顯示,國內(nèi)和多個(gè)出境熱門目
2023-06-14 11:34
中銀證券(601696)發(fā)布機(jī)械設(shè)備行業(yè)2023年中策略研報(bào)稱,2023年以來機(jī)械
2023-06-14 11:41
身份證就可以借錢的平臺(tái)有哪些?一、360借條360借條是360數(shù)科推出的無抵押純線上消費(fèi)信貸平臺(tái),基于360大數(shù)據(jù)提供現(xiàn)金貸款,借款額度最高20
2023-06-14 11:37
財(cái)政赤字是什么意思?1、動(dòng)用歷年結(jié)余動(dòng)用歷年結(jié)余就是使用以前年度財(cái)政收大于支形成的結(jié)余來彌補(bǔ)財(cái)政赤字。財(cái)政動(dòng)用上年結(jié)余,必須協(xié)調(diào)好
2023-06-14 11:34
怎么查詢銀行卡余額?網(wǎng)上銀行查詢:打開銀行卡相應(yīng)的銀行官方網(wǎng)站,登陸后,在賬戶查詢里,就能看見這張銀行卡的賬戶余額。手機(jī)銀行:下載
2023-06-14 11:31
漲停股成交量放大是好事嗎?一般來說,當(dāng)前個(gè)股成交量大換手率高,說明雙方博弈比較激烈,由于個(gè)股所在位置的不同,成交量的變動(dòng)因而具有不
2023-06-14 11:18
融資融券的詳細(xì)操作方法是什么?融資融券的具體操作步驟:(1)融資買入和融券賣出申報(bào)數(shù)量應(yīng)當(dāng)為100或其整數(shù)倍,投資者賣出信用證券賬戶內(nèi)證
2023-06-14 11:16