CPU 的 ring0、ring1、ring2、ring3
Intel 的 CPU 將特權(quán)級別分為 4 個級別:RING0、RING1、RING2、RING3。Windows 只使用其中的兩個級別 RING0 和 RING3,RING0 只給操作系統(tǒng)用,RING3 誰都能用。如果普通應(yīng)用程序企圖執(zhí)行RING0 指令,則 Windows 會顯示“非法指令”錯誤信息。
ring0 是指 CPU 的運(yùn)行級別,ring0 是最高級別,ring1 次之,ring2 更次之……? 拿 Linux + x86 來說,? 操作系統(tǒng)(內(nèi)核)的代碼運(yùn)行在最高運(yùn)行級別 ring0 上,可以使用特權(quán)指令,控制中斷、修改頁表、訪問設(shè)備等等。? 應(yīng)用程序的代碼運(yùn)行在最低運(yùn)行級別上 ring3 上,不能做受控操作。如果要做,比如要訪問磁盤,寫文件,那就要通過執(zhí)行系統(tǒng)調(diào)用(函數(shù)),執(zhí)行系統(tǒng)調(diào)用的時候,CPU 的運(yùn)行級別會發(fā)生從 ring3 到 ring0 的切換,并跳轉(zhuǎn)到系統(tǒng)調(diào)用對應(yīng)的內(nèi)核代碼位置執(zhí)行,這樣內(nèi)核就為你完成了設(shè)備訪問,完成之后再從 ring0 返回 ring3。這個過程也稱作用戶態(tài)和內(nèi)核態(tài)的切換。??
RING 設(shè)計(jì)的初衷是將系統(tǒng)權(quán)限與程序分離出來,使之能夠讓 OS 更好的管理當(dāng)前系統(tǒng)資源,也使得系統(tǒng)更加穩(wěn)定。舉個 RING 權(quán)限的最簡單的例子:一個停止響應(yīng)的應(yīng)用程式,它運(yùn)行在比 RING0 更低的指令環(huán)上,你不必大費(fèi)周章的想著如何使系統(tǒng)回復(fù)運(yùn)作,這期間,只需要啟動任務(wù)管理器便能輕松終止它,因?yàn)樗\(yùn)行在比程式更低的 RING0 指令環(huán)中,擁有更高的權(quán)限,可以直接影響到 RING0 以上運(yùn)行的程序。當(dāng)然有利就有弊,RING 保證了系統(tǒng)穩(wěn)定運(yùn)行的同時,也產(chǎn)生了一些十分麻煩的問題。比如一些 OS 虛擬化技術(shù),在處理 RING 指令環(huán)時便遇到了麻煩,系統(tǒng)是運(yùn)行在 RING0 指令環(huán)上的,但是虛擬的 OS 畢竟也是一個系統(tǒng),也需要與系統(tǒng)相匹配的權(quán)限。而 RING0 不允許出現(xiàn)多個 OS 同時運(yùn)行在上面,最早的解決辦法便是使用虛擬機(jī),把 OS 當(dāng)成一個程序來運(yùn)行。
?
轉(zhuǎn)載于:https://blog.csdn.net/tian5753/article/details/80887470
?
(SAW:Game Over!)
?
總結(jié)
以上是生活随笔為你收集整理的CPU 的 ring0、ring1、ring2、ring3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: ubuntu 下通过 sh 命令运行脚本
- 下一篇: Cpp / #error、static_
