# riscv-practice **Repository Path**: code-tang/riscv-practice ## Basic Information - **Project Name**: riscv-practice - **Description**: 本仓库用于保存《RISCV体系结构编程实践》书籍中的实验相关的代码,包含自己的代码,以及书籍中提到的benos相关的代码,为了简单,将直接复制,或者引用该仓库的内容。 - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-02-07 - **Last Updated**: 2024-02-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 说明 本仓库用于保存《RISCV体系结构编程实践》书籍中的实验相关的代码,包含自己的代码,以及书籍中提到的benos相关的代码,为了简单,将直接复制,或者引用该仓库的内容。 该仓库地址为 [risc-v practice 仓库](https://gitee.com/benshushu/riscv_programming_practice.git)。 # 章节 ## 实验2 下载书中的仓库 ```shell git clone https://gitee.com/benshushu/riscv_programming_practice.git ``` 其中第2章节包含了所需要的benos的源码。 安装riscv交叉编译工具 ```shell sudo pacman -S riscv64-linux-gnu-gcc ``` 编译benos ```shell cd benos export board=qemu make clean make ``` 使用最新的qemu将无法直接重复本章节中的实验,因为此时的benos的sbi中没有添加pmp支持。 为了简单起见,通过更改qemu源码,将 `qemu/target/riscv/cpu.c`中的`DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, true),`更改为`DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, false),`,暂时关闭pmp功能,然后重新编译即可。在后续的第10章节中,会手动编写pmp功能。 ```shell // ./target/riscv/cpu.c Property riscv_cpu_options[] = { DEFINE_PROP_UINT32("pmu-mask", RISCVCPU, cfg.pmu_mask, MAKE_64BIT_MASK(3, 16)), {.name = "pmu-num", .info = &prop_pmu_num}, /* Deprecated */ DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true), DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, false), # 需要sbi支持pmp DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec), DEFINE_PROP_STRING("vext_spec", RISCVCPU, cfg.vext_spec), DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128), DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64), DEFINE_PROP_UINT16("cbom_blocksize", RISCVCPU, cfg.cbom_blocksize, 64), DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), DEFINE_PROP_END_OF_LIST(), }; ``` ## 实验3 ### 3-1