A64指令集架构之PCS过程调用标准

Arm架构对通用寄存器的使用几乎没有限制。简而言之,整数寄存器和浮点寄存器都是通用寄存器。然而,如果你希望你的代码与他人编写的代码互动,或者与编译器生成的代码互动,那么你需要就寄存器的使用达成一致的规则。对于Arm架构,这些规则被称为过程调用标准(Procedure Call Standard),或者PCS。

PCS规定了:

  1. 用于将参数传递给函数的寄存器。
  2. 用于将值返回给调用函数(称为调用者caller)的寄存器。
  3. 被调用的函数(称为被调用者callee)可以破坏哪些寄存器。
  4. 被调用者不能破坏哪些寄存器。

考虑一个从main()调用的函数foo():

fcd40760ade94ceb9a1791a746e730b8.png

PCS规定第一个参数传递给X0,第二个参数传递给X1,以此类推,直到X7。任何额外的参数都传递到栈stack上。我们的函数foo()接受两个参数:b和c。因此,b将位于W0,c将位于W1。

为什么是W而不是X?因为这些参数是32位类型,因此我们只需要一个W寄存器。

【注意】:在C++中,X0用于传递指向被调用函数的隐式this指针。

接下来,PCS定义了哪些寄存器可以被破坏,哪些寄存器不能被破坏。如果一个寄存器可以被破坏,那么被调用的函数可以在不需要恢复的情况下覆盖它,正如PCS寄存器规则表所示:

e7dcbfc56a95412ea8a4155a6b833cfa.png

92674025036746d38ca905eadfbd26ad.png

例如,函数foo()可以使用寄存器X0到X15而无需保留它们的值。然而,如果foo()想要使用X19到X28,它必须先保存它们到栈,然后在返回之前从栈中恢复它们。

在PCS中,一些寄存器具有特殊的意义:

  • XR - 这是一个间接结果寄存器。如果foo()返回一个结构体,那么结构体的内存将由调用者分配,例如在前面的例子中是main()。XR是指向由调用者分配用于返回结构体的内存的指针。
  • X16和X17(IP0和IP1) - 这些寄存器是过程内调用可破坏寄存器。这些寄存器可以在调用函数和到达函数的第一条指令之间被破坏。链接器使用这些寄存器在调用者和被调用者之间插入veneers。veneers是一小段代码,最常见的例子是用于分支范围扩展。A64中的分支指令是有限的范围。如果目标超出了该范围,那么链接器需要生成一个veneer来扩展分支的范围。
  • FP - 帧指针。
  • LR - X30是用于函数调用的链接寄存器(LR)。

对于X16和X17,在《ARM安全架构——为复杂软件提供保护》一文中的BTI分支目标识别中会被特殊使用。

BTI如何实现?

        PSTATE包含一个字段,BTYPE,记录分支类型。在执行间接分支时,间接分支的类型记录在PSTATE.BTYPE中。以下列表显示了不同分支指令的BTYPE取值:

BTYPE=11:BR、BRAA、BRAB、BRAAZ、BRABZ,使用除X16或X17之外的任何寄存器
BTYPE=10:BLR、BLRAA、BLRAB、BLRAAZ、BLRABZ
BTYPE=01:BR、BRAA、BRAB、BRAAZ、BRABZ,使用X16或X17
        执行任何其他类型的指令,包括直接分支,都会将BTYPE设置为b00。

        为什么要存储两个位?一个简单的实现可以记录间接分支是否正在进行中。然而,记录间接分支的类型进一步限制了查找小工具的可能性。BTI指令的语法包括一个参数,指定它可以被哪些类型的间接分支定位:

39c3450ce71d44b9822f0dd882352526.png

        当BTYPE!=00时,处理器会检查目标指令是否是一个着陆点。如果它不是一个着陆点,或者如果它是错误类型的间接分支,将生成异常。

X16和X17

        架构之所以区分使用X16或X17的间接分支和不使用的间接分支,是因为X16和X17在Arm使用的过程调用标准中具有特殊的意义。它们被称为过程内调用破坏寄存器,或称为IP0或IP1。它们可以被静态链接器用于插入分支范围扩展的veneers,或者被动态链接器用于处理跳转表。

        这对我们而言是相关的,因为这意味着一个函数可能直接通过BL或BLR从调用者进入,也可能通过链接器生成的代码间接进入,使用X16或X17。因此,函数入口的着陆点需要能够接受这两种情况。

【注意】: 我们之前介绍了ALU标志,用于条件分支和条件选择。PCS规定ALU标志在函数调用之间无需保存。

对于浮点寄存器,有一套类似的规则:

f4d8815248924ea084e0ec7852e9245f.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/374793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chronos靶机渗透

Chronos靶机 一.信息收集1.靶机IP地址确认2.目录扫描3.常见漏洞扫描5.web网站探测1.网页2.源代码 二.网站渗透1.命令执行2.抓包---burp suite3.反弹shell 三.提权1.node.js原核污染第一个flag 2.sudo提权第二个flag 一.信息收集 1.靶机IP地址确认 ┌──(root㉿kali)-[/] └─…

【Linux系统化学习】文件描述符fd

目录 基础IO预备知识 C语言文件接口 "w"的方式打开,fputs写入 以"a"的方式打开,fputs写入 使用位图传参 系统调用操作文件 open的使用 第一种形式 第二种形式 write() 文件描述符 文件描述符和进程的关系 默认的三个IO流…

JAVASE进阶:高级写法——方法引用(Mybatis-Plus必学前置知识)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:JAVASE进阶:一文精通Stream流函数式编程 📚订阅专栏:JAVASE进阶 希望文章对你们有所帮助 相信…

SpringCloud--Eureka注册中心服务搭建注册以及服务发现

注意springboot以及springcloud版本&#xff0c;可能有莫名其妙的错误&#xff0c;这里使用的是springboot-2.6.13&#xff0c;springcloud-2021.0.5 一&#xff0c;Eureka-Server搭建&#xff1a; 1.创建项目&#xff1a;引入依赖 <dependency><groupId>org.sp…

MyBatis 分页插件 PageHelper-Dazer007

文章目录 MyBatis 分页插件 PageHelper-Dazer0071、使用方式1.1 原始PageHelper1.2 ruoyi框架封装PageHelper1.3 MyBaits-Plus自带分页&#xff0c;无需PageHeler 2、作用原理3、数据方言实现3.1、MySqlDialect3.2、OracleDialect3.3、SqlServer2012Dialect 3、数据方言实现 My…

【Spring】Spring事务和事务传播机制

文章目录 什么是事务事务的操作Spring 中事务的实现Spring编程式事务Spring 声明式事务 TransactionalTransactional作用Transactional 详解rollbackFor事务隔离级别Spring 事务隔离级别Spring 事务传播机制 什么是事务 事务&#xff08;Transaction&#xff09;是一个程序中一…

嵌入式软件的设计模式与方法

思想有多远&#xff0c;我们就能走多远 4、状态与工作流类设计模式 4.1 状态与事件 行为随条件变化而改变&#xff0c;这里状态切换的模式也称为状态机。有限状态机 (Finite State Machine&#xff0c;FSM) 是由3 个主要元素组成的有向图: 状态、转换和动作。 状态是系统或者…

jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教材管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

python常用的深度学习框架

目录 一&#xff1a;介绍 二&#xff1a;使用 Python中有几个非常受欢迎的深度学习框架&#xff0c;它们提供了构建和训练神经网络所需的各种工具和库。以下是一些最常用的Python深度学习框架&#xff1a; 一&#xff1a;介绍 TensorFlow&#xff1a;由Google开发的TensorF…

LeetCode-第171题-Excel表的序列号

1.题目描述 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 2.样例描述 3.思路描述 遍历时将每个字母与 A 做减法&…

python 动态数据 展示 ,数据是由51单片机发送过来的,温度传感器。

import tkinter as tk import randomimport seriallis[] for i in range(50):lis.append(i1) # 打开串行端口 ser serial.Serial(COM3, 9600) # 9600为波特率&#xff0c;根据实际情况进行调整# 初始化数据 lis [random.randint(15, 35) for _ in range(50)]def update_data…

jenkins 发布远程服务器并部署项目

安装参考另一个文章 配置maven 和 jdk 和 git 注意jdk的安装目录&#xff0c;是jenkins 安装所在服务器的jdk目录 注意maven的目录 是jenkins 安装所在服务器的maven目录 注意git的目录 是jenkins 安装所在服务器的 git 目录 安装 Publish Over SSH 插件 配置远程服务器 创…

信号系统之线性系统详解

1 线性系统 信号描述了一个参数如何随另一个参数变化。例如&#xff0c;电子电路中的电压随时间变化&#xff0c;或图像中随距离变化的亮度。系统是响应输入信号而产生输出信号的任何过程。如图中的框图所示。 有几个规则用于命名信号&#xff1a; 连续信号使用圆括号&#x…

Python tkinter (15) —— PhotoImage

本文主要介绍Python tkinter PhotoImage图像应用及示例。 系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按…

22.HarmonyOS App(JAVA)位置布局PositionLayout使用方法

不常用 在PositionLayout中&#xff0c;子组件通过指定准确的x/y坐标值在屏幕上显示。(0, 0)为左上角&#xff1b;当向下或向右移动时&#xff0c;坐标值变大&#xff1b;允许组件之间互相重叠 布局方式 PositionLayout以坐标的形式控制组件的显示位置&#xff0c;允许组件相…

JVM 性能调优 - Java 虚拟机内存体系(1)

Java 虚拟机我们简称为 JVM&#xff08;Java Virtual Machine&#xff09;。 Java 虚拟机在执行 Java 程序的过程中&#xff0c;会管理几个不同的数据区域。如下图所示&#xff1a; 下面我会介绍这几个数据区的特点。 堆 堆区的几个特点&#xff1a; 线程共享。启动时创建堆…

【MATLAB源码-第131期】基于matlab的淘金优化算法(GRO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 淘金优化算法&#xff08;GoldRush Optimizer&#xff0c;简称GRO&#xff09;是一种启发式优化算法&#xff0c;它受到淘金过程的启发。在淘金过程中&#xff0c;淘金者在河流或矿区中寻找金矿&#xff0c;通过筛选沙砾来寻…

Django通过Json配置文件分配多个定时任务

def load_config():with open("rule.json", rb)as f:config json.load(f)return configdef job(task_name, config, time_interval):# ... 通过task_name判断进行操作if task_name get_data_times:passdef main():config load_config()for task_name, task_value…

SpringBoot多模块项目proguard混淆

SpringBoot多模块项目proguard混淆 前言整活项目目录混淆后的效果图混淆配置混淆配置规则keep相关通配符和关键字keep说明常见问题解决办法效果前言 proguard 是压缩、优化和混淆Java字节码文件的免费的工具。 它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大…

网络故障的排错思路

一、网络排错必备知识 1、网络通信的基础设备和其对应的OSI层次 在网络通信中&#xff0c;了解基础设备如交换机、三层交换机、路由器和防火墙以及它们在OSI七层模型中 的作用至关重要。对于网络管理员和工程师来说&#xff0c;深入了解这些设备在OSI模型中的位置和功能可 …
最新文章