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调试介绍
调试器可以用开源的sifive的freedom studio,具体可以再sifive官网下载到,界面使用eclipse制作,和arm的调试工具很像。或者用其他家的调试工具,
加断点调试
wfi(Wait For Interrupt)
在M 模式运行期间可能发生的同步例外有五种:
⚫ 访问错误异常当物理内存的地址不支持访问类型时发生(例如尝试写入ROM)。
⚫ 断点异常在执行ebreak 指令,或者地址或数据与调试触发器匹配时发生。
⚫ 环境调用异常在执行ecall 指令时发生。
⚫ 非法指令异常在译码阶段发现无效操作码时发生。
⚫ 非对齐地址异常在有效地址不能被访问大小整除时发生。
在C代码加入下面语句,有第三种写法,如下
__asm__(“wfi”); |
__asm__(“ebreak”); |
__asm__(“ecall”); |
详细调试说明看riscv手册
由于笔者很久不在芯片行业工作了,笔力稀疏,敬请谅解,本篇文章算是简单回顾过去的一段岁月,把坑给填上。