主頁(yè) > 知識(shí)庫(kù) > 該怎樣去理解Linux內(nèi)核態(tài)和用戶(hù)態(tài)?

該怎樣去理解Linux內(nèi)核態(tài)和用戶(hù)態(tài)?

熱門(mén)標(biāo)簽:地圖標(biāo)注月入1萬(wàn) 鄭州高頻外呼系統(tǒng)好用嗎 地圖標(biāo)注軟件知乎 高德地圖標(biāo)注收費(fèi) 廈門(mén)新卓越智能語(yǔ)音電話(huà)機(jī)器人 智能電話(huà)機(jī)器人推廣 水庫(kù)地圖標(biāo)注 ai智能電銷(xiāo)機(jī)器人軟件 電話(huà)機(jī)器人邀約案例

1、特權(quán)級(jí)

Intel x86架構(gòu)的cpu一共有0~4四個(gè)特權(quán)級(jí),0級(jí)最高,3級(jí)最低,硬件上在執(zhí)行每條指令時(shí)都會(huì)對(duì)指令所具有的特權(quán)級(jí)做相應(yīng)的檢查。硬件已經(jīng)提供了一套特權(quán)級(jí)使用的相關(guān)機(jī)制,軟件自然要好好利用,這屬于操作系統(tǒng)要做的事情,對(duì)于UNIX/LINUX來(lái)說(shuō),只使用了0級(jí)特權(quán)級(jí)別和3級(jí)特權(quán)級(jí)。也就是說(shuō)在UNIX/LINUX系統(tǒng)中,一條工作在0級(jí)特權(quán)級(jí)的指令具有了CPU能提供的最高權(quán)力,而一條工作在3級(jí)特權(quán)的指令具有CPU提供的最低或者說(shuō)最基本權(quán)力

2、用戶(hù)態(tài)和內(nèi)核態(tài)

內(nèi)核棧:Linux中每個(gè)進(jìn)程有兩個(gè)棧,分別用于用戶(hù)態(tài)和內(nèi)核態(tài)的進(jìn)程執(zhí)行,其中的內(nèi)核棧就是用于內(nèi)核態(tài)的堆棧,它和進(jìn)程的task_struct結(jié)構(gòu),更具體的是thread_info結(jié)構(gòu)一起放在兩個(gè)連續(xù)的頁(yè)框大小的空間內(nèi)。

現(xiàn)在我們從特權(quán)級(jí)的調(diào)度來(lái)理解用戶(hù)態(tài)和內(nèi)核態(tài)就比較好理解了,當(dāng)程序運(yùn)行在3級(jí)特權(quán)級(jí)上時(shí),就可以稱(chēng)之為運(yùn)行在用戶(hù)態(tài),因?yàn)檫@是最低特權(quán)級(jí),是普通的用戶(hù)進(jìn)程運(yùn)行的特權(quán)級(jí),大部分用戶(hù)直接面對(duì)的程序都是運(yùn)行在用戶(hù)態(tài);反之,當(dāng)程序運(yùn)行在0級(jí)特權(quán)級(jí)上時(shí),就可以稱(chēng)之為運(yùn)行在內(nèi)核態(tài)。

雖然用戶(hù)態(tài)下和內(nèi)核態(tài)下工作的程序有很多差別,但最重要的差別就在于特權(quán)級(jí)的不同,即權(quán)力的不同。運(yùn)行在用戶(hù)態(tài)的程序不能訪(fǎng)問(wèn)操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)合程序。 當(dāng)我們?cè)谙到y(tǒng)中執(zhí)行一個(gè)程序時(shí),大部分時(shí)間是運(yùn)行在用戶(hù)態(tài)下的。在其需要操作系統(tǒng)幫助完成某些它沒(méi)有權(quán)力和能力完成的工作時(shí)就會(huì)切換到內(nèi)核態(tài)。

Linux進(jìn)程的4GB地址空間,3G-4G部分大家是共享的,是內(nèi)核態(tài)的地址空間,這里存放在整個(gè)內(nèi)核的代碼和所有的內(nèi)核模塊,以及內(nèi)核所維護(hù)的數(shù)據(jù)。用戶(hù)運(yùn)行一個(gè)程序,該程序所創(chuàng)建的進(jìn)程開(kāi)始是運(yùn)行在用戶(hù)態(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í),必須切換到Ring0eip系統(tǒng),然后進(jìn)入3GB-4GB中的內(nèi)核地址空間去執(zhí)行這些代碼完成操作,完成后,切換回Ring3,回到用戶(hù)態(tài)。這樣,用戶(hù)態(tài)的程序就不能隨意操作內(nèi)核地址空間,具有一定的安全保護(hù)作用。 保護(hù)模式,通過(guò)內(nèi)存頁(yè)表操作等機(jī)制,保證進(jìn)程間的地址空間不會(huì)互相沖突,一個(gè)進(jìn)程的操作不會(huì)修改另一個(gè)進(jìn)程的地址空間中的數(shù)據(jù)。在內(nèi)核態(tài)下,CPU可執(zhí)行任何指令,在用戶(hù)態(tài)下CPU只能執(zhí)行非特權(quán)指令。當(dāng)CPU處于內(nèi)核態(tài),可以隨意進(jìn)入用戶(hù)態(tài);而當(dāng)CPU處于用戶(hù)態(tài),只能通過(guò)中斷的方式進(jìn)入內(nèi)核態(tài)。一般程序一開(kāi)始都是運(yùn)行于用戶(hù)態(tài),當(dāng)程序需要使用系統(tǒng)資源時(shí),就必須通過(guò)調(diào)用軟中斷進(jìn)入內(nèi)核態(tài).

3、用戶(hù)態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換

1)用戶(hù)態(tài)切換到內(nèi)核態(tài)的3種方式

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

這是用戶(hù)態(tài)進(jìn)程主動(dòng)要求切換到內(nèi)核態(tài)的一種方式,用戶(hù)態(tài)進(jìn)程通過(guò)系統(tǒng)調(diào)用申請(qǐng)使用操作系統(tǒng)提供的服務(wù)程序完成工作。而系統(tǒng)調(diào)用的機(jī)制,其核心還是使用了操作系統(tǒng)為用戶(hù)特別開(kāi)放的一個(gè)中斷來(lái)實(shí)現(xiàn),例如lx86的int 80h, powerpc的sc

b. 異常

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

c. 外圍設(shè)備的中斷

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

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

4、具體的切換操作

從觸發(fā)方式上看,可以認(rèn)為純?cè)谇笆?種不同的類(lèi)型,但是從最終實(shí)際完成由用戶(hù)態(tài)到內(nèi)核態(tài)的切換操作上來(lái)說(shuō),涉及的關(guān)鍵步驟是完全一致的,沒(méi)有任何區(qū)別,都相當(dāng)于執(zhí)行了一個(gè)中斷響應(yīng)的過(guò)程,因?yàn)橄到y(tǒng)調(diào)用實(shí)際上最終是中斷機(jī)制實(shí)現(xiàn)的,而異常和中斷的處理機(jī)制基本上也是一致的。關(guān)于中斷處理機(jī)制的細(xì)節(jié)合步驟這里不做過(guò)多分析,涉及到有用戶(hù)態(tài)切換到內(nèi)核態(tài)的步驟主要包括:

【1】從當(dāng)前進(jìn)程的描述符中提取其內(nèi)核棧的ss0及esp0信息

【2】使用ss0和esp0指向的內(nèi)核棧將當(dāng)前進(jìn)程的cseip系統(tǒng),eip,eflags,ss,esp信息保存起來(lái),這個(gè)過(guò)程也完成了由用戶(hù)棧到內(nèi)核棧的切換過(guò)程,同時(shí)保存了被暫停執(zhí)行的程序的下一條指令。

【3】將先前又中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應(yīng)的寄存器,開(kāi)始執(zhí)行中斷處理程序,這時(shí)就轉(zhuǎn)到內(nèi)核態(tài)的程序執(zhí)行了。

標(biāo)簽:呂梁 遼寧 黔西 宜昌 宿遷 宣城 常德 呼倫貝爾

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《該怎樣去理解Linux內(nèi)核態(tài)和用戶(hù)態(tài)?》,本文關(guān)鍵詞  該,怎樣,去,理解,Linux,內(nèi)核,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《該怎樣去理解Linux內(nèi)核態(tài)和用戶(hù)態(tài)?》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于該怎樣去理解Linux內(nèi)核態(tài)和用戶(hù)態(tài)?的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章