RISC-V詳細介紹

寫在前面

本文主要基於RISC-V中文手冊,其中包括但不限於一些網絡的資料。本文版權屬於skywf,轉載或借用請聯繫作者。

什麼是RISC-V

RISC-V(發音爲“risk-five”)是一個基於精簡指令集(RISC)原則的開源指令集架構(ISA)。
與大多數指令集相比,RISC-V指令集可以自由地用於任何目的,允許任何人設計、製造和銷售RISC-V芯片和軟件。雖然這不是第一個開源指令集,但它具有重要意義,因爲其設計使其適用於現代計算設備(如倉庫規模雲計算機、高端移動電話和微小嵌入式系統)。設計者考慮到了這些用途中的性能與功率效率。該指令集還具有衆多支持的軟件,這解決了新指令集通常的弱點。
該項目2010年始於加州大學伯克利分校,但許多貢獻者是該大學以外的志願者和行業工作者。
RISC-V指令集的設計考慮了小型、快速、低功耗的現實情況來實做,但並沒有對特定的微架構做過度的設計。

簡而言之,RISC-V是一個ISA

RISC-V誕生的背景

ISA霸權

微處理器的開放指令集有望重塑計算,並引入新的、更強大的功能。

現代計算機依靠許多元件來提供高速和高性能,但是很少有比一臺精簡的指令集計算機(通常稱爲RISC)發揮更大作用的了。儘管指令集體系結構(ISA)具有不同的形狀和形式-並且它支持多種系統和設備-但存在一個共同點,與複合指令集計算機(CISC)相比,RISC允許微處理器以更少的每指令週期(CPI)運行。

當然,ISA是計算的核心。加州大學伯克利分校計算機科學教授、ACM A.M.圖靈獎獲得者戴夫·帕特森(Dave Patterson)說:“這是允許硬件和軟件進行通信的基本詞彙,他差不多算是創造了這個術語,並開發了早期的RISC計算模型。在過去的幾十年裏,英特爾和ARM這兩大實體基本上控制了ISA。他們的專利微處理器可以從筆記本電腦到雲服務器,從智能手機到物聯網(IoT)設備的所有設備運行。如今,很難找到沒有英特爾或ARM處理器的計算設備。

摩爾定律的窮途末路

RISC-V的推出與半導體行業的其他重大變化不謀而合。CMOS晶體管的縮放速度正在放緩,這已不是祕密。即使最近在設計上取得了突破,將密度和性能提升到了新的水平,戈登·摩爾(Gordon Moore)關於每兩年將晶體管倍增的長期預測——“摩爾定律”(Moore’s Law)也不再成立。隨着半導體進展緩慢,而性能需求持續增長,設計更先進的計算設備和燃料創新的能力受到威脅。Patterson解釋說:“向前看,邏輯路徑是爲應用領域的微處理器上的基本指令集添加擴展。”。

RISC-V的吸引力是不可否認的。一個通用的ISA意味着ISA的不同實現和用例可以利用相同的核心軟件堆棧,從而最小化移植到編譯器、操作系統和其他軟件的工作。RISC- v的主要優點不是它是RISC的一個新的變種或迭代,而是它是一個開放的ISA。因此,人們期望該模型將產生將RISC-V置於商業地圖上所需的軟件堆棧。然而,與此同時,也有一種擔憂,即給用戶改變ISA的能力將導致RISC-V軟件生態系統的分裂。

窮困潦倒的學者

Asanovíc和Patterson於2010年開始在伯克利的並行計算實驗室(Par Lab)研究第五代RISC指令集。該項目的誕生源於對專有ISA缺乏靈活性的失望。Patterson回憶說:“我們無法做一些我們想做的重新搜索。兩人瞄準了一個長期存在的行業問題:無法爲特定目的定製芯片。這項倡議是基於他們自己的需要。“由於我們無法獲得英特爾或ARM使用或修改其專有指令集的許可,我們決定爲自己的研究開發自己的指令集,並幫助其他學者的研究。”

不斷增長的指令數量

在這裏插入圖片描述

RISC-V架構設計思想

如何設計一個好的ISA

在介紹 RISC-V 這個 ISA 之前,瞭解計算機架構師在設計 ISA 時的基本原則和必須做 出的權衡是有用的。如下的列表列出了七種衡量標準。頁邊放置了對應的七個圖標,以突 出顯示 RISC-V 在隨後章節中應對它們的實例。(印刷版的封底有所有圖標的圖例。)
⚫ 成本(美元硬幣)
⚫ 簡潔性(輪子)
⚫ 性能(速度計)
⚫ 架構和具體實現的分離(分開的兩個半圓)
⚫ 提升空間(手風琴)
⚫ 程序大小(相對的壓迫着一條線的兩個箭頭)
⚫ 易於編程/編譯/鏈接(兒童積木“像 ABC 一樣簡單”)

RISC-V的不同尋常之處,除了在於它是最近誕生的和開源的以外,還在於:和幾乎所 有以往的ISA不同,它是模塊化的。它的核心是一個名爲RV32I的基礎ISA,運行一個完整 的軟件棧。RV32I是固定的,永遠不會改變。這爲編譯器編寫者,操作系統開發人員和匯 編語言程序員提供了穩定的目標。模塊化來源於可選的標準擴展,根據應用程序的需要, 硬件可以包含或不包含這些擴展。這種模塊化特性使得RISC-V具有了袖珍化、低能耗的特 點,而這對於嵌入式應用可能至關重要。RISC-V編譯器得知當前硬件包含哪些擴展後,便 可以生成當前硬件條件下的最佳代碼。慣例是把代表擴展的字母附加到指令集名稱之後作 爲指示。例如,RV32IMFD將乘法(RV32M),單精度浮點(RV32F)和雙精度浮點 (RV32D)的擴展添加到了基礎指令集(RV32I)中。

RISC-V之RV32I

RV32I 基礎指令集的一頁圖形表示。對於每幅圖,將有下劃線的字母從左到 右連接起來,即可組成完整的 RV32I 指令集。對於每一個圖,集合標誌{}內列舉了指令的 所有變體,變體用加下劃線的字母或下劃線字符_表示。特別的,下劃線字符_表示對於此 指令變體不需用字符表示。例如,下圖表示了這四個 RV32I 指令:slt,slti,sltu,sltiu:
在這裏插入圖片描述

四個典型特點

首先,指令只有六種格式,並且所有的指令都是 32 位長,這簡化了指令解碼。ARM-32, 還有更典型的 x86-32 都有許多不同的指令格式,使得解碼部件在低端實現中偏昂貴,在中 高端處理器設計中容易帶來性能挑戰。
第二,RISC-V 指令提供三個寄存器操作數,而不是 像 x86-32 一樣,讓源操作數和目的操作數共享一個字段。當一個操作天然就需要有三個不 同的操作數,但是 ISA 只提供了兩個操作數時,編譯器或者彙編程序程序員就需要多使用 一條 move(搬運)指令,來保存目的寄存器的值。
第三,在 RISC-V 中對於所有指令,要 讀寫的寄存器的標識符總是在同一位置,意味着在解碼指令之前,就可以先開始訪問寄存 器。在許多其他的 ISA 中,某些指令字段在部分指令中被重用作爲源目的地,在其他指令 中又被作爲目的操作數(例如,ARM-32 和 MIPS-32)。因此,爲了取出正確的指令字 段,我們需要時序本就可能緊張的解碼路徑上添加額外的解碼邏輯,使得解碼路徑的時序 更爲緊張。
第四,這些格式的立即數字段總是符號擴展,符號位總是在指令中最高位。這 意味着可能成爲關鍵路徑的立即數符號擴展,可以在指令解碼之前進行。

下圖顯示了六種基本指令格式,分別是:用於寄存器-寄存器操作的 R 類型指令,用 於短立即數和訪存 load 操作的 I 型指令,用於訪存 store 操作的 S 型指令,用於條件跳轉操 作的 B 類型指令,用於長立即數的 U 型指令和用於無條件跳轉的 J 型指令。
在這裏插入圖片描述
解釋說明:四種基礎指令格式 R/I/S/U

imm:立即數

rs1:源寄存器1

rs2:源寄存器2

rd:目標寄存器

opcode:操作碼

在這裏插入圖片描述

RISC-V之乘除法指令

指令格式

RV32M 具有有符號和無符號整數的除法指令:divide(div)和 divide unsigned(divu),它們將 商放入目標寄存器。在少數情況下,程序員需要餘數而不是商,因此 RV32M 提供 remainder(rem)和 remainder unsigned(remu),它們在目標寄存器寫入餘數,而不是商。
在這裏插入圖片描述爲了正確地得到一個有符號或無符號的 64 位積,RISC-V 中帶有四個乘 法指令。要得到整數 32 位乘積(64 位中的低 32 位)就用 mul 指令。要得到高 32 位,如果 操作數都是有符號數,就用 mulh 指令;如果操作數都是無符號數,就用 mulhu 指令;如 果一個有符號一個無符號,可以用 mulhsu 指令。在一條指令中完成把 64 位積寫入兩個 32 位寄存器的操作會使硬件設計變得複雜,所以 RV32M 需要兩條乘法指令才能得到一個完整 的 64 位積。

用乘法代替常數除法

對許多微處理器來說,整數除法是相對較慢的操作。如前述,除數爲 2 的冪次的無符號 除法可以用右移來代替。事實證明,通過乘以近似倒數再修正積的高 32 位的方法,可以優 化除數爲其它數的除法。例如,圖 4.3 顯示了 3 爲除數的無符號除法的代碼。
在這裏插入圖片描述

  1. 先把數裝到t0裏面
  2. addi是立即數與寄存器的數相加, t0-1365放回t0
  3. a0和t0相乘(無符號)
  4. 立即數→移,也就是a1右移1位

也就是說從數值上來講,可以通過乘法代替常數除法

RISC-V之RV64

儘管 RV64I 有 64 位地址且默認數據大小爲 64 位,32 位字仍然是程序中的有效數據類 型。因此,RV64I 需要支持字,就像 RV32I 需要支持字節和半字一樣。更具體地說,由於寄 存器現在是 64 位寬,RV64I 添加字版本的加法和減法指令:addw,addiw,subw。這些指 令將計算結果截斷爲 32 位,結果符號擴展後再寫入目標寄存器。 RV64I 也包括字版本的移 位指令(sllw,slliw,srlw,srliw,sraw,sraiw),以獲得 32 位移位結果而不是 64 位移 位結果。要進行 64 位數據傳輸,RV64 提供了加載和存儲雙字指令:ld,sd。最後,就像 RV32I 中有無符號版本的加載單字節和加載半字的指令,RV64I 也有一個無符號版本的加載 字:lwu。 出於類似的原因,RV64 需要添加字版本的乘法,除法和取餘指令:mulw,divw,divuw, remw,remuw。爲了支持對單字及雙字的同步操作,RV64A 爲其所有的 11 條指令都添加 了雙字版本。

由於版本衆多,這裏只選擇有代表性的來了解
在這裏插入圖片描述RV64F 和 RV64D 添加了整數雙字轉換指令,並稱它們爲長整數,以避免與雙精度浮點 數據混淆:fcvt.l.s,fcvt.l.d,fcvt.lu.s,fcvt.lu.d,fcvt.s.l,fcvt.s.lu,fcvt.d.l,fcvt.d.lu. 由於整數 x 寄存器現在是 64 位寬,它們現在可以保存雙精度浮點數據,因此 RV64D 增加了 兩個浮點指令:fmv.x.w 和 fmv.w.x.

這裏暫時不講解壓縮指令

RISC-V的特權架構

到目前爲止,本書主要關注 RISC-V 對通用計算的支持:我們引入的所有指令都在用 戶模式(應用程序的代碼在此模式下運行)下可用。本章介紹兩種新的權限模式:運行最 可信的代碼的機器模式(machine mode),以及爲 Linux,FreeBSD 和 Windows 等操作系統 提供支持的監管者模式(supervisor mode)。這兩種新模式都比用和模式有着更高的權限, 這也是本章標題的來源。有更多權限的模式通常可以使用權限較低的模式的所用功能,並 且它們還有一些低權限模式下不可用的額外功能,例如處理中斷和執行 I/O 的功能。處理 器通常大部分時間都運行在權限最低的模式下,處理中斷和異常時會將控制權移交到更高 權限的模式。 嵌入式系統運行時(runtime)和操作系統用這些新模式的功能來響應外部事件,如網 絡數據包的到達;支持多任務處理和任務間保護;抽象和虛擬化硬件功能等。鑑於這些主 題的廣度,爲此而編撰的全面的程序員指南會是另外一本完整的書。但我們的這一章節旨 在強調 RISC-V 這部分功能的亮點。

機器模式

機器模式(縮寫爲 M 模式,M-mode)是 RISC-V 中 hart(hardware thread,硬件線 程)可以執行的最高權限模式。在 M 模式下運行的 hart 對內存,I/O 和一些對於啓動和配 置系統來說必要的底層功能有着完全的使用權。因此它是唯一所有標準 RISC-V 處理器都 必須實現的權限模式。實際上簡單的 RISC-V 微控制器僅支持 M 模式。這類系統是本節的 重點。
機器模式最重要的特性是攔截和處理異常(不尋常的運行時事件)的能力。RISC-V 將 異常分爲兩類。
一類是同步異常,這類異常在指令執行期間產生,如訪問了無效的存儲器 地址或執行了具有無效操作碼的指令時。
另一類是中斷,它是與指令流異步的外部事件, 比如鼠標的單擊。RISC-V 中實現精確例外:保證異常之前的所有指令都完整地執行了,而 後續的指令都沒有開始執行(或等同於沒有執行)。
圖 10.3 列出了觸發標準例外的原因。
在 M 模式運行期間可能發生的同步例外有五種:
⚫ 訪問錯誤異常 當物理內存的地址不支持訪問類型時發生(例如嘗試寫入 ROM)。
⚫ 斷點異常 在執行 ebreak 指令,或者地址或數據與調試觸發器匹配時發生。 ⚫ 環境調用異常 在執行 ecall 指令時發生。
⚫ 非法指令異常 在譯碼階段發現無效操作碼時發生。
⚫ 非對齊地址異常 在有效地址不能被訪問大小整除時發生,例如地址爲 0x12 的 amoadd.w

有三種標準的中斷源:軟件、時鐘和外部來源。軟件中斷通過向內存映射寄存器中存 數來觸發,並通常用於由一個 hart 中斷另一個 hart(在其他架構中稱爲處理器間中斷機 制)。當實時計數器 mtime 大於 hart 的時間比較器(一個名爲 mtimecmp 的內存映射寄存 器)時,會觸發時鐘中斷。外部中斷由平臺級中斷控制器(大多數外部設備連接到這個中 斷控制器)引發。

監管者模式

更復雜的 RISC-V 處理器用和幾乎所有通用架構相同的方式處理這些問題:使用基於 頁面的虛擬內存。這個功能構成了監管者模式(S 模式)的核心,這是一種可選的權限模 式,旨在支持現代類 Unix 操作系統,如 Linux,FreeBSD 和 Windows。S 模式比 U 模式權 限更高,但比 M 模式低。與 U 模式一樣,S 模式下運行的軟件不能使用 M 模式的 CSR 和 指令,並且受到 PMP 的限制。本屆介紹 S 模式的中斷和異常,下一節將詳細介紹 S 模式 下的虛擬內存系統。 默認情況下,發生所有異常(不論在什麼權限模式下)的時候,控制權都會被移交到 M 模式的異常處理程序。但是 Unix 系統中的大多數例外都應該進行 S 模式下的系統調 用。M 模式的異常處理程序可以將異常重新導向 S 模式,但這些額外的操作會減慢大多數 異常的處理速度。因此,RISC-V 提供了一種異常委託機制。通過該機制可以選擇性地將中 斷和同步異常交給 S 模式處理,而完全繞過 M 模式。

S 模式提供了一種傳統的虛擬內存系統,它將內存劃分爲固定大小的頁來進行地址轉 換和對內存內容的保護。啓用分頁的時候,大多數地址(包括 load 和 store 的有效地址和 PC 中的地址)都是虛擬地址。要訪問物理內存,它們必須被轉換爲真正的物理地址,這通 過遍歷一種稱爲頁表的高基數樹實現。頁表中的葉節點指示虛地址是否已經被映射到了真 正的物理頁面,如果是,則指示了哪些權限模式和通過哪種類型的訪問可以操作這個頁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章