From 581c083fcb7aa241f3f3462769c5a2a40bd52da9 Mon Sep 17 00:00:00 2001 From: Wu Zhangjin Date: Fri, 1 Apr 2022 17:40:58 +0800 Subject: [PATCH] update riscv-specs format issue Signed-off-by: Wu Zhangjin --- articles/20220327-riscv-specs.md | 36 ++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/articles/20220327-riscv-specs.md b/articles/20220327-riscv-specs.md index cb93069..e33044c 100644 --- a/articles/20220327-riscv-specs.md +++ b/articles/20220327-riscv-specs.md @@ -129,7 +129,7 @@ RV32F 和 RV32D 使用 32 个独立的 f 寄存器而不是 x 寄存器。 ## RV32A 原子指令 RV32A 有两种类型的原子操作: - + 1. 内存原子操作(AMO) 2. 加载保留/条件存储(load reserved/store conditional) @@ -229,7 +229,7 @@ debug specification 中描述了 debug mode 下 RISC-V hart 的操作。debug mo ![trace](images/riscv_specs/trace.png) -## Demo +## 实验演示 RISC-V Specs 演示代码。 @@ -237,9 +237,9 @@ RISC-V Specs 演示代码。 ![misa](images/riscv_specs/misa.png) -### 环境 +### 准备环境和代码 -#### Linux Lab +[Linux Lab](https://tinylab.org/linux-lab) 是我们用到的开源实验环境: ``` $ git clone https://gitee.com/tinylab/cloud-lab.git @@ -248,7 +248,7 @@ $ tools/docker/run linux-lab $ tools/docker/bash ``` -#### 下载源代码 +实验源代码也一并上传到了协作仓库,可这样下载: ``` $ git clone https://gitee.com/tinylab/riscv-linux @@ -257,9 +257,9 @@ $ cd code/misa/ 代码运行在 `M-Mode`,使用 `qemu` 测试。 -### 汇编语言 +### 汇编语言版本 -查看一下汇编代码。 +首先实现了一个汇编代码版本: ``` .text # 定义 text 代码段 @@ -276,26 +276,27 @@ stop: 查看 `misa` 寄存器的值,需要通过 `debug` 命令。 -`make debug` 开始调试。 +`make debug` 开始调试: ``` cd asm make debug ``` +操作如下: ![asm](images/riscv_specs/asm.png) > RV32I 寄存器长度是 32 位,RV64I 寄存器是 64 位,默认是 RV64I,可以修改 `common.mk` 设置成 32 位。 -`misa.md` 有更详细的说明。 +`misa.md` 文档有更详细的说明。 -### C 语言 +### C 语言版本 -使用汇编语言还需要 `debug` 才能看到 `misa` 的二进制值,不能直接解析并查看具体信息,非常不方便。 +上述纯汇编语言版本还需要 `debug` 才能看到 `misa` 的二进制值,不能直接解析并查看具体信息,非常不方便。 接下来使用 C 语言,可以很容易展示 `misa` 里面的具体内容。 -#### 首先,定义一个 `misa` 结构体 `b`。 +* 首先,定义一个 `misa` 结构体 `b` ```c /** @@ -339,7 +340,7 @@ typedef union { } CSR_MISA_Type; ``` -#### 之后,定义 csr 读取的宏:`__RV_CSR_READ` +* 之后,定义 csr 读取的宏:`__RV_CSR_READ` ``` /* symbolic CSR names: */ @@ -382,11 +383,11 @@ typedef union { 代码下面是 *linux kernel* 里面 `arch/riscv/include/asm/csr.h` 的实现方式,代码内容是一样的。 -#### 接着,通过内联汇编获取 `misa` csr +* 接着,通过内联汇编获取 `misa` csr C 语言可以使用内联汇编获取 `misa` 的值。 -#### 最后,使用 C 语言解析 `misa` csr +* 接下来是使用 C 语言解析 `misa` csr ```c void print_misa(void) @@ -418,13 +419,15 @@ void print_misa(void) } ``` -#### 查看 `misa` 信息 +* 最后,编译运行看看效果 ``` cd c make run ``` +结果显示如下: + ![c](images/riscv_specs/c.png) 可以一眼看出以下信息: @@ -444,3 +447,4 @@ make run 2. [D1_SDK_Howto](https://linux-sunxi.org/D1_SDK_Howto) 3. [ADB Download - Get the latest version of ADB and fastboot](https://adbdownload.com/) 4. [rvos-lab](https://gitee.com/tinylab/rvos-lab) +5. [Linux Lab](https://tinylab.org/linux-lab) -- Gitee