RV32/64 特權架構 - 特權模式與指令
- 1 特權模式
- 2 特權指令
- 2.1 mret(從機器模式返回到先前的模式)
- 2.2 sret(從監管模式返回到先前的模式)
- 2.3 wfi(等待中斷)
- 2.4 sfence.vma(內存屏障)
- 3 特權模式的切換
本文屬于《 RISC-V指令集基礎系列教程》之一,歡迎查看其它文章。
1 特權模式
RISC-V 架構定義了三種主要的工作模式,也被稱為特權模式。
這些模式的主要區別在于,它們的權限級別和所能夠執行的操作,工作模式編碼,如下圖所示:
- 用戶模式(User Mode)
權限等級最低。
在這個模式下運行的程序(如應用程序)不能直接訪問硬件資源或執行特權操作。
用戶模式提供了最基本的程序執行環境,用于隔離和保護操作系統內核和其他程序。
它確保了應用程序的穩定性和安全性,防止它們對系統造成損害。
- 監管模式(Supervisor Mode,也稱為超級用戶模式)
權限等級介于用戶模式和機器模式之間。
通常用于操作系統內核的運行。
在監管模式下,程序可以執行一些特權操作,如訪問物理內存、管理設備驅動程序等。
它允許操作系統管理硬件資源,為多個用戶模式的程序提供服務和調度。
- 機器模式(Machine Mode)
權限等級最高。
在這個模式下,程序可以執行所有操作,包括直接訪問和修改所有硬件資源。
機器模式通常用于硬件初始化、系統引導、中斷和異常處理等關鍵任務。
由于其高度特權,機器模式通常只允許特定的、受信任的代碼運行。
這些模式的優先級順序為:機器模式 > 監管模式 > 用戶模式
機器模式,是最高級特權,也是 RISC-V 硬件平臺唯一必須實現的特權級。
處理器通常在最低特權模式下運行,當發生中斷和異常時,則將控制權轉移到更高特權的模式。
這些模式的存在意義在于提供了一種靈活而安全的計算環境。通過限制不同程序的權限,RISC-V 架構能夠防止惡意軟件或不受信任的程序對系統造成損害。同時,它也允許操作系統有效地管理硬件資源,確保多個程序能夠公平地共享這些資源。
RISC-V 架構的模塊化設計使得這些模式可以根據需要進行組合和配置,從而滿足不同系統的需求。例如,一些嵌入式系統可能只需要用戶模式和機器模式,而不需要監管模式。
2 特權指令
RISC-V 特權架構的指令示意圖,如下所示:
RISC-V具備的特權指令,如下所示:
特權架構添加的指令非常少,但增加了若干控制狀態寄存器(CSR)來實現其新增功能。
2.1 mret(從機器模式返回到先前的模式)
指令形式:mret
在RISC-V架構中,mret(Machine Return)指令用于從異常或中斷處理程序返回到先前的執行環境(通常是從機器模式返回到之前的模式,如監管模式或用戶模式)。這個指令負責恢復處理器的狀態,并確保返回到正確的執行地址。
具體來說,當處理器遇到中斷或異常時,它會切換到機器模式(M模式)以處理該中斷或異常。在處理完成后,mret指令被用來退出機器模式,并返回到之前的狀態和模式。
mret指令的執行過程涉及以下幾個步驟:
- 恢復狀態:mret指令會從特定的CSR寄存器(如mstatus、mepc等)中恢復處理器的狀態。這些寄存器在中斷或異常發生時保存了處理器的狀態信息。
- 切換模式:根據mstatus寄存器中的MPP字段的值,mret指令將決定返回到哪個模式(機器模式、監管模式或用戶模式)。
- 跳轉到程序計數器:mret指令將mepc寄存器中的值(即中斷或異常處理完成后應該返回的程序地址)復制到程序計數器(PC),從而確保處理器從正確的地址開始執行。
需要注意的是,mret指令只能在機器模式下執行,并且只有在軟件修改了mstatus寄存器的MPP字段以指定要返回到的模式之后,才能安全地使用該指令進行返回操作。
總的來說,mret指令在RISC-V架構中扮演著從機器模式返回到其他模式的關鍵角色,確保了處理器在中斷或異常處理完成后能夠正確地恢復到先前的執行環境。
2.2 sret(從監管模式返回到先前的模式)
指令形式:sret
在RISC-V架構中,sret(Supervisor Return)指令用于從異常或中斷處理程序返回到監督模式(Supervisor Mode)。它是RISC-V處理器的一組退出指令之一,專門用于在監督模式下退出異常。
當處理器在執行用戶模式的程序時遇到需要由監督模式處理的異常或中斷時,它會切換到監督模式來執行相應的異常或中斷處理程序。在異常或中斷處理程序執行完成后,sret指令被用來從監督模式返回到用戶模式,并繼續執行原來的程序。
sret指令的執行過程與mret類似,也會恢復處理器的狀態并跳轉到正確的程序計數器(PC)。它會從特定的CSR寄存器(如sstatus、sepc等)中恢復監督模式的狀態信息,并將sepc寄存器中的值復制到程序計數器(PC),從而確保處理器從正確的地址開始執行用戶模式的程序。
需要注意的是,sret指令只能在監督模式下執行,并且只有在軟件修改了相應CSR寄存器的字段以指定要返回到的模式之后,才能安全地使用該指令進行返回操作。
總之,sret指令在RISC-V架構中用于從監督模式返回到用戶模式,確保處理器在異常或中斷處理完成后能夠正確地恢復到用戶模式的執行環境。
2.3 wfi(等待中斷)
指令形式:wfi
RISC-V架構中的WFI(Wait For Interrupt)指令是一條特殊的休眠指令。當處理器執行到WFI指令后,它會停止執行當前的指令流,進入一種空閑狀態,通常被稱為“休眠”狀態。處理器會在這個狀態下等待,直到接收到一個使能的中斷請求,這時處理器會被喚醒并繼續執行。
具體來說,WFI指令的作用是將處理器置于低功耗的等待狀態,直到下一個中斷或觸發事件發生。在這個過程中,CPU的功耗會被降到最低水平。這是一種常用于節能和功耗優化的待機指令。
此外,WFI指令也可以被當作一種NOP(無操作)指令來使用,即它不會真正進入休眠模式,但仍然會停止當前的指令執行,直到下一個中斷或觸發事件發生。
需要注意的是,WFI指令的執行需要滿足一些條件,例如中斷局部開關必須被打開(由mie寄存器控制),并且全局中斷也需要被使能(由mstatus寄存器的MIE域控制)。如果中斷被全局關閉,處理器在喚醒后會繼續順序執行之前停止的指令流。
總的來說,WFI指令在RISC-V架構中提供了一種有效的機制來降低處理器的功耗,并在需要時通過中斷來喚醒處理器,從而實現了節能和高效的處理器管理。
2.4 sfence.vma(內存屏障)
指令形式:sfence.vma rs1, rs2
在RISC-V架構中,sfence.vma指令是一個同步屏障(Synchronization Fence)指令,用于確保內存操作的順序性。這條指令在RISC-V的特權模式(Supervisor Mode)中提供內存訪問的同步機制。
sfence.vma指令的具體語法是sfence.vma rs1, rs2,其中rs1和rs2是兩個寄存器操作數。然而,需要注意的是,盡管sfence.vma指令接受兩個寄存器操作數,但這兩個操作數并不直接參與指令的功能。實際上,這兩個寄存器通常被設置為零,因為sfence.vma指令的行為不依賴于這兩個寄存器的具體值。
sfence.vma指令的主要作用是創建一個內存屏障,確保在指令之前的所有內存寫操作(Store)在指令執行后對所有后續的內存讀操作(Load)都是可見的。換句話說,它確保了在sfence.vma指令之前的所有寫操作在指令執行后都已經被刷新到內存中,并且后續的讀操作能夠讀取到這些更新的值。
這種內存屏障機制在并發編程和多處理器系統中非常重要,因為它可以防止內存訪問的競態條件(Race Condition)。例如,當多個處理器或線程同時訪問和修改共享內存時,如果沒有適當的同步機制,就可能出現一個處理器讀取到的內存值是另一個處理器尚未寫入的舊值的情況,從而導致程序行為的不正確。通過使用sfence.vma指令,可以確保內存訪問的順序性,從而避免這類問題。
需要注意的是,sfence.vma指令只在Supervisor Mode下有效,并且在其他模式下執行該指令將導致未定義行為。此外,該指令的具體行為可能還取決于處理器的具體實現和配置。因此,在使用sfence.vma指令時,建議查閱相關的處理器文檔或參考手冊以獲取準確的信息。
3 特權模式的切換
在 RISC-V 架構中,三種特權模式(用戶模式、監管模式、機器模式)之間的切換是通過特定的指令和系統寄存器的配合來實現的。
(1) 指令控制:
- 使用特定的特權切換指令,如 mret(從機器模式返回到先前的模式)、sret(從監管模式返回到先前的模式)和 uret(從用戶模式返回到先前的模式)。這些指令用于在完成特權操作后安全地返回到較低權限的模式。
(2) 系統寄存器:
- RISC-V 架構使用了一組稱為 Control and Status Registers (CSRs) 的特殊寄存器來管理特權級別的切換。其中,mstatus 寄存器是機器狀態寄存器,包含了關于機器模式狀態的信息。
- mstatus.mpp 字段用于指示當前特權級別。當需要切換特權級別時,軟件會修改 mstatus.mpp 字段的值,并通過執行相應的返回指令來實際執行切換。
(3) 中斷和異常處理:
- 當發生中斷或異常時,處理器會根據中斷或異常的類型自動切換到相應的特權級別。例如,處理器接收到一個中斷時,可能會切換到機器模式來處理該中斷。
- 中斷和異常處理完成后,處理器會根據 mstatus.mpp 寄存器的值返回到先前的特權級別。
(4) 硬件支持:
- RISC-V 架構的硬件設計支持這些模式的切換。處理器在執行特權切換指令時,會檢查當前的特權級別和目標特權級別,并執行必要的狀態保存和恢復操作。
需要注意的是,具體的切換機制和步驟可能會因具體的 RISC-V 實現和系統配置而有所不同。上述描述提供了一般的概述,但具體的實現細節可能會因處理器微架構、操作系統和硬件平臺而異。