• 基於RISC-V QEMU 仿真運行Linux 系統環境搭建


    前言

    文章詳細說明如何從堶零開始基於RISC-V QEMU 仿真運行Linux 系統環境搭建,
    Linux 小白入門教程不二之選,歡迎留言討論,轉發請注明原文出處~

    1. 準備QEMU 仿真環境 --RISC-V 64bits

    安裝包下載地址: https://www.qemu.org/

    安裝命令及安裝成功效果如下所示,

    target-list 設定爲riscv64-softmmu, 

    1. sudo apt-get install libglib2.0-dev
    2. sudo apt-get install libpixman-1-dev
    3. ./configure --target-list=riscv64-softmmu
    4. make -j24
    5. sudo make install -j24

    安裝完成後,可按如下檢查是否安裝成功

    1. $ qemu-system-riscv64 -h
    2. QEMU emulator version 8.0.4
    3. Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
    4. usage: qemu-system-riscv64 [options] [disk_image]


    2. 安裝RISC-V 編譯器, (過程略)


    如下cmd 可檢查是否安裝成功並顯示版本號 12.2.0

    1. $ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -v
    2. Using built-in specs.
    3. COLLECT_GCC=/opt/riscv/bin/riscv64-unknown-linux-gnu-gcc
    4. COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-linux-gnu/12.2.0/lto-wrapper
    5. Target: riscv64-unknown-linux-gnu
    6. Configured with: /project/riscv-gnu-toolchain/gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-pkgversion=g2ee5e430018 --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=.././gcc --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket --with-isa-spec=20191213 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
    7. Thread model: posix
    8. Supported LTO compression algorithms: zlib
    9. gcc version 12.2.0 (g2ee5e430018)

    3. 準備U-Boot

    Linux 啓動需要u-boot 引導載入鏡像文件. 節說明如何準備u-boot

    下載路徑: U-Boot / U-Boot · GitLab

    編譯安裝方法: 

    1. export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
    2. make qemu-riscv64_smode_defconfig
    3. make -j$(nproc) 2>&1 | tee build.log

     4. 準備OpenSBI

    SBI (Supervisor Binary Interface), M-mode下运行的特定于平台固件,与bootloader引导加载程序,以及在S-mode或HS-mode模式下运行的hypervisor或通用操作系统之间的接口。與之對應, userspace 與 kernelspace 的接口稱爲ABI (Application Binary Interface).

    OpenSBI 用於啓動引導操作系統,以及系統運行過程中,切換入M-Mode 提供一些硬件操作. 

    下載路徑: https://github.com/riscv/opensbi.git

    編譯安裝方法, FW_PAYLOAD_PATH 需換換爲上一小節u-boot.bin 實際路徑: 

    1. export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
    2. make PLATFORM=generic FW_PAYLOAD_PATH=$1<uboot_build_directory>/u-boot.bin

    編譯完成後,可看到生成fw_payload.elf,  至此,可以先測試openSBI + u-boot 是否可正常啓動:

    build/platform/generic/firmware/fw_payload.bin
    
    qemu-system-riscv64 -M virt -m 256M -nographic -bios build/platform/generic/firmware/fw_payload.elf
    1. U-Boot 2023.10-rc4 (Sep 14 2023 - 22:44:30 +0800)
    2. CPU: rv64imafdch_zicbom_zicboz_zicsr_zifencei_zihintpause_zawrs_zba_zbb_zbc_zbs_sstc_svadu
    3. Model: riscv-virtio,qemu
    4. DRAM: 256 MiB
    5. Core: 25 devices, 12 uclasses, devicetree: board
    6. Flash: 32 MiB
    7. Loading Environment from nowhere... OK
    8. In: serial,usbkbd
    9. Out: serial,vidconsole
    10. Err: serial,vidconsole
    11. No working controllers found
    12. Net: No ethernet found.
    13. Working FDT set to 8ef208b0
    14. Hit any key to stop autoboot: 0
    15. Device 0: unknown device
    16. scanning bus for devices...
    17. Device 0: unknown device
    18. starting USB...
    19. No working controllers found
    20. No ethernet found.
    21. No ethernet found.
    22. =>

    5. 準備Linux Kernel

    下載路徑: https://github.com/torvalds/linux

    編譯安裝方法: 

    1. export ARCH=riscv
    2. export KBUILD_OUTPUT=kbuild_out
    3. export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
    4. make defconfig
    5. make -j24 2>&1 | tee build.log
    1. $ ls kbuild_out/arch/riscv/boot/Image
    2. kbuild_out/arch/riscv/boot/Image

    6. 準備rootfs

    rootfs 作爲linux kernel 啓動阶段必不可少資源, 對於Linux 正常運行必不可少. busybox 是更爲常用的rootfs 制作方法,但是編譯相對較爲復雜,對於小白來說有一定難度.本小節基於buildroot 搭建rootfs, 提供一個更便捷的方法.

    下載路徑: https://github.com/buildroot/buildroot

    編譯安裝方法: 

    前方已經準備好openSBI firmware 和 Linux Kernel Image, build 前先將兩個選項置爲no, 若爲yes, 自動從網絡下載編譯openSBI, Linux, 等待很久且沒必要.

    1. $ git diff
    2. diff --git a/configs/qemu_riscv64_virt_defconfig b/configs/qemu_riscv64_virt_defconfig
    3. index 52ad87fa7c..ff330d3505 100644
    4. --- a/configs/qemu_riscv64_virt_defconfig
    5. +++ b/configs/qemu_riscv64_virt_defconfig
    6. @@ -17,14 +17,14 @@ BR2_ROOTFS_POST_SCRIPT_ARGS="$(BR2_DEFCONFIG)"
    7. BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_1=y
    8. # Kernel
    9. -BR2_LINUX_KERNEL=y
    10. +BR2_LINUX_KERNEL=n
    11. BR2_LINUX_KERNEL_CUSTOM_VERSION=y
    12. BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.1.44"
    13. BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y
    14. BR2_LINUX_KERNEL_IMAGE=y
    15. # Bootloader
    16. -BR2_TARGET_OPENSBI=y
    17. +BR2_TARGET_OPENSBI=n
    18. BR2_TARGET_OPENSBI_CUSTOM_VERSION=y
    19. BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.2"
    20. BR2_TARGET_OPENSBI_PLAT="generic"

    編譯安裝方法: 

    1. export ARCH=riscv
    2. export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
    3. make qemu_riscv64_virt_defconfig
    4. make -j24 2>&1 | tee build.log

    7. 測試

    上述準備完成後, buildroot 路徑下自動生成"output/images/start-qemu.sh", 執行該文件即可.

    由於沒有使用buildroot 自動生成opensbi 和 linux kernel image, 需修改fw_.elf 和 kernel Image

    爲實際路徑. 如下圖所示.

    exec qemu-system-riscv64 -M virt -bios fw_jump.elf -kernel $LINUX_IMG_DIR/Image -append "rootwait root=/dev/vda ro" -drive file=rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netd    ev user,id=net0 -device virtio-net-device,netdev=net0 -nographic  ${EXTRA_ARGS} "$@"
    
    1. [ 0.509136] devtmpfs: mounted
    2. [ 0.547883] Freeing unused kernel image (initmem) memory: 2192K
    3. [ 0.548763] Run /sbin/init as init process
    4. [ 0.775879] EXT4-fs (vda): warning: mounting unchecked fs, running e2fsck is recommended
    5. [ 0.802712] EXT4-fs (vda): re-mounted 677f7b94-119c-490a-94b9-9b9cb4651848 r/w. Quota mode: disabled.
    6. Starting syslogd: OK
    7. Starting klogd: OK
    8. Running sysctl: OK
    9. Seeding 256 bits and crediting
    10. Saving 256 bits of creditable seed for next boot
    11. Starting network: [ 1.455587] test_kthread test_kthread_func
    12. udhcpc: started, v1.36.1
    13. udhcpc: broadcasting discover
    14. udhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2
    15. udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400
    16. deleting routers
    17. adding dns 10.0.2.3
    18. OK
    19. Welcome to Buildroot
    20. buildroot login: [

  • 相关阅读:
    Java笔记七(封装,继承与多态)
    java(反射机制)
    发布npm包质量分测试
    总结开发中一些数据处理方法的封装
    【软件工程之美 - 专栏笔记】36 | DevOps工程师到底要做什么事情?
    MySQL 日志管理、备份与恢复
    滴滴开源的APM方案Dokit接入
    Log4j2漏洞复现&补丁绕过
    【小程序】微信小程序设置globalData全局数据
    在Python中使用正则表达式
  • 原文地址:https://blog.csdn.net/silencewly/article/details/132939821