zoukankan      html  css  js  c++  java
  • RISC-V GNU 工具链:安装与使用

    1. 安装Wmware和unbuntu,我安装的是Wmware workstation pro 12.1.1 build-3770994, unbuntu 是18.04.2 amd版本, ubuntu-18.04.2-desktop-amd64.iso

    2. 安装好unbuntu后,在/home/{username}目录里面创建目录riscv, 我的用户名是kaguo,所以创建的目录就是/home/kaguo/riscv

    3.  cd /home/kaguo/riscv , 进入riscv目录后,执行以下命令,安装一些编译riscv工具链需要的库。

    sudo apt-get 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

    详见:https://github.com/riscv/riscv-gnu-toolchain

    建议把ubuntu的源镜像改为阿里云的,我开始用默认的会遇到 libtool库不能更新的问题。请参考

    https://yq.aliyun.com/articles/639051

    可以用下面命令先安装vim和gvim

    sudo apt-get install vim
    sudo apt-get install vim-gtk

    4. 在riscv目录中执行以下命令,

         sudo apt install git //首先安装git

         git clone https://github.com/riscv/riscv-tools.git


    接着你可以用下面的命令

    $ git submodule update --init --recursive

    将会下载下面的几个模块

    • Spike, the ISA simulator
    • riscv-tests, a battery of ISA-level tests
    • riscv-opcodes, the enumeration of all RISC-V opcodes executable by the simulator
    • riscv-pk, which contains bbl, a boot loader for Linux and similar OS kernels, and pk, a proxy kernel that services system calls for a target-machine application by forwarding them to the host machine

    但是如果网络环境不好,可以使用下面命令一个模块一个模块单独下载:

    git clone --recursive https://github.com/riscv/riscv-openocd.git
    git clone --recursive https://github.com/riscv/riscv-isa-sim.git
    git clone --recursive https://github.com/riscv/riscv-opcodes.git
    git clone --recursive https://github.com/riscv/riscv-pk.git
    git clone --recursive https://github.com/riscv/riscv-tests.git
    

    5.下载riscv gun toolchain,

    在目录/home/kaguo/riscv,执行

    git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

    或者

    git clone https://github.com/riscv/riscv-gnu-toolchain
    cd riscv-gnu-toolchain
    git submodule update --init --recursive

    将会下载riscv gun工具链,网络环境不好的化,可以按下面的方法,一个模块一个模块单独下载:

    git clone https://github.com/riscv/riscv-gnu-toolchain
    cd riscv-gnu-toolchain
    git clone --recursive https://github.com/riscv/riscv-qemu.git
    git clone --recursive https://github.com/riscv/riscv-newlib.git
    git clone --recursive https://github.com/riscv/riscv-binutils-gdb.git
    git clone --recursive https://github.com/riscv/riscv-dejagnu.git
    git clone --recursive https://github.com/riscv/riscv-glibc.git
    git clone --recursive https://github.com/riscv/riscv-gcc.git

    因为这样下载的目录和前一种方式不同,主要是qemu和gdb,binutils三个模块,可以进行一些copy工作,使得qemu, riscv-binutils,riscv-gdb三个目录有数据,否则编译会出错。

    cd riscv-qemu
    cp -a * ../qemu
    cd riscv-binutils-gdb
    cp -a * ../riscv-gdb
    cp -a * ../riscv-binutils

    6.先编译riscv gun toolchain,再编译riscv tools,否则pk模块会编译出错

    cd /home/kaguo/riscv/riscv-tools/riscv-tools/riscv-gnu-toolchain,

    vim ~/.bashrc

    在最后增加两行,

    export  RISCV="/home/kaguo/riscv/riscv-tools/riscv-gnu-toolchain"
    export PATH=$PATH:$RISCV/bin
    然后source ~/.bashrc
    现在用下面的命令开始编译riscv gun tool chain
    ./configure --prefix=$RISCV
    make
    https://github.com/riscv/riscv-gnu-toolchain
    这样会编译出64位的gcc riscv工具链,如果想同时产生32位工具链,可以用下面的命令

    ./configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d
    make


    如果出现ifconfig不能找问题,安装net-tools

     sudo apt-get install net-tools
    7.  回到上一级目录,cd /home/kaguo/riscv/riscv-tools/riscv-tools/
    执行下面命令编译riscv tools
    ./build.sh
    编译完后,大部分可以执行文件都会安装到$RISCV/bin目录,单似乎pk的默认没有安装。
    如果遇到下面错误,可以删除openocd 目录,用git clone --recursive https://github.com/riscv/riscv-opcodes.git 重新下载。
    Configuring project riscv-openocd
    configure: error: cannot find install-sh, install.sh, or shtool in ".." "../.." "../../.."
    进入 cd /home/kaguo/riscv/riscv-tools/riscv-tools/riscv-pk/build
    cp pk dummy_payload config.status bbl_payload bbl /home/kaguo/riscv/riscv-tools/riscv-tools/riscv-gnu-toolchain/bin
    把pk的可执行文件copy到$RISCV/bin目录。
    8. 最后一步,测试运行。
    编写hello.c文件
    #include <stdio.h>
    int main(void)
    {
            printf("Hello World!
    ");
            return 0;
    }
    
    
    编译hello.c,生产riscv的可执行文件hello
    riscv64-unknown-elf-gcc  -o  hello hello.c
    这时候的 hello,并不能用./hello执行,因为它是riscv asi的机器码,而我们的计算机是x86平台,我们可以spike模拟器来执行该文件。
    spike pk hello
     结果为:
    kaguo@ubuntu:~/riscv/riscv-tools/riscv-tools$ spike pk hello
    bbl loader
    Hello World!
    
    注意:因为spike默认要分配2G的内存,所以我们要给虚拟机分配2G以上的内存空间,否则会出现下面的错误,我为ubuntu分配的内存是4G。
    kaguo@ubuntu:~/riscv/riscv-tools/riscv-tools/riscv-gnu-toolchain$ spike
    terminate called after throwing an instance of 'std::runtime_error'
    what(): couldn't allocate 2147483648 bytes of target memory
    Aborted (core dumped)

     spike -m128 pk hello
    或者我们可以用m参数,每次制定为spike分配的内存数量。





  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/10799553.html
Copyright © 2011-2022 走看看