RISC-V QEMU上引导Linux
Running 64-bit RISC-V Linux on QEMU
文章目录
前言
这是在RISC-V QEMU上引导Linux的“hello world”示例。该指南涵盖了一些基本步骤,以在RISC-V上运行Linux。如果您对特定发行版感兴趣,建议您按照它们的步骤进行操作。例如,如果您有兴趣运行Debian,可以在其维基https://wiki.debian.org/RISC-V上找到说明。大多数发行版(Debian,Fedora,OpenEmbedded,buildroot,OpenSUSE,FreeBSD等)都支持RISC-V。
一、环境准备
在QEMU RISC-V上运行Linux需要安装一些先决条件。
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
二、获取源码
先要获取源码
mkdir riscv64-linux
cd riscv64-linux
需要安装以下几个项目源码
RISCV Toolchain
QEMU
Linux
Busybox
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
git clone https://gitlab.com/qemu-project/qemu.git
git clone https://github.com/torvalds/linux
git clone https://git.busybox.net/busybox
1.RISCV Toolchain
如果您计划为RISC-V构建应用程序,您可能已经注意到,您之前安装的软件包无法满足您的程序可能依赖的C库的要求。因此,您需要自己构建工具链,以便在本指南中构建Busybox。
下面的说明受到RISC-V GNU编译器工具链项目的README启发,您可以在他们的说明中找到更详细的信息。请随意参考他们的文档或按照以下步骤进行操作。
Configure and Install
将toolchain编译·并安装到/opt/riscv
上
cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv
make linux -j $(nproc)
安装确认
which riscv64-linux-gnu-gcc
$ /usr/bin/riscv64-linux-gnu-gcc
2.QEMU
Configure and Install
编译并安装RISCV QEMU
cd qemu
git checkout v8.2.0
./configure
make -j $(nproc)
sudo make install
3.Linux
Configure and make
编译Linux ,注意使用RISCV toolchain
cd linux
git checkout v5.11
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j $(nproc)
4.busybox
cd busybox
CROSS_COMPILE=riscv64-linux-gnu- make defconfig
CROSS_COMPILE=riscv64-linux-gnu- make -j $(nproc)
三、构建文件系统rootfs
INITRAMFS
mkdir initramfs
cd initramfs
mkdir -p {bin,sbin,dev,etc,home,mnt,proc,sys,usr,tmp}
mkdir -p usr/{bin,sbin}
mkdir -p proc/sys/kernel
cd dev
sudo mknod sda b 8 0
sudo mknod console c 5 1
cd ..
拷贝busybox到filesystem里
cp ../busybox/busybox ./bin/
准备INIT
vim init
将以下内容粘到init文件中
#!/bin/busybox sh
# Make symlinks
/bin/busybox --install -s
# Mount system
mount -t devtmpfs devtmpfs /dev
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /tmp
# Busybox TTY fix
setsid cttyhack sh
# https://git.busybox.net/busybox/tree/docs/mdev.txt
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
sh
添加 +x flag
chmod +x init
initramfs应该是如下这样:
创建initramfs:
find . -print0 | cpio --null -ov --format=newc | gzip -9 > initramfs.cpio.gz
四、运行RISCV QEMU
回到工作根目录并运行QEMU
sudo qemu-system-riscv64 -nographic -machine virt \
-kernel linux/arch/riscv/boot/Image -append "root=/dev/vda ro console=ttyS0" \
-drive file=busybox,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0
总结
参考链接:
RISCV-V - Getting Started Guide
Linux on RISC-V using QEMU and BUSYBOX from scratch
Linux & Python on RISC-V using QEMU from scratch by Vysakh P Pillai
riscv-simulator
Building a minimal RootFS with Busybox, GLIBC and DropBear