新ちゃん 发表于 2020-8-11 16:24:54

Risc-v介绍及工具链实践

本帖最后由 新ちゃん 于 2020-8-21 03:15 编辑

本文目录

[*]RISC-V简介:

[*]RISC-V特点:
[*]Risc-v工具链实践

[*]下载RISCV-tools
[*]下载riscv-gnu-toolchain
[*]编译riscv-gnu-toolchain
[*]编译riscv-tools

[*]编译qemu

RISC-V简介:RISC-V是由加州大学伯克利分校于2010年开发的全新的指令集架构,它不像X86,ARM一样,使用需要巨额的授权费,而是以BSD许可证发布,完全开源,免费开放。同时在设计上吸取了X86, ARM等指令集的经验,并且没有历史包袱,如今备受关注。
加州大学伯克利分校在2015年成立非盈利组织RISC-V基金会,该基金会旨在聚合全球创新力量共同构建开放、合作的软硬件社区,打造RISC-V生态系统,构建硬件版的“Linux”。近年来,谷歌、高通、IBM、英伟达、NXP、西部数据、Microsemi、中科院计算所、麻省理工学院等100多个企业和研究机构先后加入了RISC-V基金会。
而国内自中美贸易战以来,中兴及华为的事件也提醒着我们自主芯片行业的重要性,RISC-V这个全球开放的架构没有知识产权的限制,对中国而言是一个很好的机会。近几年来,中国RISC-V产业联盟和中国开放指令生态系统(RISC-V)联盟相继成立,RiSC-V在国内也在不断铺开发展。
RISC-V特点:
事实上RISC-V并不是第一个免费或发放的指令集架构,在这之前也有诸如openRISC及SPARC等开放的指令集架构。但为什么RISC-V吸引了业界这么多关注呢?RISC-V架构在设计上的各种优点才真正使之得到了众多专业人士的青睐好评和众多商业公司的相继加盟,进而成为至今为止最具备革命性意义的开放处理器架构。
1.简洁
对于目前主流的x86与ARM架构,经过几十年的发展,其架构文档长达几百数千页。其中一个主要的原因是因为其架构的发展的过程也伴随了现代处理器架构技术的不断发展成熟。同时作为商用的架构,为了能够保持架构的向后兼容性,其不得不保留许多过时的定义或是当时为满足特殊场景下的一些设定,从而使得整体冗长。
而近几年推出的RISC-V架构,则具备了后发优势。由于计算机体系结构经过多年的发展已经相对成熟,因此新的RISC-V架构在设计上能够规避一些指令集架构设计上的问题,并且没有背负向后兼容的历史包袱,因此整体上显得相对精简。
目前的“RISC-V架构文档”分为“指令集文档”和“特权架构文档”,两者在篇幅上不过一两百页,熟悉体系结构的工程师仅需一至两天便可将其通读。虽然“RISC-V的架构文档”还在不断地丰富,但是相比“x86的架构文档”与“ARM的架构文档”,RISC-V的篇幅可以说是极其短小精悍。
2.模块化
与以往增量拓展的ISA不同,RISC-V是模块化的。它的核心是一个名为RV32I的基础ISA,运行一个完整的软件栈。RV32I是固定的,永远不会改变。这为编译器编写者,操作系统开发人员和汇编语言程序员提供了稳定的目标。
模块化来源于可选的标准扩展,根据应用程序的需要,硬件可以包含或不包含这些扩展。这种模块化特性使得RISC-V具有了袖珍化、低能耗的特点,而这对于嵌入式应用可能至关重要。以下其指令集的组成:

[*]基本整数指令集
RV32I:基本整数指令集,可被一个或者多个可选指令集扩展进行增强,不能被重新定义。包含了整数计算指令、整数load、整数store和控制流指令。32位地址空间与整数指令,支持32个通用寄存器
RV32E:嵌入式系统设计的RV32I的简化版本,将通用整数寄存器数量减少到16个。
RV64I、RV128I:将整数寄存器和支持的用户地址空间扩展到64/128位
[*]标准扩展指令集
M:标准整数乘法和除法扩展,增加了对保存在整数寄存器中的值进行乘法和除法的指令。
A:标准原子指令扩展,增加了对存储器进行原子的读、修改和写操作的指令,以支持处理器见的同步。包括内存原子操作+加载保留/条件存储
F:标准单精度浮点指令,增加了浮点寄存器、单精度计算指令、单精度load和store指令。
D:标准双精度浮点指令,扩展了浮点寄存器,并增加了双精度计算指令、 load和 store 指令。
C:压缩指令:解决代码体积相对较大的问题,指令编码长度为16位,将一部分普通最常用的32位指令中的信息进行压缩重排,每条短指令必须和一条标准的32 位RISC-V 指令一一对应。
V(增加矢量操作)、B、J、P……


3.易于编译/链接
由于寄存器中的数据访问起来要比存储器中的快得多,为了获得良好的性能,变量应该尽量存放在寄存器而不是内存中,但同时也要注意避免频繁地保存和恢复寄存器,因为它们同样会访问内存。这件事在有许多寄存器的时候变得更加容易,x86-32 只有 8 个寄存器,ARM-32 有 16 个寄存器,而RISC-V 有32 个整型寄存器。毫无疑问,有了更多的寄存器,编译器和汇编程序员的工作会更加轻松。
Risc-v工具链实践
介绍了这么多,决定在Linux上配置一下Risc-v相关的工具链来具体实践一下。
首先下载Riscv-tools
下载RISCV-tools
git clone https://github.com/riscv/riscv-tools.git
cd riscv-tools
git submodule update --init --recursive
submodule 组成:
[*]riscv-openocd:provides on-chip programming and debugging support。(类似于GDB)
[*]riscv-isa-sim:包含Spike, the RISC-V ISA Simulator
[*]riscv-opcodes:The enumeration standard RISC-V instruction opcodes and control and status registers.
[*]riscv-pk:


[*]pk(RISC-V Proxy Kernel): is a lightweight application execution environment that can host statically-linked RISC-V ELF binaries. It’s a proxy kernel that services system calls for a target-machine application by forwarding them to the host machine.
[*]bbl(Berkeley Boot Loader): a boot loader for Linux and similar OS kernels, is a supervisor execution environment for tethered RISC-V systems. It is designed to host the RISC-V Linux port.

[*]riscv-tests:a battery of ISA-level tests


但是由于外网网速原因,可以选择一个一个子模块单独下载,同时下载源可以选择国内码云的镜像。例如:
git clone --recursive https://github.com/riscv/riscv-isa-sim.git
//码云的镜像
git clone --recursive git@git.oschina.net:mirrors/riscv-isa-sim.git

riscv-openocd这个模块也有许多子模块源下载很慢,可以同理考虑在码云中单独下载其子模块
下载riscv-gnu-toolchain介绍:This is the RISC-V C and C++ cross-compiler.(一个交叉编译工具)
相对路经:…/riscv-tools/riscv-gnu-toolchaincd riscv-tools
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
子模块组成:
[*]riscv-qemu:qemu有两种模式

[*]user model: 针对应用程序
[*]system model: 模拟整个电脑系统

[*]riscv-newlib:
[*]riscv-binutils-gdb:
[*]riscv-dejagnu:
[*]riscv-glibc:
[*]riscv-gcc:


鉴于外网网络原因,同理可采用上述方法。(qemu模块存在外网的子模块,可在码云上寻找并单独下载其子模块)
对于riscv-gnu-toolchain,采用子模块单独下载方式有些目录命名有些差异,需要通过进行copy操作,使得qemu, riscv-binutils,riscv-gdb三个目录有数据,否则编译会出错。cd riscv-qemu
cp -a * ../qemu
cd riscv-binutils-gdb
cp -a * ../riscv-gdb
cp -a * ../riscv-binutils
编译riscv-gnu-toolchain
先下载一下依赖库: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
再设置环境变量路径
在/etc/profile文件里,增加
export RISCV=".your.path./riscv-tools/riscv-gnu-toolchain"
export PATH=$PATH:$RISCV/bin
使环境变量生效:source /etc/profile
最后编译riscv-gnu-toolchain
# 需要进入root权限:
sudo su

# 默认生成64位的编译工具:riscv64-unknown-elf-***
./configure --prefix=$RISCV
make -j4

# 附带生成32位的编译工具:riscv32-unknown-elf-***
./configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d
make -j4
编译成功后可以使用对应的gcc工具验证,但是生成的二进制文件不能运行。
riscv64-unknown-elf-gcc helloworld.c -o helloworld编译riscv-toolscd .. //回到riscv-tools目录下
./build.sh

编译完后,大部分可以执行文件都会安装到$RISCV/bin目录,单似乎pk的默认没有,因此手动移动一下
cd riscv-pk/build
cp pk dummy_payload config.status bbl_payload bbl $RISCV/bin
最后利用上一步生成的可执行文件测试一下
spike pk helloworld

# 输出
bbl loader
Hello World!
编译qemu
cd riscv-gnu-toolchain/qemu
#安装依赖库pixman
sudo apt-get install libpixman-1-dev
riscv的qemu有两种:
[*]riscv-64-linux-user为用户模式,可以运行基于riscv指令集编译的程序文件
[*]riscv64-softmmu为镜像模拟器,可以运行基于riscv指令集编译的linux镜像

可以两者都安装(32位的同理)./configure --target-list=riscv64-linux-user,riscv64-softmmu

make -j4 #会生成对应的文件夹riscv64-linux-user,riscv64-softmmu

# 测试用户模式(用之前的二进制文件)
./riscv64-linux-user/qemu-riscv64 helloworld

# 测试镜像模式
./riscv64-softmmu/qemu-system-riscv64 -machine vert -kernel [选择镜像] -nographic

# 如果测试镜像模式时只输出
VNC server running on `127.0.0.1:5900'
则需要安装sdl的依赖库
sudo apt-get install libsdl2-dev
然后需要重新编译生成新的qemu

# 之后可以把qemu的可执行文件放在$RISCV/bin的目录下本篇完,感谢关注:RISC-V单片机中文网
页: [1]
查看完整版本: Risc-v介绍及工具链实践