在CPU的所有指令中,,有一些指令是非常危險的,如果錯用,,將導(dǎo)致整個系統(tǒng)崩潰,。比如:清內(nèi)存、設(shè)置時鐘等,。如果所有的程序都能使用這些指令,,那么你的系統(tǒng)一天死機n回就不足為奇了。所以,,CPU將指令分為特權(quán)指令和非特權(quán)指令,,對于那些危險的指令,只允許操作系統(tǒng)及其相關(guān)模塊使用,,普通的應(yīng)用程序只能使用那些不會造成災(zāi)難的指令,。Intel的CPU將特權(quán)級別分為4個級別:RING0,RING1,RING2,RING3。 linux的內(nèi)核是一個有機的整體,。每一個用戶進程運行時都好像有一份內(nèi)核的拷貝,,每當(dāng)用戶進程使用系統(tǒng)調(diào)用時,,都自動地將運行模式從用戶級轉(zhuǎn)為內(nèi)核級,此時進程在內(nèi)核的地址空間中運行,。 當(dāng)一個任務(wù)(進程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時,,我們就稱進程處于內(nèi)核運行態(tài)(或簡稱為內(nèi)核態(tài))。此時處理器處于特權(quán)級最高的(0級)內(nèi)核代碼中執(zhí)行,。當(dāng)進程處于內(nèi)核態(tài)時,,執(zhí)行的內(nèi)核代碼會使用當(dāng)前進程的內(nèi)核棧。每個進程都有自己的內(nèi)核棧,。當(dāng)進程在執(zhí)行用戶自己的代碼時,,則稱其處于用戶運行態(tài)(用戶態(tài))。即此時處理器在特權(quán)級最低的(3級)用戶代碼中運行,。當(dāng)正在執(zhí)行用戶程序而突然被中斷程序中斷時,,此時用戶程序也可以象征性地稱為處于進程的內(nèi)核態(tài)。因為中斷處理程序?qū)⑹褂卯?dāng)前進程的內(nèi)核棧,。這與處于內(nèi)核態(tài)的進程的狀態(tài)有些類似,。 內(nèi)核態(tài)與用戶態(tài)是操作系統(tǒng)的兩種運行級別,跟intel cpu沒有必然的聯(lián)系, 如上所提到的intel cpu提供Ring0-Ring3四種級別的運行模式,Ring0級別最高,,Ring3最低,。Linux使用了Ring3級別運行用戶態(tài),Ring0作為 內(nèi)核態(tài),,沒有使用Ring1和Ring2,。Ring3狀態(tài)不能訪問Ring0的地址空間,包括代碼和數(shù)據(jù),。Linux進程的4GB地址空間,3G-4G部 分大家是共享的,,是內(nèi)核態(tài)的地址空間,,這里存放在整個內(nèi)核的代碼和所有的內(nèi)核模塊,以及內(nèi)核所維護的數(shù)據(jù),。用戶運行一個程序,,該程序所創(chuàng)建的進程開始是運 行在用戶態(tài)的,如果要執(zhí)行文件操作,,網(wǎng)絡(luò)數(shù)據(jù)發(fā)送等操作,,必須通過write,send等系統(tǒng)調(diào)用,,這些系統(tǒng)調(diào)用會調(diào)用內(nèi)核中的代碼來完成操作,,這時,必 須切換到Ring0,,然后進入3GB-4GB中的內(nèi)核地址空間去執(zhí)行這些代碼完成操作,,完成后,切換回Ring3,回到用戶態(tài),。這樣,,用戶態(tài)的程序就不能 隨意操作內(nèi)核地址空間,具有一定的安全保護作用,。 用戶態(tài)切換到內(nèi)核態(tài)的3種方式
為什么要有用戶態(tài)和內(nèi)核態(tài),? 由于需要限制不同的程序之間的訪問能力, 防止他們獲取別的程序的內(nèi)存數(shù)據(jù), 或者獲取外圍設(shè)備的數(shù)據(jù), 并發(fā)送到網(wǎng)絡(luò), CPU劃分出兩個權(quán)限等級 – 用戶態(tài)和內(nèi)核態(tài),。 參考資料 https://blog.csdn.net/youngyoungla/article/details/53106671 https://blog.csdn.net/liuyueyue0921/article/details/48225533 |
|