【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】
文章目录
- ARMv8 同步异常
- 同步异常指令
- SMC TYPE
上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习
下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令
ARMv8 同步异常
在ARMv8架构中,同步异常主要包括以下几种:
-
Undefined Instruction:未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。
-
Supervisor Call (SVC):这是一种特殊的软件中断,通常用于实现系统调用。应用程序可以通过SVC指令请求操作系统提供服务。
-
Prefetch Abort:Prefetch Abort是由于指令预取出错造成的。例如,当处理器试图从一个不可访问的内存位置获取指令时,就会触发这个异常。
-
Data Abort:当处理器在数据访问过程中发生错误时,会触发Data Abort异常。例如,当试图读取或写入不可访问的内存位置时,或者执行的指令违反了内存保护策略时,就会触发这个异常。
-
SError:系统错误,是ARMv8架构中新引入的一种异常类型,用于报告系统范围内的错误,如 ECC 错误。
-
Breakpoint:当处理器遇到一个断点指令时(BRK),会触发这个异常。这通常用于调试目的。
-
Watchpoint:当处理器访问一个被设为监视点的内存地址时,会触发这个异常。这也主要用于调试目的。
以上这些异常都是同步异常,也就是说,它们是由当前执行的指令直接触发的。处理器会立即停止当前指令的执行,并跳转到对应的异常处理程序。
同步异常指令
Supervisor Call (SVC):如上文介绍。
Hypervisor Call (HVC):这是一种特殊的软件中断,用于从guest OS切换到hypervisor。
Secure Monitor Call (SMC):这是一个特殊的安全调用,用于进行安全状态间的切换,例如:在ARM TrustZone技术中,从非安全世界切换到安全世界,比如从EL1 切换到哦 EL3。
在 mtk 平台上函数 mt_secure_call 是进入EL3 的入口函数,它调用 smc 指令并通过x0~x3传入四个参数。其中x0中是多个位域的一个编码,根据它可以在ATF中注册的runtime serveice 找到对应的处理函数(具体细节请看ATF 专栏)。
static noinline int mt_secure_call(u64 function_id, u64 arg0, u64 arg1, u64 arg2)
{ register u64 reg0 __asm__("x0") = function_id;register u64 reg1 __asm__("x1") = arg0;register u64 reg2 __asm__("x2") = arg1;register u64 reg3 __asm__("x3") = arg2;int ret = 0;asm volatile ("smc #0\n" : "+r" (reg0) :"r"(reg1), "r"(reg2), "r"(reg3));ret = (int)reg0;return ret;
}
GCC 的 noinline 属性可以阻止编译器对某个函数进行内联优化。内联函数是一种优化技术,可以减少函数调用的开销。编译器会将函数的定义直接插入到函数调用的地方,从而避免函数调用的开销。但是,这种优化也会增加程序的大小。
在某些情况下,我们可能不希望编译器对某个函数进行内联优化。例如,该函数可能很大,内联后会导致程序体积过大;或者该函数可能需要被其他模块动态调用,内联后就无法实现。这时,就可以使用noinline属性来阻止编译器对该函数进行内联优化。在GCC中,可以使用__attribute__((noinline))来为函数指定noinline属性,
SMC TYPE
ARM TrustZone技术定义了两种类型的SMC:SMC Type Fast和SMC Type Yield。
-
SMC Type Fast:Fast SMC调用在返回到调用者之前不会让出CPU。这种类型的SMC调用通常用于执行简短且确定的操作,例如读取或写入寄存器。由于Fast SMC调用不会让出CPU,因此它可以快速地完成,并且在返回结果时没有延迟。
-
SMC Type Yield:Yield SMC调用可能会在执行过程中让出CPU,允许其他任务运行。这种类型的SMC调用通常用于执行可能需要一些时间的操作,例如访问存储设备。当Yield SMC调用完成时,它会再次触发一个SMC来返回到调用者。
总的来说,这两种类型的SMC调用主要的区别在于是否会在执行过程中让出CPU。
上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习
下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令
相关文章:
【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】
文章目录 ARMv8 同步异常同步异常指令SMC TYPE 上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 ARMv8 同步异常 在ARMv8架构中,同步异常主要包括以下几种: Un…...
uprobe trace多线程mutex等待耗时
问题背景环境 ubuntu2204 服务器支持debugfs uprobe,为了提升应用程序的性能,需要量化不同参数下多线程主程序等待在mutex上的耗时区别 linux document中对uprobe events的说明如下 uprobetracer.rst - Documentation/trace/uprobetracer.rst - Linux…...
Linux 和 MacOS 中的 profile 文件详解(一)
什么是 profile 文件? profile 文件是 Linux、MacOS 等(unix、类 unix 系统)系统中的一种配置文件,主要用于设置系统和用户的环境变量。 在 shell 中,可以通过执行 profile 文件来设置用户的环境变量。shell 有两种运…...
不用技术代码,如何制作成绩查询系统?
为了解决学校无力承担传统学生考试成绩查询平台的高昂费用,老师们可以考虑使用易查分这样的工具来免费制作一个学生考试成绩查询平台。易查分是一种简单易用的在线成绩查询系统,可以帮助老师们快速创建一个个性化的学生考试成绩查询平台。 使用易查分制作…...
flinksql sink to sr often fail because of nullpoint
flinksql or DS sink to starrocks often fail because of nullpoint flink sql 和 flink ds sink starrocks 经常报NullpointException重新编译代码 并上传到flink 集群 验证,有效 flink sql 和 flink ds sink starrocks 经常报NullpointException 使用flink-sta…...
达梦数据库:Error updating database. Cause: dm.jdbc.driver.DMException: 数据未找到
异常:Error updating database. Cause: dm.jdbc.driver.DMException: 数据未找到 在使用达梦数据库批量插入或更新数据时,给我报了一个从来没有遇到过的错误,当时我给的一批数据就只有那么几条数据插入不进去,检查了语法和数据类…...
电脑怎么查看连接过的WIFI密码(测试环境win11,win10也能用)
电脑怎么查看连接过的WIFI密码 方法一:适用于正在连接的WIFI密码的查看 打开设置 点击“网络和Internet”,在下面找到“高级网络设置”点进去 在下面找到 “更多网络适配器选项” 点进去 找到 WLAN ,然后双击它 5.然后点击“无线属性” 6.…...
处理数据部分必备代码
1、读取数据出现UTF-8错误 encoding"gbk"2、进行时间系列的平均,并将平均后的数据转化为时间格式 data.index pd.to_datetime(data.index) data data.groupby(data.index.to_period(H)).mean() data.index data.index.to_timestamp() df[hour] df.i…...
layui 集成 ztree异步加载
首先,layui环境搭建,ztree环境引入 ztree的js和css都要引入,我这里暂时用的是core包> 静态,一句话就够了 <!-- 左侧菜单树形组件 --><div class"layui-col-md3"><div class"layui-footer "…...
LeetCode面向运气之Javascript—第27题-移除元素-98.93%
LeetCode第27题-移除元素 题目要求 一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度 举例 输入:nums [3,2,2,3], val 3 输出:2, nums [2,2] 输入:nums [0,1,2,2,3,0,4,2…...
谷歌云 | 电子商务 | 如何更好地管理客户身份以支持最佳的用户体验
【本文由Cloud Ace整理发布。Cloud Ace是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训…...
行业追踪,2023-08-09
自动复盘 2023-08-09 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
视图、存储过程、函数、触发器
1.视图 视图就是一张基于查询的虚拟表,里面定义的其实就是普通的SQL语句。如果一条复杂查询的SQL语句我们频繁的使用,就可以定义视图,方便操作。创建语法如下: CREATE VIEW <视图名> AS <SELECT语句> 2.存储过程 存…...
数学建模学习(10):遗传算法
遗传算法简介 • 遗传算法(Genetic Algorithms)是基于生物进化理论的原理发展起来的一种广为 应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之 间的信息交换,搜索不依赖于梯度信息。它是20世纪70年代初期由美国…...
私域流量整合:社群裂变的综合策略
在私域营销的风潮下,社群裂变已经成为许多企业实现增长的利器。然而,如何通过综合策略将社群裂变的影响力最大化,将成为私域流量整合的重要一环。本文将从新的角度探讨社群裂变的影响力策略,以及如何通过整合私域流量开辟新的增长…...
Redis的RDB持久化
Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。 举个例子,下图展示了一…...
三、MySql表的操作
文章目录 一、创建表(一)语法:(二)说明: 二、创建表案例(一)代码:(二)说明: 三、查看表结构(一)语法ÿ…...
【模型加速部署】—— Pytorch自动混合精度训练
自动混合精度 torch. amp为混合精度提供了方便的方法,其中一些操作使用torch.float32(浮点)数据类型,而其他操作使用精度较低的浮点数据类型(lower_precision_fp):torch.float16(half)或torch.…...
【Qt】信号槽的三种连接方式
【Qt】信号槽的三种连接方式 文章目录 【Qt】信号槽的三种连接方式1. 使用 ui 界面控件2. Qt4 的连接语法3. Qt5 的连接语法 Qt 的信号槽最初来源于函数回调,但注册回调函数有一定局限,安全性也没有保证。所以一定程度上可以说信号槽是对回调机制进行了封…...
Jtti:Ubuntu静态IP地址怎么配置
在 Ubuntu 中配置静态 IP 地址需要编辑网络配置文件。以下是在 Ubuntu 20.04 版本中配置静态 IP 地址的步骤: 打开终端,以管理员身份登录或使用 sudo 权限。 使用以下命令打开网络配置文件进行编辑: sudo nano /etc/netplan/00-installer-…...
从RTSP到Web浏览器:手把手教你用FFmpeg+Nginx搭建低延迟视频流媒体服务器(SpringBoot+Vue3调用示例)
构建企业级低延迟视频流媒体平台:FFmpegNginx全链路技术解析 在智能安防、远程医疗和工业物联网等实时性要求严苛的场景中,如何将传统监控设备的RTSP流稳定、高效地传输到Web浏览器,是许多开发者面临的技术挑战。本文将深入剖析基于FFmpegNgi…...
DoIP协议栈开发必踩的7大陷阱:从CAN迁移以太网的C++工程师速看
更多请点击: https://intelliparadigm.com 第一章:DoIP协议栈开发必踩的7大陷阱:从CAN迁移以太网的C工程师速看 当汽车电子工程师将传统CAN诊断逻辑迁移到DoIP(Diagnostics over Internet Protocol)时,看似…...
5分钟掌握跨平台直播自动录制神器
5分钟掌握跨平台直播自动录制神器 【免费下载链接】LiveAutoRecord 基于 Electron 的多平台直播自动录制软件 项目地址: https://gitcode.com/GitHub_Trending/li/LiveAutoRecord 你是否经常错过心仪主播的精彩直播?是否因为工作繁忙而无法实时观看喜爱的直播…...
别墅主卧套房,不该只是一张床:从睡眠区到衣帽卫浴的完整空间拆解
前段时间去一个工地复检,房子面积不小,主卧套内将近60平。但走进去的感觉很奇怪——床孤零零地摆在正中间,四周空荡荡的,衣帽间缩在角落,卫生间门正对着床头。业主自己也说不上来哪里不对,就是觉得“不像别…...
GD32F103RCT6开发板开箱即用指南:从零配置Keil工程到成功烧录第一个程序
GD32F103RCT6开发板极速上手实战:60分钟完成从拆箱到LED闪烁 刚拿到GD32开发板时,那种既兴奋又忐忑的心情我太熟悉了——盒子里的这块小电路板到底能不能顺利跑起来?作为曾经同样从STM32转向GD32的开发者,我总结出这套一小时极速…...
JPlag代码抄袭检测工具:5分钟快速上手指南,免费开源强力保护代码原创性
JPlag代码抄袭检测工具:5分钟快速上手指南,免费开源强力保护代码原创性 【免费下载链接】JPlag State-of-the-Art Source Code Plagiarism & Collusion Detection. Check for plagiarism in a set of programs. 项目地址: https://gitcode.com/gh_…...
Stable Diffusion WebUI 本地部署与创作:从零到出图
文章目录 Stable Diffusion WebUI 本地部署与创作:从零到出图 一、为什么选 Stable Diffusion 二、环境搭建 2.1 硬件 2.2 安装 2.3 GPU 加速 三、第一次出图 3.1 WebUI 界面分区 3.2 Prompt 3.3 参数推荐 四、模型与 LoRA 4.1 Checkpoint 模型 4.2 LoRA 五、ControlNet 精准控…...
从‘囚徒困境’到‘广告竞价’:聊聊博弈论里的占优策略在实际产品设计中的应用
从‘囚徒困境’到‘广告竞价’:博弈论在产品设计中的实战应用 当两个电商平台同时推出"满300减50"的促销活动时,这背后隐藏着怎样的策略博弈?社交软件中"已读不回"的功能设计,为何会引发用户间的心理博弈&am…...
C++、C语言和JAVA开发的区别
1。面向对象没有java彻底。由于C++要兼容C的内容,而C是面向过程的,所以C不可避免地出现过程影子,并不算是完全的面向对象的程序设计语言。例如总得要有main或winmain之类的过程吧。2。C的移植能力没有java好。 由于C的…...
解放双手:MediaFire 批量下载神器,一键获取海量资源
解放双手:MediaFire 批量下载神器,一键获取海量资源 【免费下载链接】mediafire_bulk_downloader Script for bulk downloading entire mediafire folders for free using python. 项目地址: https://gitcode.com/gh_mirrors/me/mediafire_bulk_downlo…...
