博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARM WFI和WFE指令【转】
阅读量:6979 次
发布时间:2019-06-27

本文共 1708 字,大约阅读时间需要 5 分钟。

 

本文转载至:

 

1. 前言

 

蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂。最近准备研究CPU idle framework,由于WFI是让CPU进入idle状态的一种方法,就下决心把它们弄清楚。

WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby模式的指令,由ARM architecture定义,由ARM core实现。听着挺简单,但怎么会有两个指令?它们的区别是什么?使用场景是什么?深究起来,还挺有意思,例如:能想象WFE和spinlock的关系吗?

2. WFI和WFE

1)共同点

WFI和WFE的功能非常类似,以ARMv8-A为例(参考DDI0487A_d_armv8_arm.pdf的描述),主要是“将ARMv8-A PE(Processing Element, 处理单元)设置为low-power standby state”。

需要说明的是,ARM architecture并没有规定“low-power standby state”的具体形式,因而可以由ARM core自行发挥,根据ARM的建议,一般可以实现为standby(关闭clock、保持供电)、dormant、shutdown等等。但有个原则,不能造成内存一致性的问题。以 ARM core为例,它把WFI和WFE实现为“put the core in a low-power state by disabling the clocks in the core while keeping the core powered up”,即我们通常所说的standby模式,保持供电,关闭clock。

2)不同点

那它们的区别体现在哪呢?主要体现进入和退出的方式上。

对WFI来说,执行WFI指令后,ARM core会立即进入low-power standby state,直到有WFI Wakeup events发生。

而WFE则稍微不同,执行WFE指令后,根据Event Register(一个单bit的寄存器,每个PE一个)的状态,有两种情况:如果Event Register为1,该指令会把它清零,然后执行完成(不会standby);如果Event Register为0,和WFI类似,进入low-power standby state,直到有WFE Wakeup events发生。

WFI wakeup event和WFE wakeup event可以分别让Core从WFI和WFE状态唤醒,这两类Event大部分相同,如任何的IRQ中断、FIQ中断等等,一些细微的差别,可以参考“DDI0487A_d_armv8_arm.pdf“的描述。而最大的不同是,WFE可以被任何PE上执行的SEV指令唤醒。

所谓的SEV指令,就是一个用来改变Event Register的指令,有两个:SEV会修改所有PE上的寄存器;SEVL,只修改本PE的寄存器值。下面让我们看看WFE这种特殊设计的使用场景。

3. 使用场景

1)WFI

WFI一般用于cpuidle。

2)WFE

WFE的一个典型使用场景,是用在spinlock中(可参考arch_spin_lock,对arm64来说,位于arm64/include/asm/spinlock.h中)。spinlock的功能,是在不同CPU core之间,保护共享资源。使用WFE的流程是:

a)资源空闲

b)Core1访问资源,acquire lock,获得资源

c)Core2访问资源,此时资源不空闲,执行WFE指令,让core进入low-power state

d)Core1释放资源,release lock,释放资源,同时执行SEV指令,唤醒Core2

e)Core2获得资源

以往的spinlock,在获得不到资源时,让Core进入busy loop,而通过插入WFE指令,可以节省功耗,也算是因祸(损失了性能)得福(降低了功耗)吧。

 

原创文章,转发请注明出处。蜗窝科技,。

你可能感兴趣的文章
使用CSS 3创建不规则图形
查看>>
SCOM 2007 R2监控系统安装部署(三)安装SCOM报表服务器和审计服务器
查看>>
服务契约
查看>>
Lync Server 2010标准版系列PART6:启用Lync
查看>>
.net framework3.5新特性1:Lambda表达式
查看>>
虚拟化系列-Citrix XenServer 6.1 网络管理
查看>>
是谁令我离开生活了16年的广州
查看>>
MySQL数据库的主从同步实现及应用
查看>>
阿里游戏云与Intel,iTechClub以及巨人网络共同发布的“TOP游戏”云生态培育计划合作...
查看>>
Hyper-V2:向VM增加虚拟硬盘
查看>>
解决 vs2010 安装过程 提示序列号非法问题
查看>>
flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作
查看>>
[转载]AxureRP 7超强部件库下载
查看>>
fiddler https
查看>>
ASP.NET 2.0中合并 GridView 的表头单元格(转)
查看>>
Bboysoul's Vim使用指南
查看>>
专业的程序员需要具备的思考能力:写一个程序需要注意多少细节问题
查看>>
Android--使用SharedPreferences
查看>>
PXE 自动安装物理机 (DHCP服务由路由提供, 不能再配置)
查看>>
怪异的StackOverflowException异常
查看>>