技术教育社区
www.teccses.org

RISC-V体系结构编程与实践

封面

作者:奔跑吧Linux社区

页数:440

出版社:人民邮电出版社

出版日期:2023

ISBN:9787115603609

电子书格式:pdf/epub/txt

内容简介

RISC-V体系结构基础知识以及香山处理器微架构实现;

RISC-V实验环境的搭建;

RISC-V指令集中常用指令、RISC-V函数的调用规范与栈;

GNU汇编器、链接器、链接脚本和GCC内嵌汇编代码。

RISC-V体系结构中的中断和异常处理;

RISC-V体系结构中的内存管理、高速缓存、缓存一致性;

RISC-V体系结构中的TLB管理、原子操作和内存屏障指令;

RSIC-V体系结构中的压缩指令扩展;

RISC-V体系结构中的虚拟化扩展;

RISC-V体系结构中的可伸缩矢量指令扩展。

作者简介

奔跑吧Linux社区 由一群热爱开源的工程师组成,致力于开源硬件和开源软件的推广。

审校者简介

香山处理器团队

面向世界的体系结构创新开源平台,目前已形成由多家企业组成的香山联合开发团队。其中,香山处理器是由中国科学院计算技术□□□发起的开源高性能RISC-V处理器核项目。

龙蜥社区RISC-V SIG

坚持开放、开源,致力于龙蜥社区以及 RISCV 软硬件生态的共建和推广。

进迭时空

专注研发新一代高性能RISC-V处理器和计算系统,让开发者基于RISC-V芯片更自由地开发更有创意的新应用。

本书特色

一本书带你了解谷歌、苹果等科技巨头看好的RISC-V体系结构

1.一线芯片公司工程师撰写,系统介绍RISC-V体系结构,总结常见陷阱以及项目经验

2.图文并茂,用通俗易懂的语言讲述RISC-V体系结构中的疑难点

3.充实理论+有趣实验,助力读者快速掌握RISC-V体系结构

4.实用丰富的配套资源,随书赠送参考代码、实验环境和免费视频讲解

目录

第 1章 RISC-V体系结构基础知识 1

1.1 RISC-V介绍 1

1.1.1 RISC-V指令集优点 1

1.1.2 RISC-V指令集扩展 2

1.1.3 RISC-V商业化发展 2

1.2 RISC-V体系结构介绍 3

1.2.1 RISC-V体系结构 3

1.2.2 采用RISC-V体系结构的常见处理器 3

1.2.3 RISC-V体系结构中的基本概念 4

1.2.4 SBI服务 5

1.3 RISC-V寄存器 6

1.3.1 通用寄存器 6

1.3.2 系统寄存器 7

1.3.3 U模式下的系统寄存器 8

1.3.4 S模式下的系统寄存器 9

1.3.5 M模式下的系统寄存器 11

1.4 香山处理器介绍 15

1.4.1 香山处理器体系结构 15

1.4.2 香山处理器的前端子系统 16

1.4.3 香山处理器的后端子系统 18

1.4.4 香山处理器的访存子系统 20

1.4.5 香山处理器的L2/L3高速缓存 25

第 2章 搭建RISC-V实验环境 29

2.1 实验平台 29

2.1.1 QEMU 29

2.1.2 NEMU 30

2.2 搭建实验环境 31

2.2.1 实验2-1:输出“Welcome RISC-V!” 31

2.2.2 实验2-2:单步调试BenOS和MySBI 32

2.3 BenOS和MySBI基础实验代码解析 34

2.3.1 MySBI基础代码分析 34

2.3.2 BenOS基础代码分析 37

2.3.3 合并BenOS和MySBI 41

2.4 QEMU + RISC-V + Linux实验平台 41

第3章 基础指令集 44

3.1 RISC-V指令集介绍 44

3.2 RISC-V指令编码格式 45

3.3 加载与存储指令 46

3.4 PC相对寻址 49

3.5 移位操作 53

3.6 位操作指令 55

3.7 算术指令 56

3.8 比较指令 57

3.9 无条件跳转指令 58

3.10 条件跳转指令 59

3.11 CSR指令 61

3.12 寻址范围 62

3.13 陷阱:为什么ret之后就进入死循环 62

3.14 实验 64

3.14.1 实验3-1:熟悉加载指令 64

3.14.2 实验3-2:PC相对地址寻址 64

3.14.3 实验3-3:memcpy()函数的实现 65

3.14.4 实验3-4:memset()函数的实现 65

3.14.5 实验3-5:条件跳转指令1 65

3.14.6 实验3-6:条件跳转指令2 66

3.14.7 实验3-7:子函数跳转 66

3.14.8 实验3-8:在汇编中实现串口输出功能 66

第4章 函数调用规范与栈 67

4.1 函数调用规范 67

4.2 入栈与出栈 70

4.3 RISC-V栈的布□ 72

4.3.1 不使用FP的栈布□ 72

4.3.2 使用FP的栈布□ 74

4.3.3 栈回溯 76

4.4 实验 78

4.4.1 实验4-1:观察栈布□ 78

4.4.2 实验4-2:观察栈回溯 78

第5章 GNU汇编器 79

5.1 编译流程与ELF文件 79

5.2 一个简单的汇编程序 82

5.3 汇编语法 84

5.3.1 注释 84

5.3.2 符号 84

5.4 常用的伪指令 85

5.4.1 对齐伪指令 85

5.4.2 数据定义伪指令 86

5.4.3 与函数相关的伪指令 87

5.4.4 与段相关的伪指令 87

5.4.5 与宏相关的伪指令 89

5.4.6 与文件相关的伪指令 91

5.5 RISC-V依赖特性 91

5.5.1 RISC-V特有的命令行选项 91

5.5.2 RISC-V特有的伪指令 92

5.6 实验 92

5.6.1 实验5-1:汇编语言练习—查找□□数 92

5.6.2 实验5-2:汇编语言练习—通过C语言调用汇编函数 92

5.6.3 实验5-3:汇编语言练习—通过汇编语言调用C函数 92

5.6.4 实验5-4:使用汇编伪操作实现一张表 92

5.6.5 实验5-5:汇编宏的使用 93

第6章 链接器与链接脚本 94

6.1 链接器 94

6.2 链接脚本 95

6.2.1 一个简单的链接程序 95

6.2.2 设置入口点 96

6.2.3 基本概念 97

6.2.4 符号赋值与引用 97

6.2.5 当前位置计数器 98

6.2.6 SECTIONS命令 99

6.2.7 常用的内置函数 101

6.3 加载重定位 103

6.3.1 BenOS重定位 103

6.3.2 OpenSBI和Linux内核重定位 105

6.4 链接重定位与链接器松弛优化 108

6.4.1 链接重定位 108

6.4.2 函数跳转优化 112

6.4.3 符号地址访问优化 114

6.5 实验 116

6.5.1 实验6-1:分析链接脚本 116

6.5.2 实验6-2:输出每个段的内存布□ 116

6.5.3 实验6-3:加载地址不等于运行地址 117

6.5.4 实验6-4:设置链接地址 117

6.5.5 实验6-5:链接器松弛优化1 117

6.5.6 实验6-6:链接器松弛优化2 117

6.5.7 实验6-7:分析Linux 5.15内核的链接脚本 117

第7章 内嵌汇编代码 118

7.1 内嵌汇编代码基本用法 118

7.2 案例分析 124

7.3 注意事项 128

7.4 实验 128

第8章 异常处理 130

8.1 异常处理基本概念 130

8.2 与M模式相关的异常寄存器 133

8.3 与S模式相关的异常寄存器 137

8.4 异常上下文 139

8.5 案例分析8-1:实现SBI系统调用 142

8.6 案例分析8-2:BenOS的异常处理 148

8.7 实验 154

第9章 中断处理与中断控制器 156

9.1 中断处理基本概念 156

9.2 CLINT 159

9.3 案例分析9-1:定时器中断 160

9.4 PLIC 164

9.5 案例分析9-2:串口中断 167

9.6 实验 171

第 10章 内存管理 172

10.1 内存管理基础知识 172

10.2 RISC-V内存管理 178

10.3 物理内存属性与物理内存保护 187

10.4 案例分析10-1:在BenOS里实现恒等映射 190

10.5 内存管理实验 204

第 11章 高速缓存 207

11.1 为什么需要高速缓存 207

11.2 高速缓存的访问延时 208

11.3 高速缓存的工作原理 210

11.4 高速缓存的映射方式 212

11.5 虚拟高速缓存与物理高速缓存 215

11.6 重名和同名问题 216

11.7 高速缓存策略 220

11.8 高速缓存的维护指令 221

第 12章 缓存一致性 224

12.1 为什么需要缓存一致性 224

12.2 缓存一致性的分类 225

12.3 缓存一致性的解决方案 227

12.4 MESI协议 228

12.5 高速缓存伪共享 237

12.6 两种缓存一致性控制器 239

12.7 案例分析12-1:伪共享的避免 241

12.8 案例分析12-2:DMA和高速缓存的一致性 242

12.9 案例分析12-3:自修改代码的一致性 244

12.10 实验 245

第 13章 TLB管理 246

13.1 TLB基础知识 247

13.2 TLB重名与同名问题 249

13.3 ASID 251

13.4 TLB管理指令 253

13.5 TLB案例分析 256

第 14章 原子操作 261

14.1 原子操作介绍 261

14.2 保留加载与条件存储指令 262

14.3 独占内存访问工作原理 263

14.4 原子内存访问操作指令 266

14.5 比较并交换操作 270

第 15章 内存屏障指令 275

15.1 内存屏障指令产生的原因 275

15.2 RISC-V约束条件 280

15.3 RISC-V中的内存屏障指令 284

15.4 RISC-V内存屏障指令移植指南 286

15.5 案例分析 288

15.6 模拟和测试内存屏障故障 291

15.7 实验 297

第 16章 合理使用内存屏障指令 299

16.1 存储缓冲区与写内存屏障指令 300

16.2 无效队列与读内存屏障指令 305

16.3 内存屏障指令总结 307

16.4 案例分析:Linux内核中的内存屏障指令 308

16.5 实验 315

第 17章 与操作系统相关的内容 316

17.1 C语言常见陷阱 317

17.2 创建进程 320

17.3 简易进程调度器 327

17.4 让进程运行在用户模式 335

17.5 系统调用 338

17.6 实现clone系统调用 341

17.7 实验 343

第 18章 可伸缩矢量计算与优化 345

18.1 矢量计算基本概念 345

18.2 RVV寄存器 348

18.3 配置编译和运行环境 351

18.4 RVV指令格式 357

18.5 配置指令 358

18.6 加载和存储指令 360

18.7 矢量掩码指令 369

18.8 矢量整型算术指令 372

18.9 案例分析18-1:使用RVV指令优化strcmp()函数 377

18.10 案例分析18-2:RGB24转BGR24 380

18.11 案例分析18-3:4 × 4矩阵乘法运算 382

18.12 案例分析18-4:使用RVV内置函数 388

18.13 案例分析18-5:自动矢量优化 388

18.14 术语 390

18.15 实验 391

第 19章 压缩指令扩展 393

19.1 RISC-V指令集的特点 393

19.2 RVC支持的指令格式与指令编码 394

第 20章 虚拟化扩展 396

20.1 虚拟化技术介绍 396

20.2 RISC-V虚拟化扩展 399

20.3 RISC-V内存虚拟化 404

20.4 RISC-V虚拟化扩展中的新增指令 406

20.5 进入和退出虚拟机 407

20.6 中断虚拟化 410

20.7 案例分析20-1:进入和退出虚拟机 412

20.8 案例分析20-2:建立虚拟化两阶段地址映射 415

20.9 案例分析20-3:在虚拟机中实现虚拟定时器 420

20.10 案例分析20-4:在VMM中加载和存储虚拟机内存地址 422

20.11 案例分析20-5:在VMM中模拟串口设备 424

20.12 实验 429

附录A 关于RISC-V体系结构自测题的参考答案与提示 431

附录B RV64I指令速查表 433

附录C RV64M指令速查表 437

附录D RV64常用伪指令速查表 439

下载地址

立即下载

(解压密码:www.teccses.org)

Article Title:《RISC-V体系结构编程与实践》
Article link:https://www.teccses.org/1451460.html