一、RISC_V指令集简介
这里主要讨论RV32I,也就是32位整数指令集;与RV32E得我区别是,RV32I拥有32个32bit的通用寄存器。而RV32E只有16个32bit通用寄存器,且只支持M,A,C三种指令拓展。这是由于嵌入式资源稀缺。对于ASIC移除这16个寄存器可以节约大概25%的面积。
二、RISC_V地址空间
1.、内存地址空间在物理实现上可以采用冯诺依曼或者哈佛。寄存器映射部分,大部分外围的寄存器都会被映射到这个空间。
2.通用寄存器
32个寄存器分别被标记为x0~x31 ,其中零号寄存器是制度寄存器。其值一直为0;RISC_V设计目标之一就是对C/C艹等高级语言提供硬件支持,并保持不同处理器之间在ABI层面的相互兼容。关于应用程序二进制接口ABI的介绍可以参考:什么是应用程序二进制接口ABI - 知乎。写得挺好。这里做一下简单总结:
- 定义了系统基本数据类型的数据宽度
ABI 是编译器和链接器遵守的一组规则,以让编译后的程序可以正常工作。不同的操作系统定义了自己的ABI,举个例子,long long型的变量在64位的window和linux下的位宽不同。
- 函数调用约定
函数调用约定里涉及到寄存器怎么使用,参数如何传递(通过堆栈还是用寄存器),谁负责清理堆栈(是调用者清理还是被调用者清理),参数入栈的顺序(从右向左还是其它),栈帧的布局等。调用约定主要是由编译器负责实现的。以下就是RISC_V的通用寄存器功能说明,对函数调用约定做得标准化。ABI文章末尾有讲到帧栈的概念,说明了函数是如何跳转的以及保存的。
3.控制与状态寄存器
特权架构部分对为CSR单独分配了12位的地址空间,在用户指令集中,定义了Zicsr指令集拓展来对CSR进行操作