使用者模式與核心模式的差異:指令、記憶體、切換、成本、保護比較

CPU 具有應用程式執行的使用者模式,以及 OS 核心執行的核心模式(特權模式)。在使用者模式下,無法執行設定分頁表、操作輸入輸出、禁止中斷等特權指令,也只能存取自己行程的記憶體。需要讀寫檔案等操作時,要透過系統呼叫請核心處理。如此一來,就能避免單一應用程式的錯誤或惡意行為波及其他行程、OS 或硬體。

項目使用者模式核心模式
執行的程式應用程式OS 核心、大部分的裝置驅動程式
可執行的指令只有一般指令。執行特權指令會發生例外所有指令。切換分頁表、允許與禁止中斷、設定控制暫存器等
可存取的記憶體只有自己行程的虛擬位址空間中,允許使用者存取的分頁包含核心區域在內的全部。也能處理實體記憶體與裝置的暫存器
裝置的操作無法直接操作。透過系統呼叫請核心處理直接讀寫暫存器,並處理中斷
在架構中的名稱(例)x86 的 ring 3、Arm 的 EL0、RISC-V 的 U 模式x86 的 ring 0、Arm 的 EL1、RISC-V 的 S 模式
模式切換的觸發條件因系統呼叫指令(syscall、svc、ecall 等)、裝置或計時器的中斷、例外(分頁錯誤、除以 0、非法指令等)而進入核心模式以專用的返回指令(sret、eret 等)同時還原返回位址與模式,回到使用者模式
切換的成本(參考值)系統呼叫往返大約 100 ns 至 1 µs。也可能因漏洞的防護措施而增加核心內的處理之間是函式呼叫,沒有模式切換。行程的切換(上下文切換)則更重
錯誤的影響只有該行程會被強制終止整個系統可能停止(核心恐慌等)

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

使用者模式
應用程式與函式庫的一般處理。計算與記憶體讀寫不經過核心,直接在使用者模式下快速進行。
核心模式
檔案或網路的輸入輸出、記憶體配置、行程切換、中斷處理等,需要資源管理與保護的處理。
提升效能的做法
為了減少系統呼叫的次數,會先累積在使用者空間的緩衝區再一次寫出,或利用共用記憶體或專用機制,讓部分處理維持在使用者模式下進行。

常見問題

為什麼要區分使用者模式與核心模式?

為了防止應用程式擅自操作分頁表或裝置。區分之後,即使某個程式有錯誤,也無法破壞其他行程或 OS 的記憶體,或劫持裝置,只要終止該程式即可。

什麼時候會從使用者模式切換到核心模式?

有 3 種觸發條件:程式主動提出請求的系統呼叫、來自裝置或計時器的中斷,以及分頁錯誤或除以 0 等指令執行所造成的例外。無論哪一種情況,CPU 都會切換模式,從核心固定的入口開始處理。

為什麼系統呼叫很慢?

因為除了模式切換之外,還需要儲存與還原暫存器、檢查參數,以及核心入口與出口的處理。若為了漏洞防護而切換分頁表,負擔會更重。即使單次很短,若每次小量讀寫都呼叫,也會造成很大的負擔。

模式切換與上下文切換相同嗎?

不同。系統呼叫的模式切換只是在同一個行程中進入核心的處理。上下文切換是替換所執行的行程或執行緒本身,還伴隨位址空間的切換等,因此是更重的處理。

理解度檢測

CPU設置特權模式(核心模式)與使用者模式,主要目的為何?

  1. A讓應用程式的指令能比核心的指令更快、更優先地執行
  2. B保護頁表與裝置,避免應用程式任意操作
  3. C讓一顆CPU能同時執行兩個指令
查看答案與解析

正確答案:B. 保護頁表與裝置,避免應用程式任意操作

若應用程式能自由改寫頁表、操作輸入輸出裝置或停用中斷,就可能破壞其他程式的記憶體,或讓整個系統停擺。因此CPU規定這些指令只能在特權模式下執行,只有作業系統的核心才能使用。若在使用者模式下嘗試執行,就會產生例外。這並不是為了提升速度或同時執行而設計的機制。

應用程式請求作業系統進行檔案讀寫等操作的機制稱為什麼?

  1. A系統呼叫(system call)
  2. B環境切換(context switch)
  3. C需求分頁(demand paging)
查看答案與解析

正確答案:A. 系統呼叫(system call)

應用程式在使用者模式下執行,因此無法直接操作磁碟或裝置。所以要使用系統呼叫,透過專用指令切換到特權模式並呼叫核心的處理程序,來請求檔案讀寫、記憶體配置、行程建立等服務。處理完成後會回到使用者模式。環境切換是切換要執行的行程,需求分頁則是在需要時才載入分頁的方式。

關於中斷與例外的差異,下列何者是一般的說明?

  1. A中斷只由軟體引發,例外只由硬體電路引發
  2. B中斷由裝置等外部因素引發,例外則是指令執行的結果所引發
  3. C中斷處理後無法返回原處,例外則一定能返回原本的處理
查看答案與解析

正確答案:B. 中斷由裝置等外部因素引發,例外則是指令執行的結果所引發

中斷是由輸入輸出裝置的完成通知或計時器等,與執行中指令無關的外部因素所引發,何時發生並不固定(非同步)。例外則是除以零、非法指令、分頁錯誤(page fault)、系統呼叫指令等,因執行特定指令的結果而發生(同步)。兩者多半都能在中斷處理常式處理完後返回原本的處理,並非以能否返回來區分。

  1. 上方RISC-V程式碼最後的ecall指令被執行時,會發生下列何事?
  2. 處理完中斷或例外而回到原本的程式時,不使用一般函式的返回指令,而是使用專用的返回指令(RISC-V的sret、mret等),其理由為何?
  3. 寫出小量資料時,與其逐位元組每次都呼叫系統呼叫,不如先暫存在使用者空間的緩衝區再一併寫出,速度會比較快,其主要理由為何?

前往作業系統與硬體的練習題

相關名詞的解說

特權模式
只有作業系統核心可以使用的CPU運作模式。可執行頁表設定或輸入輸出操作等危險指令,與應用程式執行的使用者模式有所區別。
系統呼叫
應用程式請求作業系統進行檔案讀寫或記憶體配置等的機制。以專用指令引發例外並切換到特權模式,呼叫核心的處理。
中斷處理常式
發生中斷或例外時CPU所執行的處理。儲存被中斷處理的狀態,依原因進行相應處理後,回到原本的處理。原則上處理要盡可能簡短。
頁表
記錄虛擬位址的頁號到實體位址頁號之對應關係的表。由作業系統為每個行程建立,CPU的MMU參照它來轉換位址。每個項目也包含保護用的位元。
環境切換
切換在CPU上執行的行程或執行緒。儲存並還原暫存器與程式計數器等狀態,切換行程時也會切換位址空間。

相關的比較