设置好$RISCV地址
工具链:riscv64-unknown-linux-gnu-gcc (linux版)
运行模拟器:Spike
这两个环境搭建参考我另一篇博客:RISC-V GNU编译环境搭建与运行实践
整个操作简单来说就是,使用busybox生成基本的Linux命令,再编译riscv-linux生成vmlinux,使用riscv-pk里的bbl包装vmlinux,最后使用Spike 运行bbl,启动linux。
BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。
curl -L https://busybox.net/downloads/busybox-1.27.2.tar.bz2 > busybox.tar.bz2
tar xvjf busybox1.27.2.tar.bz2
cd /busybox-1.27.2
make menuconfig # 設置 .config文件,或直接通过下方参考文件直接替换
.config文件可直接使用.config参考
然后替换其中几个字段:
CONFIG_CROSS_COMPILER_PREFIX:$RISCV/bin/riscv64-unknown-linux-gnu-
CONFIG_SYSROOT:$RISCV/sysroot
CONFIG_PREFIX:$RISCV/rootfs
然后设置rootfs目录
cp -r $RISCV/sysroot $RISCV/rootfs # 复制一份 sysroot作为未来 rootfs 的基底
cd $RISCV/rootfs
mkdir bin dev tmp proc sys # 创建一些系统目录
cp inittab $RISCV/rootfs/etc/inittab # 拷贝进inittab 文档
ln -s ../bin/busybox sbin/init # 设定init起始文档连接到busybox
ln -s bin/busybox linuxrc #
ln -s sbin/init init #
mknod dev/console c 5 1 # 设置一些必要的虚拟外设
mknod dev/null c 1 3
其中inittab文件可直接使用inittab参考
然后编译运行
make -j4
sudo make install
git clone [email protected]:riscv/riscv-linux.git #使用码云的镜像下载更快
cd riscv-linux
make ARCH=riscv menuconfig
vim initramfs.txt #在当前目录建立initramfs.txt,内容如下
initramfs.txt
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/null 644 0 0 c 1 3
slink /init /bin/busybox 755 0 0
设置.config文件,可直接使用.config参考
将CONFIG_INITRAMFS_SOURCE替换为自己的$riscv/rootfs路径,如
CONFIG_INITRAMFS_SOURCE="/opt/riscv/rootfs initramfs.txt"
编译生成vmlinux
make -j4 ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- vmlinux
将mvlinux用bbl包装
cd riscv-pk
mkdir build
cd build
../configure --prefix=$RISCV --host=riscv64-unknown-linux-gnu --with-payload=/home/pengping/rv-gnu/riscv-linux/vmlinux
make
其中 --with-payload=自己生成的vmlinux路径
spike riscv-pk/build/bbl
运行结果:
运行起来的目录其实是之前设置的$riscv/rootfs目录,里面只能运行一些基础的linux指令(busybox含有的),没有相关的工具链,而且方向键和esc键会乱码。
而且在当前环境下的操作不会被保存下来,每次重新启动都会回到最初的环境。
可以将相关的库文件及要运行的RV二进制文件在外部编译后,再放入$riscv/rootfs里,重新编译生成新的vmlinux,然后重新用bbl包装,进行测试。
https://ithelp.ithome.com.tw/articles/10192454
https://cnrv.io/articles/spike-linux