RISC-V特權架構 - 機器模式下的異常處理

RISC-V特權架構 - 機器模式下的異常處理

  • 1 進入異常
    • 1.1 從mtvec 定義的PC 地址開始執行
    • 1.2 更新CSR 寄存器mcause
    • 1.3 更新CSR 寄存器mepc
    • 1.4 更新CSR 寄存器mtval
    • 1.5 更新CSR 寄存器mstatus
  • 2 退出異常
    • 2.1 從mepc 定義的PC 地址開始執行
    • 2.2 更新CSR 寄存器mstatus
  • 3 異常服務程序

本文屬于《 RISC-V指令集基礎系列教程》之一,歡迎查看其它文章。

狹義的中斷和異常,均可以被歸于廣義的異常范疇,因此本文自此將用“異常”作為統一概念進行論述,其包含了狹義上的“中斷”和“異常”

RISC-V 定義的三種模式 User、Supervisor 和 Machine,均可發生異常,但是只有特權模式 SupervisorMachine 才能處理異常,因為處理異常需要 CSR 寄存器。默認情況下,RISC-V所有的異常,都在Machine模式下處理。除此以外,還可以通過委托機制,將異常委托給Supervisor模式下處理。

這里本文介紹的是Machine模式下的異常處理機制。

1 進入異常

進入異常時,RISC-V 架構規定的硬件行為,可以簡述如下:

(1)停止執行當前程序流,轉而從CSR 寄存器mtvec 定義的PC 地址開始執行。

(2)進入異常,不僅會讓處理器跳轉到,上述的PC 地址開始執行,還會讓硬件,同時更新其他幾個CSR 寄存器,分別是以下4 個寄存器:

  • 機器模式異常原因寄存器mcause(Machine Cause Register)
  • 機器模式異常PC 寄存器mepc(Machine Exception Program Counter)
  • 機器模式異常值寄存器mtval(Machine Trap Value Register )
  • 機器模式狀態寄存器mstatus(Machine Status Register)

下文將分別予以詳述。

1.1 從mtvec 定義的PC 地址開始執行

RISC-V 架構規定,在處理器的程序執行過程中,一旦遇到異常發生,則終止當前的程序流,處理器被強行跳轉到一個新的PC 地址。該過程在RISC-V 的架構中定義為“陷阱(trap)”,字面含義為“跳入陷阱”,更加準確的意譯為“進入異常”。

RISC-V 處理器trap 后跳入的PC 地址,由一個叫做機器模式異常入口基地址寄存器mtvec(Machine Trap-Vector Base-Address Register)的CSR 寄存器指定,其要點如下:

(1)mtvec 寄存器是一個可讀可寫的CSR 寄存器,因此軟件可以編程更改其中的值。

(2)mtvec 寄存器的詳細格式,如下圖所示,其中的最低2 位是MODE 域,高30 位是BASE 域。(32位架構下,XLEN為32;64位架構下,XLEN為64。)
在這里插入圖片描述

  • 假設MODE 的值為0,則所有的異常響應時,處理器均跳轉到BASE 值指示的PC 地址。
  • 假設MODE 的值為1,則狹義的異常發生時,處理器跳轉到BASE 值指示的PC 地址;狹義的中斷發生時,處理器跳轉到BASE+4*CAUSE 值指示的PC 地址。CAUSE的值,表示中斷對應的異常編號(Exception Code),如下圖所示(Machine cause register (mcause) values)。譬如機器計時器中斷(Machine Timer Interrupt)的異常編號為7,則其跳轉的地址為BASE+4×7=BASE+28= BASE+0x1c。

1.2 更新CSR 寄存器mcause

RISC-V 架構規定,在進入異常時,機器模式異常原因寄存器mcause(Machine Cause Register)被同時更新,以反映當前的異常種類,軟件可以通過讀此寄存器,查詢造成異常的具體原因。

mcause 寄存器的詳細格式,如下圖所示,其中最高1 位為Interrupt 域,低31 位為異常編號域。
在這里插入圖片描述
此兩個域的組合表示值,如下圖所示,用于指示RISC-V 架構定義的12 種中斷類型和16 種異常類型。 在這里插入圖片描述

1.3 更新CSR 寄存器mepc

RISC-V 架構定義,異常的返回地址由機器模式異常PC 寄存器mepc(Machine Exception Program Counter)保存。
在這里插入圖片描述
在進入異常時,硬件將自動更新mepc 寄存器的值,為當前遇到異常的指令PC 值(即當前程序的停止執行點)。該寄存器將作為異常的返回地址,在異常結束之后,能夠使用它保存的PC 值,回到之前被停止執行的程序點。

(1)值得注意的是,雖然mepc 寄存器會在異常發生時,自動被硬件更新,但是mepc 寄存器,本身也是一個可讀可寫的寄存器,因此軟件也可以直接寫該寄存器以修改其值。

(2)對于狹義的中斷和狹義的異常而言,RISC-V 架構定義其返回地址(更新的mepc 值)有些細微差別:

  • 出現中斷時,中斷返回地址mepc 的值,被更新為下一條尚未執行的指令
  • 出現異常時,中斷返回地址mepc 的值,被更新為當前發生異常的指令PC

注意:
如果異常由ecall 或ebreak 產生,由于mepc 的值被更新為ecall 或ebreak 指令自己的PC。因此在異常返回時,如果直接使用mepc 保存的PC值作為返回地址,則會再次跳回ecall 或者ebreak指令,從而造成死循環(執行ecall 或者ebreak 指令導致重新進入異常)。正確的做法是,在異常處理程序中,軟件改變mepc指向下一條指令,由于現在ecall/ebreak(或c.ebreak)是4(或2)字節指令,因此改寫設定 mepc=mepc+4(或+2) 即可。

1.4 更新CSR 寄存器mtval

在這里插入圖片描述
RISC-V 架構規定,在進入異常時,硬件將自動更新機器模式異常值寄存器mtval(Machine Trap Value Register ),以反映引起當前異常的存儲器訪問地址或者指令編碼。

  • 如果是由存儲器訪問造成的異常,譬如遭遇硬件斷點、取指令、存儲器讀寫造成的異常,則將存儲器訪問的地址,更新到mtval 寄存器中。
  • 如果是由非法指令造成的異常,則將該指令的指令編碼,更新到mtval 寄存器中。

注意:mtval 寄存器,又名mbadaddr 寄存器,在某些早期版本的RISC-V 編譯器中僅識別mbadaddr 名稱。

1.5 更新CSR 寄存器mstatus

RISC-V 架構規定,在進入異常時,硬件將自動更新機器模式狀態寄存器mstatus(Machine Status Register)的某些域。
在這里插入圖片描述
(1)mstatus 寄存器的詳細格式,如上圖所示,其中的MIE 域,表示在Machine Mode 下中斷全局使能。

  • 當該MIE 域的值為1 時,表示Machine Mode 下所有中斷的全局打開。
  • 當該MIE 域的值為0 時,表示Machine Mode 下所有中斷的全局關閉。

(2)RISC-V 架構規定,異常發生時有如下情況。

  • MPIE 域的值,被更新為異常發生前MIE 域的值。MPIE 域的作用,是在異常結束之后,能夠使用MPIE 的值,恢復出異常發生之前的MIE 值。
  • MIE 的值,則被更新成為0(意味著進入異常服務程序后,中斷被全局關閉,所有的中斷都將被屏蔽不響應)。也就是說,RISC-V架構默認不支持中斷嵌套。
  • MPP 的值,被更新為異常發生前的模式。MPP 域的作用,是在異常結束之后,能夠使用MPP 的值,恢復出異常發生之前的工作模式。對于只支持機器模式(Machine Mode Only)的處理器核,則MPP 的值永遠為二進制值11。

注意:由于為簡化知識模型,在此僅介紹“只支持機器模式”的架構,因此對SIE、UIE、SPP、SPIE 等不做贅述。

2 退出異常

當程序完成異常處理之后,最終需要從異常服務程序中退出,并返回主程序。RISC-V架構定義了一組專門的退出異常指令(Trap-Return Instructions),包括MRET、SRET、和URET。

  • 其中MRET 指令是必備的;
  • 而SRET 和URET 指令,僅在支持監督模式和用戶模式的處理器中使用。

注意:由于為簡化知識模型,在此僅介紹“只支持機器模式”的架構,對SRET 和URET 指令不做贅述。

在機器模式下,退出異常時,軟件必須使用MRET 指令。
RISC-V 架構規定,處理器執行MRET 指令后的硬件行為,如下:

  • 停止執行當前程序流,轉而從CSR 寄存器mepc 定義的PC 地址開始執行。
  • 執行MRET 指令,不僅會讓處理器跳轉到上述的PC 地址開始執行,還會讓硬件同時更新CSR 寄存器機器模式狀態寄存器mstatus(Machine Status Register)。

下文將分別予以詳述。

2.1 從mepc 定義的PC 地址開始執行

在上文中曾經提及,在進入異常時,mepc 寄存器被同時更新,以反映當時遇到異常的指令的PC 值。通過這個機制,意味著MRET 指令執行后,處理器回到了當時遇到異常的指令的PC 地址,從而可以繼續執行之前被中止的程序流。

2.2 更新CSR 寄存器mstatus

mstatus 寄存器的詳細格式,如上圖所示。RISC-V 架構規定,在執行MRET 指令后,硬件將自動更新機器模式狀態寄存器mstatus(Machine Status Register)的某些域。

RISC-V 架構規定,執行MRET 指令退出異常時有如下情況:

  • mstatus 寄存器MIE 域的值,被更新為當前MPIE 的值(恢復)。
  • mstatus 寄存器MPIE 域的值,則被更新為1。

在上文中曾提及,在進入異常時,MPIE 的值曾經被更新為異常發生前的MIE 值。而MRET 指令執行后,再次將MIE 域的值更新為MPIE 的值。通過這個機制,則意味著MRET指令執行后,處理器的MIE 值被恢復成異常發生之前的值(假設之前的MIE 值為1,則意味著中斷被重新全局打開)。

3 異常服務程序

如上文中所述,當處理器進入異常后,即開始從mtvec 寄存器定義的PC 地址執行新的程序。該程序通常為異常服務程序,并且程序還可以通過查詢mcause 中的異常編號(Exception Code)決定進一步跳轉到更具體的異常服務程序。

譬如當程序查詢mcause 中的值為0x2,則得知該異常,是非法指令錯誤(Illegal Instructions)引起的,因此可以進一步跳轉到,非法指令錯誤異常服務子程序中去。

下圖所示為一異常入口程序實例片段,程序通過讀取mcause 的值,進而判斷異常的類型,從而進入不同的異常服務子程序。
在這里插入圖片描述

注意:
由于RISC-V 架構規定的進入異常和退出異常機制中沒有硬件自動保存和恢復上下文的操作,因此需要軟件明確地使用指令進行上下文的保存和恢復。


參考文檔:

  • 《手把手教你設計CPU.RISC-V處理器》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713353.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713353.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713353.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Tombstone 分析

1.什么是tombstone Tombstone是指在分布式系統中用于標記數據已被刪除的記錄,通常包含刪除操作的時間戳和相關信息。 當一個動態庫(native程序)開始執行時,系統會注冊一些連接到 debuggerd 的signal handlers。當系統發生崩潰時…

wpa_supplicant與用戶態程序的交互分析

1 wpa_supplicant與用戶態程序wpa_cli的交互過程 1.1 交互接口類型 wpa_supplicant與用戶態程序交互的主要接口包括以下幾種: 1)命令行界面:通過命令行工具 wpa_cli 可以與 wpa_supplicant 進行交互。wpa_cli 允許用戶執行各種 wpa_suppli…

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在沒有 ESS(External Shuffle Service)情況,并且開啟 Dynamic Allocation 的重要功能。如在 K8S 上運行 spark 沒有 ESS。本文檔所有的前提都是基于以上條件的。 如果開啟了 ESS,那么 Executor 計算完后&a…

MySQL 表的基本操作,結合項目的表自動初始化來講

有了數據庫以后,我們就可以在數據庫中對表進行增刪改查了,這也就意味著,一名真正的 CRUD Boy 即將到來(😁)。 查表 查看當前數據庫中所有的表,使用 show tables; 命令 由于當前數據庫中還沒有…

基于Python3的數據結構與算法 - 09 希爾排序

一、引入 希爾排序是一種分組插入排序的算法。 二、排序思路 首先取一個整數d1 n/2,將元素分為d1個組,每組相鄰量取元素距離為d1,在各組內直接進行插入排序;取第二個整數d2 d1/2, 重復上述分組排序過程&#xff0…

Angular 2 中的樣式綁定和 NgStyle

在 Angular 2 模板中綁定內聯樣式很容易。以下是一個綁定單個樣式值的示例&#xff1a; 你還可以指定單位&#xff0c;例如在這里我們將單位設置為 em&#xff0c;但也可以使用 px、% 或 rem&#xff1a; <p [style.font-size.em]"3">A paragraph at 3em! &l…

CSS 自測題 -- 用 flex 布局繪制骰子(一、二、三【含斜三點】、四、五、六點)

一點 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css flex布局-畫骰子</title><sty…

vue3 滾動條觸底監聽

問題&#xff1a;指定區域內&#xff0c;顯示返回的數據&#xff0c;要求先顯示20條&#xff0c;區域超出部分滾動顯示&#xff0c;對滾動條進行監聽&#xff0c;滾動條觸底后&#xff0c;繼續顯示下20條... 解決過程&#xff1a; 1.在區域的div上&#xff0c;添加scroll事件…

Unity 切換場景

場景切換前必須要將場景拖動到Build中 同步加載場景 using System.Collections; using System.Collections.Generic; //using UnityEditor.SearchService; using UnityEngine; // 場景管理 需要導入該類 using UnityEngine.SceneManagement;public class c3 : MonoBehaviour {…

redis五大基礎類型【重點】

之前寫過一點小知識&#xff1a;https://blog.csdn.net/qq_45927881/article/details/134959181?spm1001.2014.3001.5501 參考鏈接 https://xiaolincoding.com/redis/data_struct/command.html#%E4%BB%8B%E7%BB%8D 目錄 1. string&#xff08;字符串&#xff09;2. Hash&#…

MySql安全加固:配置不同用戶不同賬號禁止使用舊密碼禁止MySql進程管理員權限

MySql安全加固&#xff1a;配置不同用戶不同賬號&禁止使用舊密碼&禁止MySql進程管理員權限 1.1 檢查是否配置不同用戶不同賬號1.2 檢查是否禁止使用舊密碼1.3 禁止MySql進程管理員權限 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496…

【c++】通訊錄管理系統

1.系統功能介紹及展示 2.創建項目 3.菜單實現 4.退出功能實現 5.添加聯系人—結構體設計 6.添加聯系人—功能實現 7.顯示聯系人 8.刪除練習人—檢測聯系人是否存在 9.刪除聯系人—功能實現 10.查找聯系人 11.修改聯系人 12.清空通訊錄 #include <iostream> #include <…

什么是VR虛擬社區|VR元宇宙平臺|VR主題館加盟

VR虛擬社區是指一種基于虛擬現實技術構建的在線社交平臺或環境&#xff0c;用戶可以在其中創建虛擬化的個人形象&#xff08;也稱為avatars&#xff09;并與其他用戶進行交流、互動和合作。在VR虛擬社區中&#xff0c;用戶可以選擇不同的虛擬場景和環境&#xff0c;如虛擬公園、…

fly-barrage 前端彈幕庫(3):滾動彈幕的設計與實現

項目官網地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感覺項目還不錯的話&#xff0c;還請點下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…

顯示器開機正常,插入HDMI線卻不顯示畫面,換了HDMI線還是不行?

環境&#xff1a; 惠普/P24VG4 DELL筆記本 問題描述&#xff1a; 顯示器開機正常&#xff0c;插入HDMI線卻不顯示畫面&#xff0c;換了HDMI線還是不行&#xff0c;是不是顯示器壞了&#xff1f; 解決方案&#xff1a; 1.前往顯示器設置菜單里面查看input 2.把輸入源默認設…

二百二十五、海豚調度器——用DolphinScheduler調度執行Flume數據采集任務

一、目的 數倉的數據源是Kafka&#xff0c;因此離線數倉需要用Flume采集Kafka中的數據到HDFS中 在實際項目中&#xff0c;不可能一直在Xshell中啟動Flume任務&#xff0c;一是項目的Flume任務很多&#xff0c;二是一旦Xshell頁面關閉Flume任務就會停止&#xff0c;這樣非常不…

案例研究|DataEase助力眾陶聯應對產業鏈數據可視化挑戰

佛山眾陶聯供應鏈服務有限公司&#xff08;以下簡稱為“眾陶聯”&#xff09;成立于2016年&#xff0c;是由34家陶瓷企業共同創辦的建陶行業工業互聯網平臺&#xff0c;股東產值占整個行業的22.5%。眾陶聯以數據賦能為核心&#xff0c;積極探索新的交易和服務模式&#xff0c;構…

ant-design-vue如何限制圖片上傳的尺寸?

handleBeforeUpload(file, fileList) {// fileList 只包含了當次上傳的文件列表&#xff0c;不包含已上傳的文件列表// 所以長度要加上已上傳的文件列表的長度const isLimit this.fileList.length fileList.length > this.limit;const indexOfFile fileList.findIndex(it…

C++ STL 之容器 vector 常見用法

一. 什么是vector vector為“變長數組”&#xff0c;即長度根據需要而自動改變的數組。 頭文件&#xff1a; #include <vector>using namespace std;單獨定義一個vector&#xff1a;vector<typename> name&#xff0c;相當于一維數組 name[SIZE] &#xff0c;其長…

mac-docker-php容器連接mac中的pgsql數據庫失敗以及出現table_msg存錯誤時的解決方法

以php中的thinkphp 5.1為例&#xff0c;php容器連接mac中的pgsql數據庫失敗時&#xff0c;出現如下錯誤 [7] PDOException in Connection.php line 528 SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "localhost&…