今天构建了RISC-V的工作环境, 分为如下几步:
一、构建编译器
从https://github.com/riscv/riscv-gnu-toolchain下载源代码, 然后编译:
1 2 3 4 5 6 | git clone https: //github .com /riscv/riscv-gnu-toolchain cd riscv-gnu-toolchain git submodule update --init --recursive sudo apt-get 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 . /configure --prefix= /opt/riscv make linux |
这会将GCC安装到/opt/riscv
。
此外, 如果需要编译不带浮点支持的, 可以加上--with-arch=rv64imac --with-abi=lp64
参数。
二、构建QEMU
1 2 3 4 5 | cd qemu . /configure --prefix= /opt/riscv --target-list=riscv64-softmmu,riscv64-linux-user make make install cd ../.. |
这会将QEMU安装到/opt/riscv
。
如果提示找不到pkg-config包, 安装一下即可:
1 | sudo apt-get install pkg-config |
如果./configure
的时候提示缺少什么包, 用如下命令安装即可:
1 2 | sudo apt install libglib2.0-dev sudo apt install libpixman-1-dev |
三、构建Linux
首先将RISC-V工具链的bin
目录加入PATH
环境变量中, 然后下载内核并编译。
1 2 3 4 5 6 7 | wget https: //cdn .kernel.org /pub/linux/kernel/v5 .x /linux-5 .2.11. tar .xz tar xvf linux-5.2.11. tar .xz mv linux-5.2.11 linux cd linux ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- make defconfig ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- make cd .. |
另外, 也可以用如下命令来设置各个选项:
1 | ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- make menuconfig |
四、(已废弃)构建riscv-pk
1 2 3 4 5 6 7 8 9 10 11 12 13 | git clone https: //github .com /riscv/riscv-pk .git cd riscv-pk mkdir -p build cd build .. /configure \ --disable-fp-emulation \ -- enable -logo \ -- enable -print-device-tree \ --host=riscv64-unknown-linux-gnu \ --with-payload=../.. /linux/vmlinux make cp bbl ../.. /image .elf cd ../.. |
四、构建OpenSBI
1 2 3 4 5 | git clone https: //github .com /riscv-software-src/opensbi .git cd opensbi make CROSS_COMPILE=riscv64-unknown-linux-gnu- PLATFORM=generic FW_PAYLOAD_PATH=.. /linux/arch/riscv/boot/Image cp build /platform/generic/firmware/fw_payload .elf .. /image .elf cd .. |
五、构建BusyBox
1 2 3 4 5 6 7 | wget https: //busybox .net /downloads/busybox-1 .31.0. tar .bz2 tar xvf busybox-1.31.0. tar .bz2 cd busybox-1.31.0 ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- make menuconfig ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- make install cd .. |
其中, menuconfig
若提示缺少ncurses, 则还需要安装这个包:
1 | sudo apt-get install libncurses5-dev |
此外, menuconfig配置BusyBox编译选项时还需开启静态编译(Settings -> Build Options -> Build static binary (no shared libs)
)。
六、制作根目录磁盘镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | dd if = /dev/zero of=disk.img bs=1M count=128 mkfs -t ext4 disk.img mkdir mnt sudo mount disk.img mnt sudo rsync -avr busybox-1.31.0 /_install/ * mnt sudo chown -R root:root mnt/* cd mnt sudo mkdir -p proc sys dev etc /init .d cd dev sudo mknod console c 5 1 sudo mknod null c 1 3 sudo mknod random c 1 8 sudo mknod urandom c 1 9 sudo mknod zero c 1 5 cd .. sudo sh -c ' cat >etc /init .d /rcS <<EOF #!/bin/sh mount -t proc none /proc mount -t sysfs none /sys /sbin/mdev -s /sbin/ip link set lo up EOF' sudo chmod +x etc /init .d /rcS cd .. sudo umount mnt |
七、用QEMU启动内核(BBL或OpenSBI)并加载根目录磁盘镜像
1 2 3 4 5 6 7 8 | qemu-system-riscv64 -machine virt -nographic \ -kernel image.elf -append "root=/dev/vda ro" \ -smp 4 \ -m 1024 \ -drive file =disk.img, format =raw, id =hd0 \ -device virtio-blk-device,drive=hd0 \ -netdev type =user, id =net0 \ -device virtio-net-device,netdev=net0 |
此外, 还可以根据需要配置网络, 本文不再赘述。
最终结果如图所示:

八、参考文献
您这篇文章几乎是我找到唯一能用的。
感谢!
另外在第六项中应该把'<‘替换为'<'吧,我在centos7上不替换直接执行会报错。
感谢您的支持。这个好像是转义的问题,我写的小于号,最后就会变成那个东西。