TinyEMU之RISCV-PK编译

本文详细介绍了如何在Ubuntu20.04环境中下载、准备和编译RISC-V-PK,以及打补丁的过程,重点讲解了bbl格式转换以适应TinyEMU的需求。


本文属于《 TinyEMU模拟器基础系列教程》之一,欢迎查看其它文章。

1 riscv-pk简介

RISCV-PK(RISC-V Proxy Kernel),是一个轻量级的应用程序执行环境,可以承载静态链接的RISC-V ELF二进制文件。它旨在支持有限I/O能力的捆绑RISC-V实现,从而通过将I/O相关的系统调用代理到主机来处理它们。

riscv-pk是一个代理内核,包含 bootloader,可以帮助模拟一个系统环境来运行Linux系统。

这里,我们可以简单理解为,就是把riscv-pk当作bootloader,bootloader的实际工作比较复杂,但是它最主要的工作就是启动 Linux内核。bootloader和 Linux 内核的关系,就跟 PC 上的BIOS和Windows的关系类似,bootloader就相当于BIOS。

riscv-pk的github:https://github.com/riscv-software-src/riscv-pk/tree/master
因此,本文的目的就是,编译出bootloader。

2 准备工作

环境为Ubuntu 20.04。

2.1 下载riscv-pk源码

下载riscv-pk源码

git clone https://github.com/riscv-software-src/riscv-pk.git

进入源码目录(必须进入.git文件所在目录)

cd riscv-pk

获取该仓库中,特定commit版本的源码

git checkout ac2c910b18c3e36cfd85080472e78ad2fe484325
  • 在diskimage-linux-riscv-2018-09-23\patches\readme.txt中,指定了必须使用riscv-pk的git version为ac2c910b18c3e36cfd85080472e78ad2fe484325
  • 不知道diskimage-linux-riscv-2018-09-23是什么的,可查看前文《TinyEMU之源码编译与使用》

在这里插入图片描述
显示当前HEAD,已经切换到ac2c910;并且还会打印出这个commit的修改信息“Fix git-submodule fatal error for berkeley-softfloat-3”。

2.2 给riscv-pk源码打补丁

补丁文件为:diskimage-linux-riscv-2018-09-23\patches\riscv-pk.diff。
将riscv-pk.diff,拷贝至riscv-pk源码目录下。

执行如下命令,给源码打补丁:

patch -p1 < ./riscv-pk.diff

在这里插入图片描述
我们可以看到,成功对Makefile.in,.c,.s,.lds等文件,打了补丁。

  • 在riscv-pk.diff中,记录了各文件,应该如何修改。在执行patch命令时,就会将riscv-pk.diff中的内容,写入各文件,也就是打补丁。如果没有打补丁,有可能编译失败(Makefile.in);我们还发现,补丁会修改c代码文件,没打补丁的话,也会影响程序代码执行。
  • 注意:riscv-pk.diff文件,仅能对本commit版(ac2c910b18c3e36cfd85080472e78ad2fe484325)代码,打补丁;对其他的版本,打补丁会失败。
  • 个人猜测,可能是TinyEMU作者,对riscv-pk源码进行了修改,以适配TinyEMU来运行,因此出了这个特定commit的补丁文件。

到这里,源码目录下的代码,就是完全正确的了。
接下来,开始编译。

3 编译riscv-pk

创建build目录

mkdir build

进入build目录

cd build

配置编译环境

../configure --prefix=$RISCV --host=riscv64-unknown-linux-gnu
  • 指定交叉编译器为riscv64-unknown-linux-gnu,默认编译,会生成64位RISC-V的pk和bbl。
  • riscv64-unknown-linux-gnu交叉编译器,我们已经在前文中装好了,不清楚的请看此文《TinyEMU之Linux Kernel编译》
  • 执行命令../configure -h,会打印帮助信息,此处不再赘述。

执行编译

make

很快编译完毕。
在这里插入图片描述
生成了64位RISC-V架构的可执行程序,bbl和pk。

  • pk是代理内核,主要是将I/O相关的系统调用,代理到主机来处理(在TinyEMU中,我们不关心,这个pk)。
  • bbl就是Bootloader,我们在TinyEMU中,用它来加载并启动linux系统。

4 bbl格式转换

在diskimage-linux-riscv-2018-09-23/readme.txt中,有明确描述:TinyEMU只支持原始(RAW)boot loader和kernel image。

因此,必须使用以下命令,将ELF格式bbl,转换为RAW格式bbl:

riscv64-unknown-linux-gnu-objcopy -O binary bbl bbl.bin

这个bbl.bin,才能在TinyEMU中,被正确加载执行。

<think>我们被要求使用git克隆RISC-V官方指令集模拟器(spike)和Proxy Kernel(pk)的源码并配置开发环境。根据引用[1]和引用[2]提供的信息,我们可以按照以下步骤进行: 1. 克隆riscv-tests仓库(根据引用[1]): ``` git clone https://github.com/riscv-software-src/riscv-tests.git ``` 2. 但是,用户需要的是spike和pk。根据RISC-V官方资源,spike模拟器通常位于riscv-isa-sim仓库,而pk(proxy kernel)位于riscv-pk仓库。因此,我们需要分别克隆这两个仓库。 3. 克隆spike(riscv-isa-sim): ``` git clone https://github.com/riscv-software-src/riscv-isa-sim.git ``` 4. 克隆pkriscv-pk): ``` git clone https://github.com/riscv-software-src/riscv-pk.git ``` 5. 配置和构建spike: - 进入riscv-isa-sim目录 - 创建build目录并进入 - 运行configure和make 6. 配置和构建pk- 注意:构建pk需要指定riscv-gnu-toolchain的路径,并且需要先构建spike(因为pk需要知道目标架构) - 进入riscv-pk目录 - 创建build目录并进入 - 运行configure,指定--host=riscv64-unknown-elf(根据你的目标架构)和--prefix(安装路径) - 然后make 7. 环境变量设置:可能需要将构建好的spike和pk的路径添加到PATH环境变量中。 然而,引用[4]提到在构建工具链时可能会遇到子模块下载的问题,我们可以参考其方法处理子模块。 另外,引用[3]提到配置开发板环境,但这里我们主要是模拟器开发环境,所以暂时不需要开发板。 但是,请注意:构建spike和pk之前,需要先安装RISC-V工具链(包括编译器、链接器等)。如果没有安装,需要先安装。 安装RISC-V工具链的方法(参考引用[4]): - 克隆riscv-gnu-toolchain仓库,并递归更新子模块(注意:由于网络问题,可能需要修改.gitmodules中的子模块链接为国内镜像,如码云)。 - 然后构建工具链。 因此,完整的步骤应该包括: 步骤1:安装依赖 在Ubuntu上,需要安装一些依赖包: ```bash sudo apt update sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ``` 步骤2:安装RISC-V工具链 ```bash git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain.git cd riscv-gnu-toolchain # 如果遇到子模块下载问题,可以修改.gitmodules中的url为国内镜像(如gitee),然后运行git submodule sync,再继续 # 然后配置并构建(这里以64位为例) ./configure --prefix=/opt/riscv --enable-multilib make ``` 注意:构建过程耗时较长,且需要大量内存。如果机器资源有限,可以只构建单目标,如`--prefix=/opt/riscv` 不加`--enable-multilib`则只构建默认架构(通常是64位)。 步骤3:克隆并构建spike ```bash git clone https://github.com/riscv-software-src/riscv-isa-sim.git cd riscv-isa-sim mkdir build cd build ../configure --prefix=/opt/riscv make sudo make install ``` 步骤4:克隆并构建pk ```bash git clone https://github.com/riscv-software-src/riscv-pk.git cd riscv-pk mkdir build cd build ../configure --prefix=/opt/riscv --host=riscv64-unknown-elf make sudo make install ``` 步骤5:设置环境变量 将工具链和模拟器的路径添加到环境变量中,例如: ```bash export PATH=/opt/riscv/bin:$PATH ``` 验证安装: ```bash spike --version spike pk hello # 假设有一个编译好的RISC-V程序hello,使用pk作为内核运行 ``` 注意:以上步骤假设使用64位目标。如果需要32位,则在构建工具链时指定`--with-arch=rv32i --with-abi=ilp32`,并在构建pk时使用`--host=riscv32-unknown-elf`。 另外,如果用户没有权限安装到/opt/riscv,可以安装到用户目录,如$HOME/.riscv,然后相应地设置PATH。 由于网络问题,克隆仓库和子模块可能会遇到困难,可以按照引用[4]的方法,将子模块的URL替换为国内镜像(如gitee)再更新。 以上步骤应该能够帮助用户获取spike和pk的源码并配置开发环境。</think>### 获取 RISC-V 模拟器与 Proxy Kernel 源码并配置环境 以下是配置 RISC-V 开发环境的完整步骤: #### 1. 安装必要依赖 ```bash sudo apt update sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git ``` #### 2. 克隆 Spike 模拟器源码 ```bash git clone https://github.com/riscv-software-src/riscv-isa-sim.git cd riscv-isa-sim mkdir build cd build ../configure --prefix=$HOME/riscv make make install ``` #### 3. 克隆 Proxy Kernel (pk) 源码 ```bash git clone https://github.com/riscv-software-src/riscv-pk.git cd riscv-pk mkdir build cd build ../configure --prefix=$HOME/riscv --host=riscv64-unknown-elf make make install ``` #### 4. 设置环境变量 ```bash echo 'export PATH="$HOME/riscv/bin:$PATH"' >> ~/.bashrc source ~/.bashrc ``` #### 5. 验证安装 ```bash # 检查spike spike --version # 测试运行示例(需先编译RISC-V程序) echo 'int main(){ return 0; }' > hello.c riscv64-unknown-elf-gcc hello.c -o hello spike pk hello ``` > **重要提示**: > 1. 构建 pk 前需确保已安装 RISC-V 工具链(`riscv64-unknown-elf-gcc`) > 2. 若遇子模块下载问题,参考引用[4]方法修改 `.gitmodules` 中的 URL 为国内镜像源 > 3. 澎峰Perf-V开发板用户需注意设备ID配置差异[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值