ARM64平台下WFE和SEV相关指令解析
WFE
等待事件(Wait For Event)指令。
ARM架构下,有一个全局的事件寄存器(Event Register),系统中的每一个CPU核在这个寄存器上都有对应的位。
当当前CPU执行WFE指令的时候,如果事件寄存器对应当前CPU的位没有被设置(也就是0),则当前CPU核会进入低功耗模式,会被挂起,不会再执行其它操作;而如果事件寄存器对应当前CPU的位被设置了(也就是1),则会将事件寄存器对应当前CPU的位清空(设置成0),然后立即返回,继续执行下面的指令,不会进入低功耗模式。
如果当前CPU核通过WFE指令进入了低功耗模式,那么只有在如下情况下才可能被重新唤醒:
- 发生了IRQ中断(前提是没有被屏蔽);
- 发生了FIQ中断(前提是没有被屏蔽);
- 发生了SError中断(前提是没有被屏蔽);
- 事件寄存器对应当前CPU核的位被置位(设置成1),如果是通过这种方式唤醒的,唤醒后会立即将事件寄存器对应当前CPU核的位清0。
注意,WFE指令到底让CPU核干什么,其实是没有具体定义的,只要不让内存丢失数据就行。所以,其可以只是一条空(NOP)指令,或者像绝大多数Arm核心设计的那样,可以进入低功耗状态。但是,如果实现了WFE指令将当前CPU核切换到低功耗模式,那就一定要实现后面说的SEV指令,否则该CPU核有可能会一直不被唤醒。
在Arm架构下,Linux内核的自旋锁就使用到了WFE指令。
WFI
等待中断(Wait For Interrupt)指令。
和前面说的WFE指令不同,执行WFI指令后,当前CPU核会立即进入低功耗状态。
如果当前CPU核通过WFI指令进入了低功耗模式,那么只有在如下情况下才可能被重新唤醒:
- 发生了IRQ中断(不管有没有被屏蔽);
- 发生了FIQ中断(不管有没有被屏蔽);
- 发生了SError中断(不管有没有被屏蔽)。
SEV
发送事件(Send Event)指令。
这条指令将想系统中的所有CPU核发送事件。对应系统中的每个CPU核,设置事件寄存器(Event Register)相应的位。如果某个CPU核正在等待事件(WFE),那么该CPU核会被立即唤醒,并清除掉表示该CPU的事件寄存器相应的位。
SEVL
发送本地事件(Send Event Locally)指令。
不同于前面说的SEV指令,这条指令只会向当前CPU核心发送。如果是多核CPU那也只向当前核心,不会向CPU内的其它核心发送。
值得注意的是,这条指令只有在支持ARMv8指令集之后的处理器中才有效。
其它
从前面的分析可以看出来,可以通过SEVL指令来设置事件寄存器对应当前CPU核的位,可以通过SEV指令来设置事件寄存器对应所有CPU核的位,可以通过WFE指令来清空事件寄存器对应当前CPU核的位。
在ARMv8指令集中,还添加了一种情况,用来发送事件。当全局监视器标记的对某段内存的独占访问被清空后,将向所有标记了对该段内存独占访问的CPU核都发送事件。也就是说,当系统在多个CPU核上,通过LDREX或者LDXR指令读取某段内存后,系统全局监视器会将该段内存标记为独占(Exclusive),这之后又调用了WFE指令进入低功耗模式了。当系统中又有一个CPU,通过STREX或者STXR指令对该段内存进行了写入,这将清空全局监视器对该段内存的独占标记为,那么系统会自动给前面那些CPU核发送事件,将它们唤醒。
ARM64平台下WFE和SEV相关指令解析相关推荐
- idea java jni 调试_IntelliJ IDEA平台下JNI编程(一)—HelloWorld篇
JNI(Java Native Interface),出于学习JNI的目的,为了能够更方便快速地运行程序.本文的是在IDEA中进行,而不在AndroidStudio,这样能够对NDK的工作过程有个更深 ...
- BEA WebLogic平台下J2EE调优攻略--转载
BEA WebLogic平台下J2EE调优攻略 2008-06-25 作者:周海根 出处:网络 前 言 随着近来J2EE软件广泛地应用于各行各业,系统调优也越来越引起软件开发者和应用服务器提供 ...
- windows平台下VLC2.0.5编译
windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...
- Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy
Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy 原文连接: https://blog.csdn.net/wsj18808050/article/details/ ...
- linux平台下QtCreator中集成Valgrind系列工具
linux平台下QtCreator中集成Valgrind系列工具 ###1.valgrind 安装 valgrind 安装 2.打开QtCreator >> Analyze 你就会发现 这 ...
- linux oraclerman自动备份,Linux平台下的Oracle自动备份案例(使用RMAN)
有个童鞋问rman的自动备份脚本程序,我之前有写过exp备份指定方案自动备份案例(Linux平台下的Oracle自动备份案例(使用exp工具) http://www.linuxidc.com/Lin ...
- windows平台下vlc编译之六:vlc-0.9.8a的编译
请移步https://higoge.github.io/,所有下载资料在那个博客都能找到.谢谢. --------------------------------------------------- ...
- Window平台下的Android的环境配置
Android环境配置 在本文写作时,Android SDK版本已经为2.2.现在我们来看一看在Windows平台下Android环境的配置步骤: 在配置之前需要下载的软件包如下: JDK 1.6+ ...
- jboss jta mysql_JBoss平台下JTA与JMS实验软件架构8
1 JTA 简介: Java Transaction API,JTA Transaction 是指由J2EE Transaction manager 去管理的 事务.通过调用UserTransacti ...
最新文章
- 团队项目第一次冲刺 第二天
- bom中的event以及一些window的API
- 微软2019暑期实习笔试题
- 安卓手机文件管理器简单横向评比 - imsoft.cnblogs
- OMNet++新建工程及运行
- 软件测试设计与开发,软件测试技术·测试设计与开发.ppt
- 气泡为何是球形?这是一个数学问题!
- linux进程泄露命令明文参数,sshpass 使Linux可以明文参数输入SSH密码(示例代码)
- 单用户修改root密码--redhat7.2 or centos7
- 数据结构笔记(三)-- 链式实现顺序表
- mybatis传参——parameterType
- 从维密天使到编程大拿,她的彪悍人生不需要解释!
- WPF 自定义分页控件TextBox分页页数只输入数字验证
- 1000+常用Python库大全,太实用了!
- Syzkaller最后一步运行./bin/syz-manager 无法启动虚拟机 failed to create instance: failed to read from qemu: EOF
- 《CMS后台系统》项目实战 详细分解
- 多重积分积分区域奇偶对称性化简积分
- c语言陶陶摘苹果数组,关于新手数组:样题:陶陶摘苹果
- pmp证书报考流程+pmp备考+pmp学习干货+pmp指南汇总
- paraview管道:PipeLine
热门文章
- C语言教辅书答案,《C语言程序设计上机指导与习题解答》任正云 主编;李素若_孔网...
- 数字图书馆系统架构研究评述
- 虚拟化技术可以将一台物理服务器虚拟成,服务器虚拟化技术在实验室中的应用...
- java高级工程师_java 初级、中级、高级工程师等 如何区分?
- ERP软件排名、如何选择适合自己企业的软件?
- MysQL高级SQL语句|进阶语句|select语句(一)【图文细解】
- Linux系统安装hadoop教程
- 怎么样用ssh远程登录阿里云ecs服务器不成功解决方案
- WannaCry勒索病毒安全加固工具
- OSChina 周二乱弹 —— 约会奇才