unix和linux的體系架構(gòu):分為用戶態(tài)和內(nèi)核態(tài)用戶態(tài):上層應(yīng)用程序的活動(dòng)空間,應(yīng)用程序的執(zhí)行必須依托于內(nèi)核提供的資源,。 系統(tǒng)調(diào)用:為了使上層應(yīng)用能夠訪問到這些資源,,內(nèi)核為上層應(yīng)用提供訪問的接口。
三者之間的關(guān)系如下:
系統(tǒng)調(diào)用是操作系統(tǒng)中的最小功能單位,。系統(tǒng)調(diào)用與上層應(yīng)用程序的關(guān)系: 如果將系統(tǒng)調(diào)用比作是一個(gè)“比畫”,,那么上層應(yīng)用就是一個(gè)“漢字”。如果完成一個(gè)“漢字”,,就需要通過多個(gè)系統(tǒng)調(diào)用,。
系統(tǒng)調(diào)用與公用函數(shù)庫的關(guān)系: 公用函數(shù)庫實(shí)現(xiàn)對(duì)系統(tǒng)調(diào)用的封裝,將簡單的業(yè)務(wù)邏輯接口呈現(xiàn)給用戶,,方便用戶調(diào)用,,從這個(gè)角度上看,,庫函數(shù)就像是組成漢字的“偏旁”。
從特權(quán)級(jí)來區(qū)分內(nèi)核態(tài)和用戶態(tài):在CPU的所有指令中,,有一些指令是非常危險(xiǎn)的,,如果錯(cuò)用,將導(dǎo)致整個(gè)系統(tǒng)崩潰,。所以,,CPU將指令分為特權(quán)指令和非特權(quán)指令,對(duì)于那些危險(xiǎn)的指令,,只允許操作系統(tǒng)及其相關(guān)模塊使用,,普通的應(yīng)用程序只能使用那些不會(huì)造成災(zāi)難的指令。 intel cpu提供Ring0-Ring3四種級(jí)別的運(yùn)行模式,,Ring0級(jí)別最高,,Ring3最低。Linux使用了Ring3級(jí)別運(yùn)行用戶態(tài),,Ring0作為 內(nèi)核態(tài),。
用戶態(tài)切換為內(nèi)核態(tài)的三種情況:異常事件: 當(dāng)CPU正在執(zhí)行運(yùn)行在用戶態(tài)的程序時(shí),突然發(fā)生某些預(yù)先不可知的異常事件,,這個(gè)時(shí)候就會(huì)觸發(fā)從當(dāng)前用戶態(tài)執(zhí)行的進(jìn)程轉(zhuǎn)向內(nèi)核態(tài)執(zhí)行相關(guān)的異常事件,,典型的如缺頁異常。 外圍設(shè)備的中斷:當(dāng)外圍設(shè)備完成用戶的請(qǐng)求操作后,,會(huì)像CPU發(fā)出中斷信號(hào),,此時(shí),CPU就會(huì)暫停執(zhí)行下一條即將要執(zhí)行的指令,,轉(zhuǎn)而去執(zhí)行中斷信號(hào)對(duì)應(yīng)的處理程序,,如果先前執(zhí)行的指令是在用戶態(tài)下,則自然就發(fā)生從用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)換,。
系統(tǒng)調(diào)用的本質(zhì)其實(shí)也是中斷,,相對(duì)于外圍設(shè)備的硬中斷,這種中斷稱為軟中斷,。從觸發(fā)方式和效果上來看,,這三種切換方式是完全一樣的,都相當(dāng)于是執(zhí)行了一個(gè)中斷響應(yīng)的過程,。但是從觸發(fā)的對(duì)象來看,,系統(tǒng)調(diào)用是進(jìn)程主動(dòng)請(qǐng)求切換的,而異常和硬中斷則是被動(dòng)的,。 參考資料: Linux探秘之用戶態(tài)與內(nèi)核態(tài) Linux用戶態(tài)和內(nèi)核態(tài) linux操作系統(tǒng)的內(nèi)核態(tài)和用戶態(tài)
|