QEMU
一种计算机系统模拟软件,在GNU/Linux平台上使用广泛。
支持多种体系结构,例如RISC-V 32 64等
QEMU有两种主要运作模式:

  • User mode:直接运行应用程序。
  • System mode:模拟整个计算机系统,包括中央处理器及其它周边设备。

使用riscv gcc编译代码
-march:编译生成的程序可以运行在RISC-V 32位系统上并且支持整数乘法原子性指令集。
-mabi=ilp:一个长整数支持多少位

riscv64-unknown-elf-gcc -march=rv32ima -mabi=ilp32 hello.c

生成出来的可执行文件

不能在linux上直接执行

应该把此软件加载到RISCV板子上去运行
或者使用模拟器运行

qemu-riscv32 ./a.out

上述是在user mode下运行,只模拟到了Application层。开发操作系统时应该是system mode。

项目构造工具

  • make:一种自动化管理工具
  • makefile,配合make,用于描述构建工程过程中所管理的对象以及如何构造工程的过程。
  • 隐式查找:当前目录下按顺序找寻文件名为:GNUmakefile、makefile、Makefile的文件。
  • 显示查找:-f。
  • makefile:由一条或多条规则组成。

每条规则的组成

  • target:目标,可以是obj文件也可以是可执行文件。
  • -prerequisites:生成target所需要的依赖。
  • command:为了生成target需要执行的命令,可以有多条。

例如:

hello:hello.cgcc hello.c -o hello

make的运行

汇编语言

汇编语言(Assembly language)是一种低级语言。
缺点:

  • 难读
  • 难写
  • 难移植
    优点:
  • 灵活
  • 强大
    汇编语言的应用场景:
  • 需要直接访问底层硬件的地方
  • 需要对性能执行极致优化的地方

汇编语言语法介绍(GNU版本)
一个完整的RISC-V汇编程序(也就是一个.s文件,大写的S包含一些预处理指令,例如#include #define等,小写的s就是纯汇编指令构成的文件)由多条语句(statement)组成。
一条典型的RISC-V汇编语句由3部分组成。
[label:][operation][comment]

  • label(标号):GNU汇编中,任何以冒号结尾的标识符都会被认为是一个标号。相当于为一个地址取了一个名字(每条机器指令加载到CPU中都是有一个地址的)。
  • operation:可以有多种类型。(1)instruction(指令):直接对应二进制机器指令的字符串。(2)pseudo-instruction(伪指令):为了提高代码编写的效率,可以用一条伪指令指示汇编器产生多条实际的指令。(3)directive(指示/伪操作):通过类似指令的形式(以.开头),通知汇编器如何控制代码的产生等,不对应具体的指令。(4)macro:采用.macro/.endm自定义的宏。
  • comment(注释):常用方式以#开始到当前行结束。

RISC-V汇编指令操作对象

  • 寄存器:32个通用寄存器,x0~x31。在RISC-V中,Hart(处理器执行的最小单元)在执行算术逻辑运算时所操作的数据必须直接来自寄存器。
  • 内存:Hart可以执行在寄存器和内存之间的数据读写操作。读写操作使用字节(Byte)为基本单位进行寻址。RV32可以访问最多232个字节的内存空间。

  • 最右边是低地址位,最左侧是高地址位。
  • x0寄存器不能对它进行写操作,进行读操作时永远读出来为零。
  • pc寄存器不能对它进行直接的访问。

RISC-V汇编指令编码格式

  • 指令长度:ILEN1 = 32bits (RV32I)
  • 指令对齐:IALIGN = 32bits(RV32I)
  • 32个bit划分为不同的域(field)
  • funct3(占3个bit)/funct7(占7个bit) 和 opcode 一起决定最终的指令类型
  • 指令在内存中按照小端序排列。


opcode一共有7位,第0位和第1位永远是11。
例如ADD指令的opcode

最低两位——第零位和第一位都是11,
接下来2-4位为一组,
再接着5-6位为一组。
对应高位就是01100——OP

主机字节序(HBO Host Byte Order)

  • 一个多字节整数在计算机内存中存储的字节顺序称为主机字节序,或者称为本地字节序。
  • 不同类型CPU的HBO不同,分为大端序(Big-Endian)和小端序(Little-Endian)。

    小端序:数据的低位字节存放在内存的低地址。


六种指令格式

  • R-type(Register):每条指令中有3个fields,用于指定3个寄存器的参数——rs2、rs1(source:源)和rd(destination 存放最终结果的寄存器)。各个寄存器占5个bit,最多能表达32个寄存器。
  • I-type(Immediate):每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为12bits)imm[11:0]。
  • S-type(Store):每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为12bits,但field的组织方式与I-type不同)。用来访问内存的一种指令。
  • B-type(Branch):每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为12bits,但取值为2的倍数)。与分支跳转有关系。
  • U-type(Upper):每条指令含有一个寄存器参数再加上一个立即数参数(宽度为20bits,用于表示一个立即数的高20位)。
  • J-type(Jump):每条指令含有一个寄存器参数再加上一个立即数参数(宽度为20bits)。

要学习的汇编指令分类:

常用的一些伪指令与基本指令的对应关系

RISC-V学习基础(三)相关推荐

  1. C++学习基础三——迭代器基础

    C++学习基础三--迭代器基础 迭代器分为两种:一种是iterator,另一种是const_iterator. 两者都可进行访问容器中的元素,不同之处是: (1)const_iterator类型只能用 ...

  2. 强化学习基础总结(三)

    强化学习基础总结(三) @(Machine Learning) 覆盖以下几个主题: Markov过程 Markov奖励过程 Markov决策过程 MDPs扩展 MDP简介 MDP是用于正式描述强化学习 ...

  3. 第三章_深度学习基础

    文章目录 第三章 深度学习基础 3.1 基本概念 3.1.1 神经网络组成? 3.1.2神经网络有哪些常用模型结构? 3.1.3如何选择深度学习开发平台? 3.1.4为什么使用深层表示? 3.1.5为 ...

  4. 《机器学习系列教程》第三章 深度学习基础

    @[第三章 深度学习基础] 第三章 深度学习基础 3.1 基本概念 3.1.1 神经网络组成? 为了描述神经网络,我们先从最简单的神经网络说起. 感知机 简单的感知机如下图所示: [外链图片转存失败( ...

  5. 独家思维导图!让你秒懂李宏毅2020深度学习(三)——深度学习基础(神经网络和反向传播部分)

    独家思维导图!让你秒懂李宏毅2020深度学习(三)--深度学习基础(神经网络和反向传播部分) 长文预警!!!前面两篇文章主要介绍了李宏毅视频中的机器学习部分,从这篇文章开始,我将介绍李宏毅视频中的深度 ...

  6. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  7. 【完结】有三AI阿里云的深度学习基础课程暂时完结,欢迎扩散学习

    2021年3月份有三AI与阿里天池联合推出了深度学习系列课程, 课程内容包括人工智能与深度学习发展背景,深度学习典型应用,卷积神经网络,循环神经网络,生成对抗网络,深度学习开源框架等内容,目前已经基本 ...

  8. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

  9. 回溯法采用的搜索策略_强化学习基础篇(三十四)基于模拟的搜索算法

    强化学习基础篇(三十四)基于模拟的搜索算法 上一篇Dyna算法是基于真实经验数据和模拟经验数据来解决马尔科夫决策过程的问题.本篇将结合前向搜索和采样法,构建更加高效的搜索规划算法,即基于模拟的搜索算法 ...

  10. 深度学习基础 - 概率的三个公理

    深度学习基础 - 概率的三个公理 flyfish 对于公理的内容 ,不敢有一丝一毫的更改.改公理,再建立另一套体系那都是大神级别的人物. 曾经"概率"的定义是不清晰的,拉普拉斯的古 ...

最新文章

  1. pykafka连接重要使用pykafka,kafka-python的api开发kafka生产者和消费者
  2. 网络工程师_TCP握手之类的
  3. [crypto]-30-The Armv8 Cryptographic Extension在linux中的应用
  4. 如何根据两个顺序构造⼀个唯⼀的⼆叉树?
  5. oracle数据导入sqlldr小例子
  6. python打印目录结构_Python学习笔记(2)——遍历目录结构并打印
  7. HDU-1251-统计难题(字典树)
  8. IIS6.0服务器架站无法访问解决方案总结
  9. CAP 定理 —— 可用性 (Availability) 和分区容忍 (Partition tolerance)
  10. 盒子模型之内边距(HTML、CSS)
  11. 小白都能了解的聚类算法之一(Kmeans与GMM)
  12. PDF拆分页面,免费拆分为多个PDF
  13. 数格子算面积的方法_数格子估算面积与数格点估算面积
  14. 设置不显示桌面上的计算机图标不见了,显示桌面,教您显示桌面图标不见了如何恢复...
  15. php提取bing背景,使用PHP获取必应Bing每日图片
  16. SV绿皮书笔记(四)
  17. C#课程设计(购物平台)
  18. java qo_Java中DAO/DTO/PO/VO/BO/QO/POJO
  19. java算法竞赛:StringBuilder更省空间更快速
  20. xmd:AP transaction timeout: ACK = 0x01, expected=0x02)

热门文章

  1. 三峡大学计算机学院毕业答辩问题,毕业答辩会问点什么问题?
  2. 从Intel和ARM争霸,谈芯片前世今生
  3. 什么是Deno?跟Node.js有何区别?
  4. 兄弟Brother PT-P900W 驱动
  5. 何以从IT时代到DT时代?
  6. 为什么硅谷公司对Android不感冒
  7. Java:实现确定四个3D点是否位于同一平面上算法(附完整源码)
  8. 有榜单有颁奖!还有各路大咖....这场人工智能高峰论坛什么都有丨11.20·北京...
  9. 医嘱计算机录入管理制度,医院病房医嘱计算机录入管理制度.doc
  10. vue 实现手写电子签名/生成图片