- RISC-V體系結構編程與實踐(第2版)
- 笨叔
- 1601字
- 2024-09-23 17:55:57
本書約定
為了幫助讀者更好地閱讀本書、完成本書的實驗,我們對本書的術語、實驗環境做了一些約定。
1.RISC-V與RV64術語
目前RISC-V體系結構主要包括RV32以及RV64,即32位體系結構以及64位體系結構。本書重點介紹與RV64相關的內容。除了在寄存器位寬、地址映射模式等方面有區別,RV32和RV64還有其他方面的細微差異,不過本書不會詳細介紹它們之間的區別。要了解關于RV32的內容,請讀者自行閱讀RISC-V官方手冊。
RISC-V體系結構手冊使用哈特(Hart)來描述一個處理器硬件線程,這個術語類似于x86體系結構定義的超線中央程(Simultaneous Multi-Threading,SMT)以及ARMv8體系結構定義的處理機(Processing Element,PE)。不過截至2022年,還沒有商用的RISC-V處理器實現超線中央程技術,因此,本書對哈特和中央處理器(Central Processing Unit,CPU)這兩個概念不做嚴格區分,繼續沿用CPU這個通用的概念來描述一個處理器執行單元或者硬件線程(如果硬件實現了SMT)。
2.實現案例
本書基于Linux內核以及小型操作系統(BenOS)進行講解。Linux內核采用Linux 5.15。本書大部分實驗以BenOS為基礎,讀者可從最簡單的裸機程序不斷進行擴展,最終完成一個具有內存管理、進程調度、系統調用等基本功能的小型操作系統,從而學習和掌握RV64體系結構的相關知識。我們在實驗的設計過程中參考了Linux內核等開源代碼的實現,在此對開源社區表示感謝。
3.實驗環境
本書推薦的實驗環境如下。
● 主機硬件平臺:Intel x86-64處理器兼容主機。
● 主機操作系統:Ubuntu Linux 20.04[1]。
● GCC版本:9(riscv64-linux-gnu-gcc)。
● QEMU版本:4.2.1。
● GDB版本:gdb-multiarch。
[1]推薦讀者使用我們提供的VMware/VirtualBox鏡像。
讀者在安裝完Ubuntu Linux 20.04系統后,可通過如下命令安裝本書需要的軟件包。
$ sudo apt update -y
$ sudo apt install net-tools libncurses5-dev libssl-dev build-essential openssl qemu-
system-misc libncurses5-dev gcc-riscv64-linux-gnu git bison flex bc vim universal-
ctags cscope gdb-multiarch libsdl2-dev libreadline-dev
我們基于VMware/VirtualBox鏡像搭建了全套開發環境,讀者可以通過“奔跑吧Linux社區”微信公眾號獲取“全套開發環境”的下載地址。使用本書配套的VMware/VirtualBox鏡像可以減少配置開發環境帶來的麻煩。
4.實驗平臺
讀者無須額外購買開發板,推薦在如下兩個免費的模擬器實驗平臺上完成本書所有實驗。
● QEMU。
● 香山模擬器NEMU[2]。
[2]有部分實驗還沒在NEMU上實現,不過可以在QEMU上完成。
5.實驗參考代碼和配套資料下載
為了節省篇幅,本書大部分實驗只列出了實驗目的和實驗要求,希望讀者能獨立完成實驗。
在GitHub網站搜索“runninglinuxkernel/riscv_ programming_ practice”即可找到本書大部分實驗的參考代碼以及示例代碼。
本書有如下配套資料。
● 大部分實驗的參考代碼以及示例代碼。
● VMware/VirtualBox鏡像,內置了實驗環境。
● 免費教學視頻。
讀者可以通過關注微信公眾號“奔跑吧Linux社區”,輸入“risc-v”獲取配套資料的下載地址。
6.芯片資料
作者在編寫本書的過程中參考了RISC-V官方的技術資料以及與 GNU 工具鏈相關的文檔。下面是涉及的技術手冊,這些技術手冊都是公開發布的,讀者可以在RISC-V基金會官網、SiFive官網以及GNU官網上下載。
● The RISC-V Instruction Set Manual Volume I: Unprivileged ISA, Document Version 20191213:RISC-V指令集手冊。
● The RISC-V Instruction Set Manual Volume II: Privileged Architecture, Document Version 20211203:RISC-V體系結構手冊。
● SiFive FU740-C000 Manual, v1p6:SiFive公司的FU740處理器內核技術手冊。
● Using the GNU Compiler Collection, v9.3:GCC官方手冊。
● Using as, the GNU Assembler, v2.34:匯編器(AS)官方手冊。
● Using ld, the GNU Linker, v2.34:鏈接器(LD)官方手冊。
● RISC-V“V”Vector Extension, Version 1.0:RVV手冊。
● RISC-V Base Cache Management Operation ISA Extensions, Version 1.0:RISC-V高速緩存維護指令擴展手冊。
● RISC-V Platform-Level Interrupt Controller Specification, Version 1.0:PLIC手冊。
● RISC-V ABIs Specification, Version 0.01:RISC-V ABI接口手冊。
● RISC-V Supervisor Binary Interface Specification, Version 1.0.0:RISC-V SBI手冊。
● SiFive TileLink Specification, Version 1.8.1:TileLink總線手冊。
● 香山官方文檔:香山處理器手冊。
7.匯編代碼大小寫
RISC-V指令、寄存器的書寫方式約定如下。
● 關于RISC-V指令,在匯編代碼中用小寫,在正文中用大寫。
● 關于通用寄存器和系統寄存器,在匯編代碼和正文中都用小寫。若使用大寫形式書寫通用寄存器和系統寄存器,匯編器會報錯。
8.匯編代碼說明
在RISC-V匯編代碼中,本書有如下約定。
● (xn):直接尋址模式,表示以xn寄存器的值為基地址進行尋址,在本書中簡稱為xn地址,示例如下。
ld x2, (x1) //從x1地址中加載8字節數據到x2寄存器中
sd x2, (x1) //把x2寄存器的值存儲到x1地址中
● offset(xn):偏移尋址模式,表示以xn寄存器的值為基地址,然后偏移offset字節進行尋址。
ld x2, 8(x1) //從x1+8地址中加載8字節數據到x2寄存器中
sd x2, 8(x1) //把x2寄存器的值存儲到x1+8地址中
- Java程序設計與開發
- Getting Started with Gulp(Second Edition)
- Docker and Kubernetes for Java Developers
- Java異步編程實戰
- 工程軟件開發技術基礎
- Ceph Cookbook
- JavaScript:Functional Programming for JavaScript Developers
- Mastering Ubuntu Server
- Java程序設計:原理與范例
- .NET 3.5編程
- Mastering Web Application Development with AngularJS
- 鴻蒙OS應用編程實戰
- Nagios Core Administration Cookbook(Second Edition)
- 小程序從0到1:微信全棧工程師一本通
- PyQt編程快速上手