赞
踩
参考这篇文档:在 QEMU 上运行 RISC-V 64 位版本的 Linux - 知乎
参考官方文档:Running 64- and 32-bit RISC-V Linux on QEMU — RISC-V - Getting Started Guide
FreeBSD riscv下载:Index of /freebsd/releases/riscv/14.0-RELEASE/
Linux 内核下载:GitHub - torvalds/linux: Linux kernel source tree
国内Linux内核镜像:Linux Kernel: Linux 内核源码镜像
Debian riscv:RISC-V - Debian Wiki
Running 64- and 32-bit RISC-V Linux on QEMU — RISC-V - Getting Started Guide
- 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
再安装交叉编译gcc(这个不必须)
sudo apt install gcc-riscv64-linux-gnu gcc-riscv64-unknown-elf
- git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
-
- mkdir build && cd build
-
- ../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linux
- make linux
可以设置with-abi=ilp64d ,也可以不设置。这个toolchain下载特别慢,因为里面还有很多其它库,经常会断
解决的方法是哪里缺少下哪里。另git下载的时候可以加上--depth参数以减少下载数据。
比如要下载
git clone https://sourceware.org/git/binutils-gdb.git
git clone https://gcc.gnu.org/git/gcc.git
https://sourceware.org/git/binutils-gdb.git
- git clone https://github.com/qemu/qemu
- git clone https://github.com/torvalds/linux
- git clone https://git.busybox.net/busybox
cd qemu git checkout v5.0.0 ./configure --target-list=riscv64-softmmu make -j $(nproc) sudo make install
这个应该用apt等包直接装了
不过后来又重新跑了一遍。
- cd linux
- git checkout v5.4.0
- make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
这里会报错,需要提前riscv64-unknown-linux-gnu安装GitHub - riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC
而编译riscv64-unknown-linux-gnu的时候会报toolchain缺少binutils,解决方法是下载:
git clone https://sourceware.org/git/binutils-gdb.git
然后改名binutils-gdb 到binutils
缺 gcc git clone https://gcc.gnu.org/git/gcc.git
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)
Build Busybox:
- cd busybox
- CROSS_COMPILE=riscv{{bits}}-unknown-linux-gnu- make defconfig
- CROSS_COMPILE=riscv{{bits}}-unknown-linux-gnu- make -j $(nproc)
run
- 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
编译的时候报错少东西
k/riskv64-linux/riscv-gnu-toolchain/build/../gdb/configure \
......
/bin/sh: /home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/../binutils/configure: No such file or directory
make: *** [Makefile:354: stamps/build-binutils-linux] Error 127
make: *** Waiting for unfinished jobs....
/bin/sh: /home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/../gdb/configure: No such file or directory
make: *** [Makefile:378: stamps/build-gdb-linux] Error 127
解决的方法是哪里缺了补下哪里。在riscv-gnu-toolchain目录里:
- git clone https://sourceware.org/git/binutils-gdb.git
- rm -rf gdb
- mv binutils-gdb gdb
CXX dwarf2/macro.o
g++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
make[3]: *** [Makefile:1925: dwarf2/index-write.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[3]: Leaving directory '/home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/build-gdb-linux/gdb'
make[2]: *** [Makefile:11378: all-gdb] Error 2
make[2]: Leaving directory '/home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/build-gdb-linux'
make[1]: *** [Makefile:1028: all] Error 2
make[1]: Leaving directory '/home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/build-gdb-linux'
make: *** [Makefile:379: stamps/build-gdb-linux] Error 2
再次编译就过了,也许是交换空间告急了吧。
~/riskv64-linux/riscv-gnu-toolchain$ cat .gitmodules
[submodule "binutils"]
path = binutils
url = https://sourceware.org/git/binutils-gdb.git
branch = binutils-2_42-branch
[submodule "gcc"]
path = gcc
url = https://gcc.gnu.org/git/gcc.git
branch = releases/gcc-13
[submodule "glibc"]
path = glibc
url = https://sourceware.org/git/glibc.git
[submodule "dejagnu"]
path = dejagnu
url = https://git.savannah.gnu.org/git/dejagnu.git
branch = master
[submodule "newlib"]
path = newlib
url = https://sourceware.org/git/newlib-cygwin.git
branch = master
[submodule "gdb"]
path = gdb
url = https://sourceware.org/git/binutils-gdb.git
branch = gdb-14-branch
[submodule "qemu"]
path = qemu
url = https://gitlab.com/qemu-project/qemu.git
[submodule "musl"]
path = musl
url = https://git.musl-libc.org/git/musl
branch = master
[submodule "spike"]
path = spike
url = https://github.com/riscv-software-src/riscv-isa-sim.git
branch = master
[submodule "pk"]
path = pk
url = https://github.com/riscv-software-src/riscv-pk.git
branch = master
[submodule "llvm"]
path = llvm
url = https://github.com/llvm/llvm-project.git
branch = release/17.x
编译toolchain报错
../sysdeps/unix/sysv/linux/riscv/flush-icache.c:24:10: fatal error: asm/syscalls.h: No such file or directory
24 | #include <asm/syscalls.h>
| ^~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [/home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/build-glibc-linux-rv64imafdc-lp64d/sysd-rules:43: /home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/build-glibc-linux-rv64imafdc-lp64d/misc/flush-icache.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[3]: Leaving directory '/home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/glibc/misc'
make[2]: *** [Makefile:258: misc/subdir_lib] Error 2
make[2]: Leaving directory '/home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/glibc'
make[1]: *** [Makefile:9: all] Error 2
make[1]: Leaving directory '/home/linuxskywalk/riskv64-linux/riscv-gnu-toolchain/build/build-glibc-linux-rv64imafdc-lp64d'
make: *** [Makefile:426: stamps/build-glibc-linux-rv64imafdc-lp64d] Error 2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。