当前位置:   article > 正文

QEMU安装和使用@Ubuntu(待续)

QEMU安装和使用@Ubuntu(待续)

参考这篇文档:在 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

先按照qemu的这个手册一步步来:

Running 64- and 32-bit RISC-V Linux on QEMU — RISC-V - Getting Started Guide

先安装必要的库

  1. sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
  2. gawk build-essential bison flex texinfo gperf libtool patchutils bc \
  3. zlib1g-dev libexpat-dev git

再安装交叉编译gcc(这个不必须)

sudo apt install gcc-riscv64-linux-gnu gcc-riscv64-unknown-elf

安装交叉编译riscv-gnu-toolchain

  1. git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
  2. mkdir build && cd build
  3. ../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linux
  4. 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

下载代码

  1. git clone https://github.com/qemu/qemu
  2. git clone https://github.com/torvalds/linux
  3. git clone https://git.busybox.net/busybox

Build QEMU with the RISC-V target:

cd qemu
git checkout v5.0.0
./configure --target-list=riscv64-softmmu
make -j $(nproc)
sudo make install

这个应该用apt等包直接装了

不过后来又重新跑了一遍。

Build Linux for the RISC-V target. First, checkout to a desired version:

  1. cd linux
  2. git checkout v5.4.0
  3. 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

编译Linux

make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)

Build Busybox:

  1. cd busybox
  2. CROSS_COMPILE=riscv{{bits}}-unknown-linux-gnu- make defconfig
  3. CROSS_COMPILE=riscv{{bits}}-unknown-linux-gnu- make -j $(nproc)

run

  1. sudo qemu-system-riscv64 -nographic -machine virt \
  2. -kernel linux/arch/riscv/boot/Image -append "root=/dev/vda ro console=ttyS0" \
  3. -drive file=busybox,format=raw,id=hd0 \
  4. -device virtio-blk-device,drive=hd0

调试

toolchain软件包下载不全

编译的时候报错少东西

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目录里:

  1. git clone https://sourceware.org/git/binutils-gdb.git
  2. rm -rf gdb
  3. 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

再次编译就过了,也许是交换空间告急了吧。

chain的库

~/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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号