保護與安全

保護環(protection ring)

想像一個由同心圓組成的標靶,像射飛鏢的靶。正中央的紅心是最受信任、最有權力的地方;每往外一環,就少一分信任、少一分權力。硬體設計者借用了這幅圖像來控制程式碼被允許做什麼。CPU 以數個排成巢狀環的特權級之一來執行程式碼,最內環(編號 0)權限最高,外環則逐步受限。這正是讓「使用者模式對核心模式」之分得以成真的硬體基礎。

具體來說,處理器在一個小暫存器裡記著目前所在的環,而某些指令、以及某些記憶體或裝置存取,被標記為「需要某個最低特權」。如果外環的程式碼試圖執行一條特權指令——例如關閉中斷、或重新設定記憶體管理單元的那種——硬體會拒絕並引發陷阱,把控制權移交給更受信任的處理常式。程式碼不能隨興把自己升到內環;唯一往內的路徑是經由一道受控制的閘門,例如跳到核心所定的固定進入點的系統呼叫指令。於是作業系統核心在環 0 以完整權力執行,一般應用程式在最外環(x86 上常是環 3)執行、其危險指令被停用,而硬體在每一條指令上機械式地強制這條界線。

保護環之所以重要,是因為它由矽(硬體)強制,而非靠信任:一個有臭蟲或懷惡意的應用程式,無論怎麼嘗試,都「實際上」無法執行特權指令。誠實的現實是:雖然經典架構定義了四個環(0 到 3),多數真實系統其實只用其中兩個——核心在環 0、使用者在環 3——因為兩個乾淨的層級就夠了,而管理四個徒增複雜、收益甚微。虛擬化後來把畫面弄複雜了:客體作業系統以為自己在環 0,但超管理器才必須真正握有那份權力,這催生了額外的硬體模式(有時被寬鬆地稱為環 -1),好讓虛擬機器監視器能坐在連客體核心都更底下的位置。

某 App 呼叫 read(fd, buf, n)。函式庫發出一條系統呼叫指令,那是唯一合法的往內閘門;CPU 從環 3 切到環 0,跳到核心的固定進入點。核心去做有特權的磁碟輸入輸出,然後返回、降回環 3。該 App 自己從未執行過任何特權指令。

從環 3 到環 0 的唯一通道,是受控制的閘門——系統呼叫。

硬體或許定義了四個環,但實務上幾乎人人只用環 0(核心)與最外環(使用者)。這些環由 CPU 本身強制,這正是為什麼應用程式無法直接選擇去執行特權程式碼。

又称
privilege levelprivilege ringringCPU privilege level特權級特權環