RISC-V开发 linux下GCC编译自定义指令流程笔记
第一步:利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言
第二步:利用RSIC-V的中的.insn模板进行自定义指令的插入
第三步:RISC-V开发环境的搭建
C语言插入汇编
GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了程序设计。使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉GCC对这些操作有哪些限制条件。
void test(void){input= 1;__asm__ __volatile__ ("movl %1,%0" :"=r" (result) : "r" (input));return 1;}对应的汇编代码如下;
行号 代码 解释
1
7
8 movl $1, input 对应C语言语句input = 1;
9 movl input, %eax 隐式处理
10 #APP GCC插入的注释,表示内嵌汇编开始
11 movl %eax,%eax 我们的内嵌汇编语句
12 #NO_APP GCC 插入的注释,表示内嵌汇编结束
13 movl %eax, result 将结果存入result变量,隐式处理
“movl %1,%0”是指令模板;“%0”和“%1”代表指令的操作数,称为占位符,内嵌汇编靠它们将C语言表达式与指令操作数相对应。“result”和“input”为C语言中的两个变量名。其中result对应着%0,input对应着%1。即movl input result。
在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限制或者说要求。“result”前面的限制字符串是“=r”,其中“=”表示“result”是输出操作数,“r”表示需要将“result”与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是“result”本身,当然指令执行完后需要将寄存器中的值存入变量“result”,从表面上看好像是指令直接对“result”进行操作,实际上GCC做了隐式处理,这样我们可以少写一些指令。“input”前面的“r”表示该表达式需要先放入某个寄存器,然后在指令中使用该寄存器参加运算。
RSIC-V支持自定义指令
核心思想:利用Kito Cheng提供的.insn模板进行开发
第一步:确定opcode RV32指令架构中定义了4种custom指令类型,opcode需使用表格custom-0/custom-1/custom-2/custom-3中的一种:
第二步: 确定指令类型 需要结合指令的功能来进行选择,有6种指令指令格式,分别为R/I/S/B/U/J类型
R型用于寄存器-寄存器间的操作
I型用于短立即数和访存(Load)
操作 S型用于访存Store操作
B型用于条件跳转
U型用于长立即数
J型用于无条件跳转
第三步: 确定指令编码 根据opcode以及指令类型,还需要确定其它字段的编码,比如R-type中,需要确定func3/func7字段的编码。并且编译器不会限制这两个字段的类型,支持我们自定义不同的类型来区分指令
第四步:在C语言中插入该指令
例:自定义一条指令,功能是算术运算,有两个源操作数,所以指令类型为可以选择R-type
对应的.insn模板为: .insn r opcode, func3, func7, rd, rs1, rs2
其中.insn为模板前缀 r代表该指令为R型指令 opcode使用custom-0/custom-1/custom-2/custom-3中的一种,代表这是自定义的指令 func3/func7字段可以自定义
C测试函数:
C代码
#include <stdio.h>
int main() {int a = 0;int b = 0;asm volatile (".insn r 0x7b, 6, 6, %0, %1, x0":"=r"(a):"r"(b)); return 0;
}
汇编文件
main:addi sp,sp,-32sw s0,28(sp)addi s0,sp,32sw zero,-20(s0)sw zero,-24(s0)lw a5,-24(s0)#APP
# 9 "test.c" 1.insn r 0x7b, 6, 6, a5, a5, x0 生成的新指令
# 0 "" 2#NO_APPsw a5,-20(s0)li a5,0mv a0,a5lw s0,28(sp)addi sp,sp,32jr ra反汇编文件00000000 <main>:0: 1101 addi sp,sp,-322: ce22 sw s0,28(sp)4: 1000 addi s0,sp,326: fe042623 sw zero,-20(s0)a: fe042423 sw zero,-24(s0)e: fe842783 lw a5,-24(s0)12: 0c07e7fb .insn 4, 0x0c07e7fb 生成的新指令机器码16: fef42623 sw a5,-20(s0)1a: 4781 li a5,01c: 853e mv a0,a51e: 4472 lw s0,28(sp)20: 6105 addi sp,sp,3222: 8082 ret
insn支持的所有模板如下
R type: .insn r opcode, func3, func7, rd, rs1, rs2+-------+-----+-----+-------+----+-------------+| func7 | rs2 | rs1 | func3 | rd | opcode |+-------+-----+-----+-------+----+-------------+31 25 20 15 12 7 0R type with 4 register operands: .insn r opcode, func3, func2, rd, rs1, rs2, rs3+-----+-------+-----+-----+-------+----+-------------+| rs3 | func2 | rs2 | rs1 | func3 | rd | opcode |+-----+-------+-----+-----+-------+----+-------------+31 27 25 20 15 12 7 0I type: .insn i opcode, func3, rd, rs1, simm12+-------------+-----+-------+----+-------------+| simm12 | rs1 | func3 | rd | opcode |+-------------+-----+-------+----+-------------+31 20 15 12 7 0S type: .insn s opcode, func3, rd, rs1, simm12+--------------+-----+-----+-------+-------------+-------------+| simm12[11:5] | rs2 | rs1 | func3 | simm12[4:0] | opcode |+--------------+-----+-----+-------+-------------+-------------+31 25 20 15 12 7 0SB type: .insn sb opcode, func3, rd, rs1, symbol
SB type: .insn sb opcode, func3, rd, simm12(rs1)+--------------+-----+-----+-------+-------------+-------------+| simm21[11:5] | rs2 | rs1 | func3 | simm12[4:0] | opcode |+--------------+-----+-----+-------+-------------+-------------+31 25 20 15 12 7 0U type: .insn u opcode, rd, simm20+---------------------------+----+-------------+| simm20 | rd | opcode |+---------------------------+----+-------------+31 12 7 0UJ type: .insn uj opcode, rd, symbol+------------+--------------+------------+---------------+----+-------------+| simm20[20] | simm20[10:1] | simm20[11] | simm20[19:12] | rd | opcode |+------------+--------------+------------+---------------+----+-------------+31 30 21 20 12 7 0CR type: .insn cr opcode2, func4, rd, rs2+---------+--------+-----+---------+| func4 | rd/rs1 | rs2 | opcode2 |+---------+--------+-----+---------+15 12 7 2 0
理论知识如上所示
下面为RISC-V开发环境的搭建
拉取码云上的riscv-gnu-toolchain镜像
git clone https://gitee.com/mirrors/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git clone https://gitee.com/mirrors/riscv-dejagnu
git clone -b riscv-gcc-10.2.0 https://gitee.com/mirrors/riscv-gcc
git clone -b riscv-glibc-2.29 https://gitee.com/mirrors/riscv-glibc
git clone https://gitee.com/mirrors/riscv-newlib
git clone -b riscv-binutils-2.35 https://gitee.com/mirrors/riscv-binutils-gdb riscv-binutils
git clone -b fsf-gdb-10.1-with-sim https://gitee.com/mirrors/riscv-binutils-gdb riscv-gdb编译工具链
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
pwd #获取当前路径 src
vi ~/.bashrci
export RISCV="把上面的src放到这里"
export PATH=$PATH:$RISCV/bin
:wqsource ~/.bashrc编译riscv-gnu-toolchainmkdir build
cd build
../configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d
sudo apt install libncurses5-dev
sudo make -j4
make install
至此,C语言文件可以正常编译,但无法执行。
安装QEMU
cdsudo apt-get install libglib2.0-dev ninja-build build-essential zlib1g-dev pkg-config libglib2.0-dev \
binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev \virtualenv libmount-dev libpixman-1-dev
wget https://download.qemu.org/qemu-6.2.0.tar.xz
tar xvJf qemu-6.2.0.tar.xz
cd qemu-6.2.0
mkdir build
cd build
../configure
make -j4 #wait...
之后是获取新指令机器码的一些操作
vi test.c
riscv32-unknown-elf-gcc -S -o test.s test.c #生成汇编文件
riscv32-unknown-elf-gcc -c -o test.o test.c #生成机器码
riscv32-unknown-elf-objdump -d test.o #反汇编查看机器码
riscv32-unknown-elf-gcc test.c -o test #生成可执行文件
../qemu-6.2.0/build/qemu-riscv32 test #在qemu上执行文件
相关文章:
RISC-V开发 linux下GCC编译自定义指令流程笔记
第一步:利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言 第二步:利用RSIC-V的中的.insn模板进行自定义指令的插入 第三步:RISC-V开发环境的搭建 C语言插入汇编 GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了…...
java代码是如何与数据库通信的?
Java代码与数据库通信的过程主要通过Java Database Connectivity(JDBC)来实现。JDBC是Java与数据库之间的标准接口,提供了用于执行SQL语句和处理数据库结果的API。以下是Java代码与数据库通信的详细步骤: 一、导入JDBC库 在Java…...
gateway--网关
在微服务架构中,Gateway(网关)是一个至关重要的组件,它扮演着多种关键角色,包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口: Gateway作为微服务的统一入口,…...
北京数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂
随着北京数字孪生工业互联网可视化技术的深入应用,新型工业化智能制造工厂正逐步迈向智能化、高效化的全新阶段。这项技术不仅实现了物理工厂与数字世界的精准映射,更通过大数据分析、人工智能算法等先进手段,为生产流程优化、资源配置合理化…...
土地规划与区域经济发展:筑基均衡未来的战略经纬
在新时代背景下,土地规划不仅是空间布局的艺术,更是推动区域经济均衡发展的关键引擎。土地资源的合理配置对于激发区域潜能、促进经济结构优化有着重要意义。本文将深入剖析土地规划如何成为促进区域经济均衡发展的强大动力。 一、土地规划与区域经济的…...
wsl(2) -- ubuntu24.04配置
1. 常用脚本及别名配置 修改的文件内容参考另一篇文章常用bash脚本。 修改~/.bashrc,在文件末尾追加以下内容。 # Add by user export MYTOOLS$HOME/tools export MYBINS$HOME/bin # 系统中其他地方已经添加过了,暂不清楚是哪里添加的 #export PATH$M…...
python快速搭建https服务器
本文介绍了在ubuntu操作系统上搭建https服务器的过程 在一台连接到网络的主机上搭建https服务器,假设该主机的ip地址为:10.98.69.174 创建证书example.crt和私钥example.key openssl req -newkey rsa:2048 -nodes -keyout example.key -x509 -days 365…...
网络原理3-应用层(HTTP/HTTPS)
目录 DNSHTTP/HTTPSHTTP协议报文HTTP的方法请求报头、响应报头(header)状态码构造HTTP请求HTTPS 应用层是我们日常开发中最常用的一层,因为其他层:传输层、网络层、数据链路层、物理层这些都是操作系统和硬件、驱动已经实现好的,我们只能使用…...
JVM(HotSpot):堆空间(Heap)以及常用相关工具介绍
文章目录 一、内存结构图二、堆的定义三、堆内存溢出四、堆内存排查工具 一、内存结构图 二、堆的定义 1、通过new关键字创建的对象,都会放到堆空间中。 2、它是线程共享的,堆中的对象都要考虑线程安全问题。 那有同学肯定会问,方法内通过n…...
【Python语言初识(六)】
一、网络编程入门 1.1、TCP/IP模型 实现网络通信的基础是网络通信协议,这些协议通常是由互联网工程任务组 (IETF)制定的。所谓“协议”就是通信计算机双方必须共同遵从的一组约定,例如怎样建立连接、怎样互相识别等,…...
使用root账号ssh登录虚拟机ubuntu
在C:\Users\Administrator\.ssh目录下的config中,添加ubuntu会在根目录中,建立一个root文件夹。在该文件夹中建一个.ssh目录。像免密登录ubuntu设置中,把公钥考进去。在vscode中打开文件夹中选择要打开的文件夹,就可以不需要在ubu…...
五子棋双人对战项目(1)——WebSocket介绍
目录 一、项目介绍 如何实现实时同步对局? 二、WebSocket 1、什么是WebSocket? 2、WebSocket的报文格式 opcode payload len payload data 3、WebSocket握手过程 4、WebSocket代码的简单编写 三、WebSocket 和 HTTP的关系 1、相同点…...
rabbitMq------信道管理模块
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言信道管理的字段申明/删除交换机申明/删除队列绑定/解绑消息的发布消息确认订阅队列取消订阅信道内存管理类打开信道关闭信道/获取指定信道 总结 前言 信道是在…...
如何只用 CSS 制作网格?
来源:how-to-make-a-grid-like-graph-paper-grid-with-just-css 在看 用于打印到纸张的 CSS 这篇文章时,对其中的网格比较好奇,作者提供了 stackoverflow 的链接,就看到了来源的这个问题和众多回复。本文从里面挑选了一些个人比较…...
Linux安装RabbitMQ安装
1. RabbitMQ介绍 1.1 RabbitMQ关键特性 异步消息传递:允许应用程序在不直接进行网络调用的情况下交换消息。 可靠性:支持消息持久化,确保消息不会在系统故障时丢失。 灵活的路由:支持多种路由选项,包括直接、主题、…...
SpringBoot驱动的社区医院信息管理平台
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理社区医院信息平台的相关信息成为必然。开发…...
MyBatis-Plus如何分页查询?
MyBatis-Plus提供了一种简单而强大的分页查询功能,可以通过使用Page对象和Mapper接口中的方法来实现。以下是分页查询的基本步骤: 添加分页插件依赖 确保你的项目中已经添加了MyBatis-Plus的分页插件依赖。 <dependency><groupId>com.bao…...
云原生之容器编排实践-OpenEuler23.09离线安装Kubernetes与KubeSphere
背景 有互联网的日子确实美好,不过有时候,仅仅是有时候,你可能会面临离线部署 Kubernetes 与 KubeSphere 集群的要求。。 我们借助由青云开源的容器平台, KubeSphere 来进行可视化的服务部署。 KubeSphere 是在 Kubernetes 之上…...
构建企业数字化转型的战略基石——TOGAF框架的深度解析
数字化时代的企业变革需求 在全球范围内,数字化转型已成为企业提高竞争力、优化运营流程、提升客户体验的核心战略。数字技术的迅猛发展,不仅改变了传统行业的运作模式,也迫使企业重新思考其业务架构和技术基础设施。TOGAF(The O…...
docker -私有镜像仓库 - harbor安装
文章目录 1、镜像仓库简介2、Harbor简介3、下载与安装3.1、下载3.2、安装3.2.1、上传harbor-offline-installer-v2.8.2.tgz到虚拟机中解压并修改配置文件3.2.2、解压tgz包3.2.3、切换到解压缩后的目录下3.2.4、准备配置文件3.2.5、修改配置文件 4、启动Harbor5、启动关闭命令6、…...
头号积木玩家——软件工程专业职业生涯规划报告
说明:本报告为博主在浙江科技学院(现浙江科技大学)就读软件工程本科专业时,在必修课程《计算机导论》中撰写的报告。(报告主体2021年11月定稿,有删改) 标题说明:在电影《头号玩家》…...
Redis(初步认识和安装)
初识Redis 认识NoSQLSQL结构化:structure关联的:RelationalSQL查询ACID NoSQL非结构化无关联的非SQLBASE 认识Redis安装Redis 认识NoSQL SQL和NoSQL比较 SQL 结构化:structure 数据库中表的字段都有固定的结构 关联的:Relati…...
计算机网络:计算机网络概述:网络、互联网与因特网的区别
文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络,若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…...
网络编程套接字TCP
前集回顾 上一篇博客中我们写了一个UDP的echo server,是一个回显服务器:请求是啥,响应就是啥 一个正常的服务器,要做三个事情: 读取请求并解析根据请求,计算响应把响应写回到客户端 DatagramPacket res…...
Git
Git-2.34.1-64-bitGit-2.34.1-64-bitTortoiseGit-2.4.0.2-64bitTortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN 下载Git-2.34.1-64-bit、TortoiseGit-2.4.0.2-64bit、TortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN,依次安装。 # 配置本地Git的用户名与邮箱 git c…...
【日常记录】现在遇到的Y7000P亮度无法调节问题,无需改动注册表进行调整的方法。
1、winR 2、输入:services.msc 3、找到下面红框内的服务 4、右键后,点击重启任务,重启任务后,再次按热键即可恢复亮度调节。...
ubuntu20.04.6 触摸屏一体机,外接视频流盒子开机输入登录密码触屏失灵问题解决方法
1. 首先直接运行xrandr命令,查看设备的相关信息: 运行之后会显示当前连接设备的屏幕信息,如下图,LVDS和VGA-0,而HDMI屏幕为disconnect,意为没有连接: 2. 设置开机主屏幕显示: xrand…...
师生健康信息管理:SpringBoot技术指南
第3章 系统分析 3.1 需求分析 师生健康信息管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足用户,更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性,…...
手机/平板端 Wallpaper 动态壁纸文件获取及白嫖使用指南
Wallpaper 动态壁纸文件获取及使用指南 目录 壁纸文件获取手机 / 平板使用手机 / 平板效果预览注意事项PC/Mac 使用 1. 壁纸文件获取链接 链接:夸克网盘分享 复制链接到浏览器打开并转存下载即可。 (主页往期视频的 4K 原图和 mpkg 动态壁纸文件…...
【软件工程】模块化思想概述
一、定义 模块化(modularization),也称为模组化,是产品设计以及项目管理中被广泛使用的一种设计理念。 模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部…...
昆山建设网站/地推拉新接单平台
17、字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与…...
做网站外包哪家好/网络营销类型有哪些
前言安全保护几乎对于所有的项目都是一个挑战,对于物联网项目更是如,自普及应用以来物联网业内已经发生过多起安全事故。作为物联网通信协议事实标准,MQTT 保持着较高的安全性,提供了多层次的安全设计:传输层ÿ…...
怎么做多个域名指向一个网站/外贸谷歌推广怎么样
可以使用以下 SQL 查询来实现: SELECT teacher_id, teacher_name, title, course_name, evaluation, evaluation_level FROM teachers JOIN courses ON teachers.teacher_id courses.teacher_id其中,teachers 表存储教师的信息,包括教师号、…...
wordpress qoob/seo算法
使用场景:在操作应用时常见toast弹框,通过toast弹框信息的获取判断当前的某个操作是否成功 引用的包:from selenium.webdriver.support import expected_conditions as EC,\expected_conditions from selenium.webdriver.common.by import By…...
做网站哪一家公司好/营销网站建设大概费用
在皕杰报表的函数中,数据集函数和单元格函数都有sum求和函数,但其用法是不同的。我们先看两个函数的说明: 一、数据集函数sum 函数说明:从数据集中,从满足条件的记录中,算出给定字段或表达式的总和 语法&a…...
做网站公众号多少钱/微信管理
十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。 一、Java 基础 1.JDK 和 JRE 有什么区别&a…...