RISC-V(發音為“RISC five”)的目標是成為一款通用的指令集架構(Instruction Set Architecture,ISA):
• 它要適合設計各種規模的處理器,包括從最小的嵌入式控制器到最快的高效能計算機。
• 它要相容各種流行的軟體棧和程式語言。
• 它要適用於所有實現技術,包括 FPGA(Field-Programmable Gate Array,現場可程式設計邏輯閘陣列)、ASIC(Application-Specific Integrated Circuit,專用積體電路)、全定製晶片,甚至未來的製造元件技術。
• 它能用於高效實現所有微體系結構,包括微程式或硬連線控制,順序、解耦或亂序流水線,單發射或超標量等。
• 它要支援高度定製化,成為定製加速器的基礎,以應對摩爾定律的放緩。
• 它要穩定,基礎 ISA 不會改變。更重要的是,它不能像以往的公司專有 ISA 那樣消亡,包括 AMD 的 Am29000、Digital 的 Alpha 和 VAX、Hewlett Packard1 的 PARISC、Intel 的 i860 和 i960、Motorola 的 88000,以及Zilog 的 Z8000。
RISC-V 是一款與眾不同的 ISA,不僅因為它年輕(它誕生於 2010 年,而其他 ISA 大多誕生於 20 世紀 70 年代或 80年代),而且因為它開放。與過去幾乎所有的架構不同,其未來不受任何一家公司的興衰或心血來潮的決策所影響(過去許多 ISA 因此消亡)。相反,RISC-V 屬於一個開放的、非營利性質的基金會。RISC-V 國際基金會的目標是維護 RISC-V 的穩定性,僅出於技術原因而緩慢謹慎地改進 RISC-V,並推動RISC-V 在硬體中流行起來,猶如 Linux 在作業系統中流行一般。圖 1.1 列出了 RISC-V 國際基金會最大的企業會員,展示了 RISC-V 的繁榮。
模組化ISA和增量型ISA
Intel 曾將其未來押在高階微處理器上,但這還需要很多年時間。為與 Zilog 公司抗衡,Intel 開發了一款名為8086 的過渡產品。它本該朝生暮死,無任何後續產品,但事實並非如此。高階處理器姍姍來遲,等它最終面世時,效能卻不如人意。因此,8086 架構得以延續——它演化為 32 位處理器,最終又演化為 64 位。其名稱不斷更替(80186、80286、i386、i486、Pentium),但底層指令集絲毫未減。 ——Stephen P. Morse,8086 架構師 (Morse, 2017)
計算機體系結構的傳統發展方式是增量型 ISA,這意味著新處理器不僅需要實現新的 ISA 擴充套件,還必須實現過去的所有擴充套件。其目的是保持向過去的二進位制相容性,使數十年前的二進位制程式仍可在最新處理器上正確執行。出於市場營銷的目的,新一代處理器的釋出通常伴隨著新指令的釋出。這兩點需求共同導致 ISA 的指令數量隨時間流逝而大幅增長。圖 1.2 展示了當今主流 ISA x86 的指令數量增長過程。x86 的歷史可追溯到 1978 年,在漫長的生命週期中,它每個月大約增加 3 條指令。
x86 在 1978 年誕生時有 80 條指令,2015 年增長到 1 338 條,翻了 16 倍,並且仍在增長。但圖中資料仍偏保守。一篇 2015 年的 Intel 部落格指出,統計結果為 3600條指令 (Rodgers et al. 2017)。按這個資料,在 1978 年到 2015 年期間,x86 指令平均每 4 天增長 1 條。我們統計的是組合語言指令,他們統計的也許是機器語言指令。增長的主要原因是 x86 ISA 透過 SIMD 指令實現資料級並行。
這種約定意味著 x86-32(我們用它表示 32 位地址版本的x86)的每款處理器都必須實現過去擴充套件的錯誤設計,即便它們已無意義。例如,圖 1.3 列出了 x86 的 aaa(ASCII Adjustafter Addition)指令,該指令早已失去用處。
它以二進位制編碼十進位制數(Binary Coded Decimal,BCD)的形式進行算術運算,但它已化為資訊科技的歷史塵埃。x86 還有 3 條類似的指令,分別用於減法(aas)、乘法(aam)和除法(aad)。它們都是單位元組指令,因此一共佔用寶貴操作碼空間的 1.6%(4/256)。
打個比方,假設一家餐館只提供價格固定的套餐,最開始只有漢堡加奶昔的小餐。隨著時間的推移,套餐中加入了薯條,然後是冰淇淋聖代,還有沙拉、餡餅、葡萄酒、素食義大利麵、牛排、啤酒,無窮無盡,最後變成饕餮盛宴。食客能在這家餐館找到他們過去吃過的任何一種食物(儘管這樣沒什麼意義)。然而,這對食客來說是一個壞訊息,他們每次的餐費將隨盛宴加量而不斷上漲。
除年輕和開放之外,RISC-V 還是模組化的,這與過去幾乎所有 ISA 都不同。其核心是一個名為 RV32I 的基礎 ISA,可執行完整的軟體棧。RV32I 已凍結,永不改變,這為編譯器開發者、作業系統開發者和組合語言程式設計師提供了穩定的指令目標。模組化特性源於可選的標準擴充套件,硬體可根據應用程式的需求決定是否包含它們。利用這種模組化特效能設計出面積小、能耗低的 RISC-V 處理器,這對於嵌入式應用至關重要。RISC-V 編譯器得知當前硬體包含哪些擴充套件後,便可為該硬體生成最優程式碼。一般約定將擴充套件對應的字母加到指令集名稱之後,以指示包含哪些擴充套件。例如,RV32IMFD 在必選基礎指令集(RV32I)上添加了乘法(RV32M)、單精度浮點(RV32F)和雙精度浮點(RV32D)擴充套件。如果軟體使用了一條未實現的可選 RISC-V 擴充套件指令,硬體將發生自陷,並在軟體層執行該指令的功能。此特性屬於標準庫的一部分。
繼續用我們剛才的比方,RISC-V 提供的是一份選單,而不是一頓應有盡有的自助餐。主廚只需烹飪食客需要的食物,而不是每次都烹飪一頓大餐,食客也只需為他們點單的食物付費。RISC-V 無須僅為市場營銷的熱鬧而新增新指令。RISC-V國際基金會決定何時往選單中新增新的選擇,經過由軟硬體專家組成的委員會公開討論後,他們才會出於必要的技術原因新增指令。即使這些新的選擇出現在選單上,它們仍是可選的,不像增量型 ISA 那樣成為未來所有實現的必要組成部分。
↑限時優惠↑
RISC-V 自 2010 年誕生以來迅速發展並普及。我們認為一本精巧的程式設計師指南將有助於推動它的發展,還能讓初學者理解 RISC-V 指令集具有吸引力的原因,並瞭解它與傳統指令集架構(ISA)的不同之處。
本書受到其他指令集架構書籍的啟發,但由於 RISC-V 自身非常簡潔,我們希望能寫得比 500 多頁的優秀書籍(如 See MIPS Run)更精巧。我們把篇幅控制在這些優秀書籍的 1/3,至少在這個意義上我們成功了。實際上,書中前 10 章介紹了模組化RISC-V 指令集的每個組成部分,總共只用了 136 頁,儘管平均每頁插入了一張圖片(共 97 張)。
闡釋指令集設計原則後,我們展示了 RISC-V 架構師如何從過去 40 年的指令集中吸取經驗教訓,取其精華,去其糟粕。要評價一款 ISA,既要究其所取,也要究其所舍。
隨後,我們透過一系列章節介紹這個模組化架構的每個組成部分。每章都包含一個 RISC-V 組合語言程式,以展示該章所述指令的用法,從而幫助組合語言程式設計師學習 RISC-V 程式碼。有時,我們還會用 ARM、MIPS 和 x86 列出同一個程式的程式碼,從而突出 RISC-V 的簡潔性,以及在成本、功耗、效能之間權衡的優勢。
為提升本書的趣味性,我們在頁邊加入約 50 段花絮,用於介紹關於正文內容的有趣評論。我們還充分利用頁邊的空間,在頁邊加入約 110 張圖片,用於強調好的 ISA設計示例。最後,我們為願意鑽研的讀者在全書中加入約 30 段補充說明。如果你對某個主題感興趣,可以深入研讀這些可選部分。略過此部分不會影響你對書中其他內容的理解,所以,如果你不感興趣,則可以放心跳過它們。我們為計算機體系結構愛好者援引約 30 篇論文和書籍,它們能夠開闊你的視野。在編寫本書的過程中,我們也從中獲益匪淺!
限時優惠,快快搶購吧!