1.配置工作环境
sudo apt install gcc bison flex libncurses-dev ninja-build \
pkg-config build-essential zlib1g-dev pkg-config libglib2.0-dev \
binutils-dev libboost-all-dev autoconf libtool libssl-dev \
libpixman-1-dev python-capstone virtualenv software-properties-common
sudo apt install python3.8
2.下载RISC-V交叉编译器
下载地址:
https://toolchains.bootlin.com
建议选择stable版本,arch选择riscv64-lp64d,libc选择常用的glibc。
下载后解压,然后将bin目录加入PATH环境变量中。
3.下载编译QEMU
下载地址:
https://www.qemu.org/download/
建议选择稳定版本,下载后解压,然后make
wget https://download.qemu.org/qemu-8.0.3.tar.xz
tar xjvf qemu-8.0.3.tar.xz
cd qemu-8.0.3
./configure
make
4.下载编译opensbi
下载:
git clone https://github.com/riscv-software-src/opensbi.git
编译:
export CROSS_COMPILE=riscv64-linux-
make PLATFORM=generic
编译成功后,生成的固件在build/platform/generic/firmware/目录下:
生成的固件有三种类型:dynamic、jump和payload
- dynamic:带有动态信息的固件
- jump:指定下一级的boot地址跳转
- payload:包含下一级boot的二进制内容,通常是uboot/linux
这里我们使用jump类型固件,OpenSBI运行后,可以直接跳转到kernel运行。
因为opensbi本身就是一个bootloader,因此可以不使用uboot引导kernel,通过opensbi的jump固件,可以直接跳转到kernel启动。
5.下载编译Linux kernel
Linux内核下载地址:
https://www.kernel.org/
选择稳定的版本,下载完后解压编译
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.125.tar.xz
tar xf linux-5.15.125.tar.xz
cd linux-5.15.125
export ARCH=riscv
export CROSS_COMPILE=riscv64-linux-
make defconfig
make -j8
编译成功后,在arch/riscv/boot下生成Image:
6.使用buildroot制作rootfs
buildroot下载地址:
https://buildroot.org/download.html
选择稳定版本,下载后解压,然后进行buildroot配置
wget https://buildroot.org/downloads/buildroot-2023.02.3.tar.gz
tar xzvf buildroot-2023.02.3.tar.gz
cd buildroot-2023.02.3
make menuconfig
选择 Target options ---> Target Architecture,然后选择RISCV;
选择 Filesystem images ---> ext2/3/4 root filesystem,勾选上;
最后保持退出,然后编译
make -j8
编译过程会花费比较长时间,编译完成后,生成文件在output/images目录下:
rootfs.ext2是我们需要用到的。
7.运行QEMU
将fw_jump.elf、Image、rootfs.ext2拷贝到当前目录下,然后执行命令:
qemu-system-riscv64 -M virt \
-bios fw_jump.elf \
-kernel Image \
-append "rootwait root=/dev/vda ro" \
-drive file=rootfs.ext2,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-netdev user,id=net0 -device virtio-net-device,netdev=net0 -nographic