Skip to content

Commit a98c51c

Browse files
committed
Add GNU user guide.
Signed-off-by: Jiawei <[email protected]>
1 parent 761f6c6 commit a98c51c

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

docs/zh/Other/GNU-guide.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
## 整体说明
2+
3+
RUYISDK工具链是基于`riscv-gnu-toolchain`进行开发的多版本支持RISC-V工具链,支持RISC-V Profiles等最新RISC-V特性,包含gcc/llvm编译器、binutils二进制处理工具集,支持newlib/glibc/musl等多种C语言库。包含多个gcc版本支持,支持RVV(向量扩展)、XThead系列自定义扩展、P扩展(SIMD操作)等丰富的指令集。提供rv64ilp32特性支持,通过松弛扩展寻址技术实现32位软件在64位硬件上的高效运行。Newlib生成的elf工具链适用于嵌入式环境,Glibc生成的linux工具链适用于操作系统等复杂依赖场景。
4+
5+
**_下载方式_** (参考RUYI-DOCS README)
6+
7+
工具链支持 ​rv32/64 两种基础指令集架构,包含RISC-V多个扩展指令集支持,全部支持的指令可以通过`-march=help`选项列出:
8+
9+
https://godbolt.org/z/en41ncGde
10+
11+
### riscv-gcc使用说明
12+
13+
riscv-gcc是工具链的默认编译器,支持c,c++,fortan,ada等多种编程语言,最新发布版本为gcc15.1.0。工具链中包含32/64位gcc工具,这里以`riscv64-unknown-linux-gnu-gcc`为例简单介绍riscv-gcc的使用方法及常见选项参数。
14+
15+
1. 直接使用gcc命令构建生成可执行文件
16+
17+
```
18+
riscv64-unknown-linux-gnu-gcc add.c -o add.elf
19+
```
20+
21+
这里`-o`用于指定生成的文件名称
22+
23+
2. 使用特定RISC-V扩展指令构建二进制文件, 在`-march`选项中添加指定扩展,用下划线进行分割
24+
25+
```
26+
riscv64-unknown-linux-gnu-gcc add.c -march=rv64gc_zba_zbb -O1 -o add.elf
27+
```
28+
29+
这里`-O1`为使用的gcc优化级别,根据开启的优化选项分为`-O1 -O2 -O3`三级,`-O1`会开启内联优化,将内联函数转化生成对应的指令,保证zba,zbb中的位操作指令可正确生成,达到优化程序的效果,参考:https://godbolt.org/z/aWzxah9Mb
30+
31+
可使用Profiles作为`-march`输入,Profiles需要小写,可以后接其他扩展:https://godbolt.org/z/jcra5vc8G
32+
33+
```
34+
riscv64-unknown-linux-gnu-gcc add.c -march=rva22u64
35+
```
36+
37+
3. 仅编译,生成`.s`汇编文件,使用`-S`作为编译参数
38+
39+
```
40+
riscv64-unknown-linux-gnu-gcc add.c -S
41+
```
42+
43+
执行命令后会生成add.s作为add.c的RISC-V指令汇编文件
44+
45+
4. 开启自动向量化,使用`-march=rv64gcv -O3`作为编译参数
46+
47+
```
48+
riscv64-unknown-linux-gnu-gcc mul.c -S -march=rv64gcv -O3
49+
```
50+
51+
https://godbolt.org/z/vWsK73K8d
52+
53+
riscv-gcc可以使用`-mrvv-max-lmul`选项指定允许的lmul的最大值,防止寄存器压力过大导致性能下降 https://godbolt.org/z/nj4KfYjqT
54+
55+
riscv-gcc还可以使用`-mrvv-vector-bits`选项开启或关闭RVV的可变向量长度特性(默认启用) https://godbolt.org/z/WKGh6bT3h
56+
57+
5. 可以通过`-mabi`选项指定启用的ABI,通常使用的ABI包括`-mabi=lp64d/lp64/ilp32d/ilp32/ilp32e`,其主要区别在控制启用的寄存器组,ilp32e使用0\~15号整形寄存器,常用于嵌入式环境设备,lp64/ilp32使用0\~31号整形寄存器,用于简单计算场合,lp64d/ilp32d除0\~31号整形寄存器外还使用了0\~31号浮点寄存器,可用于高精度科学计算,当ABI不包含浮点寄存器时,编译器会使用软浮点运算通过整形寄存器进行模拟(有可能的精度损失风险)https://godbolt.org/z/nGE3rKzMn
58+
59+
### riscv-binuitls使用说明
60+
61+
riscv-binuitls包含RISC-V汇编器,链接器,调试器工具集合,下面分别介绍其使用方法
62+
63+
#### riscv-as使用说明
64+
65+
汇编器可以识别riscv汇编指令,并将其转化为对应的二进制机器码,这里以`riscv64-unknown-linux-gnu-as`为例
66+
67+
```
68+
riscv64-unknown-linux-gnu-as add.s -o add.elf
69+
```
70+
71+
通常汇编器需要搭配反汇编器`riscv64-unknown-linux-gnu-objdump`工具,来分析检查对应的指令是否正确生成
72+
73+
```
74+
riscv64-unknown-linux-gnu-objdump add.elf -d > add.asm
75+
```
76+
77+
对于二进制文件也可以使用`riscv64-unknown-linux-gnu-readelf`工具查看其信息
78+
79+
```
80+
riscv64-unknown-linux-gnu-readelf -h -A add.elf
81+
```
82+
83+
#### riscv-gdb使用说明
84+
85+
调试器通常用于处理程序异常,帮助开发者分析程序执行情况,这里以`riscv64-unknown-linux-gnu-gdb`在qemu-riscv64模拟器上进行远程调试为例
86+
87+
首先在qemu模拟器上启动需要调试的程序,注意构建程序时使用`-g`选项开启调试, qemu `-g`后接调试启用的端口(通常使用1234)
88+
89+
```
90+
qemu-riscv64 -g 1234 add.elf
91+
```
92+
93+
启用`riscv64-unknown-linux-gnu-gdb`连接到qemu中运行的程序
94+
95+
```
96+
riscv64-unknown-linux-gnu-gdb add.elf
97+
(gdb) target remote:1234
98+
(gdb) file add.elf
99+
```
100+
101+
对程序设置断点进行调试操作,观察输出,常见调试命令如下
102+
103+
| 命令 | 功能说明 | 示例 |
104+
|----|------|----|
105+
| file | 加载调试文件 | file add.elf |
106+
| break | 设置断点 | break main (b main) |
107+
| stepi | 单步执行 | stepi (s) |
108+
| info registers | 查看寄存器状态 | info registers v5 (i r v5) |
109+
| backtrace | 查看调用栈 | backtrace full (bt full) |
110+
| exit | 退出调试 | exit (q) |
111+
112+
#### 模拟器
113+
114+
工具链包含qemu,spike两种模拟器,支持运行32/64位riscv程序,可使用--isa=指定模拟器使能的扩展
115+
116+
```
117+
qemu-riscv64 add.elf
118+
119+
spike --isa=rv64gc pk add.elf
120+
```

0 commit comments

Comments
 (0)