看面經(jīng)的是發(fā)現(xiàn)這個(gè)經(jīng)常被問(wèn)到领跛,在這里記錄一下。
首先要搞明白這個(gè)用戶(hù)態(tài)和內(nèi)核態(tài)作用的對(duì)象和他存在的意義。這個(gè)概念是針對(duì)CPU的狀態(tài)的描述串结。在內(nèi)核態(tài)可以執(zhí)行一切特權(quán)代碼,在用戶(hù)態(tài)只能執(zhí)行那些受限級(jí)別的代碼舅列。如果需要調(diào)用特權(quán)代碼需要進(jìn)行內(nèi)核態(tài)切換肌割。這個(gè)概念存在的本質(zhì)意義是為了進(jìn)行權(quán)限保護(hù)。限定用戶(hù)的程序不能亂搞操作系統(tǒng)帐要,如果人人都能任意讀寫(xiě)任意地址空間軟件管理就亂套了把敞。在intel的設(shè)計(jì)下操作系統(tǒng)分為4個(gè)ring,分別是ring0榨惠,1先巴,2其爵,3。用戶(hù)態(tài)的程序工作在3伸蚯,內(nèi)核態(tài)的程序處于0摩渺。
2. 用戶(hù)態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換
1)用戶(hù)態(tài)切換到內(nèi)核態(tài)的3種方式
a. 系統(tǒng)調(diào)用 (本質(zhì)是內(nèi)中斷)
這是用戶(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ù)程序完成工作剂邮,比如前例中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用摇幻。而系統(tǒng)調(diào)用的機(jī)制其核心還是使用了操作系統(tǒng)為用戶(hù)特別開(kāi)放的一個(gè)中斷來(lái)實(shí)現(xiàn),例如Linux的int 80h中斷挥萌。
b. 異常 (是內(nèi)中斷)
當(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ā)起的,異常和外圍設(shè)備中斷則是被動(dòng)的唧瘾。CPU是怎么知道目前所處于的狀態(tài)呢措译?這就要考PSW (Program Status Word)寄存器里的值來(lái)辨別。這三種狀態(tài)切換本質(zhì)都是走了中斷處理流程饰序。
至于從內(nèi)核態(tài)切換到用戶(hù)態(tài)則是通過(guò)設(shè)置PSW字段來(lái)進(jìn)行轉(zhuǎn)換瞳遍。