操作系统:用户态和核心态的区别
1.操作系統(tǒng)需要兩種CPU狀態(tài):
內(nèi)核態(tài)(Kernel Mode):運(yùn)行操作系統(tǒng)程序
用戶態(tài)(User Mode):運(yùn)行用戶程序
2.指令劃分:
特權(quán)指令:只能由操作系統(tǒng)使用、用戶程序不能使用的指令。??舉例:啟動(dòng)I/O???內(nèi)存清零??修改程序狀態(tài)字??設(shè)置時(shí)鐘???允許/禁止終端???停機(jī)
非特權(quán)指令:用戶程序可以使用的指令。??舉例:控制轉(zhuǎn)移??算數(shù)運(yùn)算??取數(shù)指令???訪管指令(使用戶程序從用戶態(tài)陷入內(nèi)核態(tài))
3.特權(quán)級(jí)別:
特權(quán)環(huán):R0、R1、R2和R3
R0相當(dāng)于內(nèi)核態(tài),R3相當(dāng)于用戶態(tài);
不同級(jí)別能夠運(yùn)行不同的指令集合;
?
4.CPU狀態(tài)之間的轉(zhuǎn)換:
用戶態(tài)--->內(nèi)核態(tài):唯一途徑是通過中斷、異常、陷入機(jī)制(訪管指令)
內(nèi)核態(tài)--->用戶態(tài):設(shè)置程序狀態(tài)字PSW
?
?
5.內(nèi)核態(tài)與用戶態(tài)的區(qū)別:
首先要有特權(quán)級(jí)別的概念;特權(quán)級(jí)別用特權(quán)環(huán)形象表示,R0是內(nèi)核態(tài),R3是用戶態(tài)。
1)內(nèi)核態(tài)與用戶態(tài)是操作系統(tǒng)的兩種運(yùn)行級(jí)別,當(dāng)程序運(yùn)行在3級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在用戶態(tài)。因?yàn)檫@是最低特權(quán)級(jí),是普通的用戶進(jìn)程運(yùn)行的特權(quán)級(jí),大部分用戶直接面對(duì)的程序都是運(yùn)行在用戶態(tài);
2)當(dāng)程序運(yùn)行在0級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在內(nèi)核態(tài)。
3)運(yùn)行在用戶態(tài)下的程序不能直接訪問操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和程序。當(dāng)我們?cè)谙到y(tǒng)中執(zhí)行一個(gè)程序時(shí),大部分時(shí)間是運(yùn)行在用戶態(tài)下的,在其需要操作系統(tǒng)幫助完成某些它沒有權(quán)力和能力完成的工作時(shí),就進(jìn)行系統(tǒng)調(diào)用從而陷入內(nèi)核,由操作系統(tǒng)代為完成。
4)這兩種狀態(tài)的主要差別是:
處于用戶態(tài)執(zhí)行時(shí),進(jìn)程所能訪問的內(nèi)存空間和對(duì)象受到限制,其所處于占有的處理機(jī)是可被搶占的;
而處于核心態(tài)執(zhí)行中的進(jìn)程,則能訪問所有的內(nèi)存空間和對(duì)象,且所占有的處理機(jī)是不允許被搶占的。
?
6. 通常來說,以下三種情況會(huì)導(dǎo)致用戶態(tài)到內(nèi)核態(tài)的切換:
中斷
1)系統(tǒng)調(diào)用
這是用戶態(tài)進(jìn)程主動(dòng)要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進(jìn)程通過系統(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)為用戶特別開放的一個(gè)中斷來實(shí)現(xiàn),例如Linux的int 80h中斷。
大概是??? 當(dāng)用戶程序調(diào)用系統(tǒng)的API時(shí),就產(chǎn)生中斷,進(jìn)入內(nèi)核態(tài)的API,處理完成后,用中斷再退出,返回用戶態(tài)的調(diào)用函數(shù)。???
?? user??? api??? -->??? interrupt??? -->??? kernel??? api??? -->??? interrupt
2)異常
當(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),比如缺頁異常。
3)外圍設(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)換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤讀寫操作完成,系統(tǒng)會(huì)切換到硬盤讀寫的中斷處理程序中執(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)的。
2)具體的切換操作
從觸發(fā)方式上看,可以認(rèn)為存在前述3種不同的類型,但是從最終實(shí)際完成由用戶態(tài)到內(nèi)核態(tài)的切換操作上來說,涉及的關(guān)鍵步驟是完全一致的,沒有任何區(qū)別,都相當(dāng)于執(zhí)行了一個(gè)中斷響應(yīng)的過程,因?yàn)?span style="color:#f33b45;">系統(tǒng)調(diào)用實(shí)際上最終是中斷機(jī)制實(shí)現(xiàn)的,而異常和中斷的處理機(jī)制基本上也是一致的,關(guān)于它們的具體區(qū)別這里不再贅述。關(guān)于中斷處理機(jī)制的細(xì)節(jié)和步驟這里也不做過多分析,涉及到由用戶態(tài)切換到內(nèi)核態(tài)的步驟主要包括:
[1] 從當(dāng)前進(jìn)程的描述符中提取其內(nèi)核棧的ss0及esp0信息。
[2] 使用ss0和esp0指向的內(nèi)核棧將當(dāng)前進(jìn)程的cs,eip,eflags,ss,esp信息保存起來,這個(gè)
過程也完成了由用戶棧到內(nèi)核棧的切換過程,同時(shí)保存了被暫停執(zhí)行的程序的下一
條指令。
[3] 將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應(yīng)的寄存器,開始
執(zhí)行中斷處理程序,這時(shí)就轉(zhuǎn)到了內(nèi)核態(tài)的程序執(zhí)行了。
?
總結(jié)
以上是生活随笔為你收集整理的操作系统:用户态和核心态的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统:进程间通信与线程间同步
- 下一篇: 图:BFS/DFS java实现