riscv学习笔记

Riscv是现在比较火的一套开源指令集(ISA),这就有很多搞头了,可定制化,不用收费,不像arm虽然很成熟,但是需要几百到几千万不等的授权费,对于小公司来说成本过于高昂。

Sifive是Riscv指令设计者的下场搞的公司(Andrew Waterman 是SiFive 的总工程师和联合创始人),算做的比较好的,卖IP core设计方案,可以再官网www.sifive.com找到不少产品方案,对于初创公司可以买买开发板做做预研,SiFive U54 Core是比较老的一款IP设计方案了,应该是19年推出的。

1. 编译工具的构建

1.1. 下载源码

强烈建议在ubuntu载源码,在windos下使用命令行下载会出现很多问题,下载下来的文件是dos格式而不是unix格式,同时文件的可执行权限会消失,导致最后编译会失败。这也就是为什么之前按照网上教程操作一直不成成功的根本原因。

riscv-gnu-toolchain官方地址:https://github.com/riscv/riscv-gnu-toolchain,不推荐,速度太慢,推荐码云的镜像下载,

$ mkdir project

$ cd project

 

不推荐一次性下载,可能由于网络原因导致中断,每次下载一个模块

$ git clone https://gitee.com/mirrors/riscv-gnu-toolchain

$ cd riscv-gnu-toolchain

//qemu下载速度极慢,链接到git.qemu.org,最后编译没有用到,最后下载

$ git clone --recursive https://gitee.com/mirrors/qemu.git

$ git clone --recursive https://gitee.com/mirrors/riscv-newlib.git

$ git clone --recursive https://gitee.com/mirrors/riscv-binutils-gdb.git

$ git clone --recursive https://gitee.com/mirrors/riscv-dejagnu.git

$ git clone --recursive https://gitee.com/mirrors/riscv-glibc.git

$ git clone --recursive https://gitee.com/mirrors/riscv-gcc.git

 

 

可以看到网络ok,这时候下载qemu模块应该没问题

 

 

 

 

 

$ git clone --recursive https://gitee.com/mirrors/qemu.git

Cloning into 'qemu'...

remote: Enumerating objects: 14297, done.

remote: Counting objects: 100% (14297/14297), done.

remote: Compressing objects: 100% (5356/5356), done.

remote: Total 505779 (delta 10735), reused 11144 (delta 8898), pack-reused 491482

Receiving objects: 100% (505779/505779), 185.08 MiB | 11.71 MiB/s, done.

Resolving deltas: 100% (414927/414927), done.

Checking connectivity... done.

Submodule 'capstone' (https://git.qemu.org/git/capstone.git) registered for path 'capstone'

Submodule 'dtc' (https://git.qemu.org/git/dtc.git) registered for path 'dtc'

Submodule 'roms/QemuMacDrivers' (https://git.qemu.org/git/QemuMacDrivers.git) registered for path 'roms/QemuMacDrivers'

Submodule 'roms/SLOF' (https://git.qemu.org/git/SLOF.git) registered for path 'roms/SLOF'

Submodule 'roms/edk2' (https://git.qemu.org/git/edk2.git) registered for path 'roms/edk2'

Submodule 'roms/ipxe' (https://git.qemu.org/git/ipxe.git) registered for path 'roms/ipxe'

Submodule 'roms/openbios' (https://git.qemu.org/git/openbios.git) registered for path 'roms/openbios'

Submodule 'roms/opensbi' (https://git.qemu.org/git/opensbi.git) registered for path 'roms/opensbi'

Submodule 'roms/qboot' (https://github.com/bonzini/qboot) registered for path 'roms/qboot'

Submodule 'roms/qemu-palcode' (https://git.qemu.org/git/qemu-palcode.git) registered for path 'roms/qemu-palcode'

Submodule 'roms/seabios' (https://git.qemu.org/git/seabios.git/) registered for path 'roms/seabios'

Submodule 'roms/seabios-hppa' (https://git.qemu.org/git/seabios-hppa.git) registered for path 'roms/seabios-hppa'

Submodule 'roms/sgabios' (https://git.qemu.org/git/sgabios.git) registered for path 'roms/sgabios'

Submodule 'roms/skiboot' (https://git.qemu.org/git/skiboot.git) registered for path 'roms/skiboot'

Submodule 'roms/u-boot' (https://git.qemu.org/git/u-boot.git) registered for path 'roms/u-boot'

Submodule 'roms/u-boot-sam460ex' (https://git.qemu.org/git/u-boot-sam460ex.git) registered for path 'roms/u-boot-sam460ex'

Submodule 'slirp' (https://git.qemu.org/git/libslirp.git) registered for path 'slirp'

Submodule 'tests/fp/berkeley-softfloat-3' (https://git.qemu.org/git/berkeley-softfloat-3.git) registered for path 'tests/fp/berkeley-softfloat-3'

Submodule 'tests/fp/berkeley-testfloat-3' (https://git.qemu.org/git/berkeley-testfloat-3.git) registered for path 'tests/fp/berkeley-testfloat-3'

Submodule 'ui/keycodemapdb' (https://git.qemu.org/git/keycodemapdb.git) registered for path 'ui/keycodemapdb'

Cloning into 'capstone'...

remote: Counting objects: 29791, done.

remote: Compressing objects: 100% (11220/11220), done.

 

1.2. 编译

$ mkdir bin

$ cd bin

 

$ ../configure --prefix=/home/zzz/riscv-gcc/riscv-gnu-toolchain/bin

$ make -j16

编译持续约一个小时

 

 

 

 

 

 

 有了编译bin,就可以写C语言并汇编实际了解riscv了。

 

linux x86的解释器无法执行由riscv编译工具链的编译的可执行文件,我们需要再把程序移动到riscv版本的内核上才能运行,这个暂且略过。

使用下面命令编译生成hello.s

riscv64-unknown-elf-gcc -S hello.c

可以看到生成的汇编代码确认都是riscv指令

 

 

2. riscv指令集介绍

参考RISC-V 手册,文件名RISC-V-Reader-Chinese-v2p1_2.pdf,可以网上随便搜下都有,题一嘴,国外的手册确实写的水平高,图文并茂。

附录A RISC-V 指令列表

 

 

3. riscv调试介绍

调试器可以用开源的sifivefreedom studio,具体可以再sifive官网下载到,界面使用eclipse制作,和arm的调试工具很像。或者用其他家的调试工具,

加断点调试

wfi(Wait For Interrupt) 

M 模式运行期间可能发生的同步例外有五种:

访问错误异常当物理内存的地址不支持访问类型时发生(例如尝试写入ROM)。

断点异常在执行ebreak 指令,或者地址或数据与调试触发器匹配时发生。

环境调用异常在执行ecall 指令时发生。

非法指令异常在译码阶段发现无效操作码时发生。

非对齐地址异常在有效地址不能被访问大小整除时发生

 

 

C代码加入下面语句,有第三种写法,如下

__asm__(“wfi”);

 

__asm__(“ebreak”);

 

__asm__(“ecall”);


详细调试说明看riscv手册

 

 

 

 

 由于笔者很久不在芯片行业工作了,笔力稀疏,敬请谅解,本篇文章算是简单回顾过去的一段岁月,把坑给填上。

 

posted @ 2022-12-31 22:12  waterzhm  阅读(388)  评论(0编辑  收藏  举报