目录
一、ARMv8-A电源管理概述
二、idle管理
2.1 电源和时钟
Standby-待机
Retention-保持
Powerdown-关机
Dormant mode-休眠模式
Hotplug-热插拔
三、动态电压和频率调节
四、汇编语言power指令
五、电源状态协调接口
一、ARMv8-A电源管理概述
许多ARM系统是移动设备,并由电池供电。在这种系统中,优化功耗和总能量使用是关键的设计约束。程序员经常花费大量时间来尝试在这些系统中节省电池寿命。ARM核心内置了许多旨在减少功耗的硬件设计方法。
即使在不使用电池的系统中,节能也可能是一个问题。例如,您可能希望最大限度地减少能源使用以减少消费者的电费、出于环保原因,或者为了最小化设备产生的热量。
能源使用可以分为两个组成部分:静态功耗和动态功耗。
静态功耗(通常称为漏电)发生在核心逻辑或RAM块通电时。一般来说,漏电电流与硅面积成正比,这意味着芯片越大,漏电越高。随着制造几何尺寸变小,漏电占功耗的比例会变得更高。
动态功耗是由于晶体管开关而产生的,是核心时钟速度和每个周期改变状态的晶体管数量的函数。显然,更高的时钟速度和更复杂的核心消耗更多功率。管理功耗感知的操作系统动态地改变核心的功耗状态,平衡当前工作负载的可用计算容量,同时试图使用最少的功耗。其中一些技术动态地开启和关闭核心,或者将它们置于静态状态,不再执行计算。这意味着它们消耗的功耗很少。
【注意】:这里描述的功耗管理类型不是源自体系结构。这里描述的方法是软件功耗管理的常见实践示例。
二、idle管理
空闲管理通常由操作系统控制。在这种情况下,当一个核心处于空闲状态时,操作系统功耗管理(OSPM)将其置于低功耗状态。通常情况下,可供选择的状态有所不同,具有不同的进入和退出延迟,以及与每个状态相关联的不同功耗级别。通常使用的状态取决于核心再次需要的速度。在任何时候可以使用的功耗状态也可能取决于SoC中其他组件的活动,除了核心。每个状态都由进入该状态时时钟门控或电源门控的组件集合定义。
从低功耗状态转换到运行状态所需的时间,称为唤醒延迟,在较深的状态中较长。尽管空闲功耗管理受核心上线程行为的驱动,但OSPM可以将平台置于影响核心之外许多其他组件的状态。如果集群中的最后一个核心变为空闲状态,OSPM可以针对影响整个集群的功耗状态。同样,如果SoC中的最后一个核心变为空闲状态,OSPM可以针对影响整个SoC的功耗状态。选择也受到系统中其他组件的使用的影响。一个典型的例子是当所有核心和任何其他总线masters都处于空闲状态时,将内存置于自刷新状态。
OSPM必须提供必要的功耗管理软件基础设施来确定正确的状态选择。在空闲管理中,当一个核心或集群被置于低功耗状态时,它可以通过核心唤醒事件随时重新激活。也就是说,可以从低功耗状态唤醒核心的事件,例如中断。OSPM不需要明确的命令来将核心或集群重新置于操作状态。即使它们当前处于低功耗状态,OSPM也认为受影响的核心始终可用。
2.1 电源和时钟
可以减少能源使用的一种方法是移除电源,这样可以消除动态和静态电流(有时称为电源门控),或者停止核心的时钟,只消除动态功耗,可以称为时钟门控。ARM核心通常支持几个级别的功耗管理,如下所示:
- Standby-待机。
- Retention-保持。
- Powerdown-关机。
- Dormant mode-休眠模式。
- Hotplug-热插拔。
对于某些操作,需要在移除电源之前和之后保存和恢复状态。保存和恢复所需的时间,以及由此额外工作消耗的功耗,都可以成为软件选择适当的功耗管理活动的重要因素。
包含核心的SoC设备可以具有额外命名的低功耗状态,例如STOP和深度睡眠。这些指的是硬件锁相环(PLL)和电压调节器可以由功耗管理软件控制的能力。
Standby-待机
在待机模式下,核心保持通电,但大部分时钟被停止或者时钟门控。这意味着核心的几乎所有部分都处于静态状态,唯一的功耗是由于漏电电流和用于监视唤醒条件的少量逻辑的时钟。
进入此模式使用的是WFI(等待中断)或WFE(等待事件)指令。ARM建议在执行WFI或WFE之前使用数据同步障碍(DSB)指令,以确保挂起的内存事务在更改状态之前完成。
如果调试通道处于活动状态,则保持活动状态。核心停止执行直到检测到唤醒事件。唤醒条件取决于进入指令。对于WFI,中断或外部调试请求会唤醒核心。对于WFE,存在几种指定的事件,包括集群中的另一个核心执行SEV指令。
Snoop Control Unit(SCU)的请求也可以唤醒集群中用于缓存一致性操作的时钟。这意味着处于待机状态的核心的缓存与其他核心的缓存保持一致(但是待机状态的核心不一定会执行下一条指令)。核心复位始终会强制核心退出待机状态。
各种形式的动态时钟门控也可以在硬件中实现。例如,当检测到空闲状态时,SCU、GIC、定时器、指令流水线或NEON块可以自动时钟门控,以节省功耗。
待机模式可以快速进入和退出(通常在两个时钟周期内)。因此,它对核心的延迟和响应性几乎没有影响。
对于OSPM来说,待机状态在大多数情况下与retention状态几乎没有区别。但是对于外部调试器和硬件实现来说有所不同,但对于操作系统的空闲管理子系统来说则不明显。
Retention-保持
核心状态,包括调试设置,在低功耗结构中得到保留,使得核心至少可以部分关闭。从低功耗retention状态切换到运行状态不需要对核心进行复位。在从低功耗retention状态切换到运行操作时,保存的核心状态将被恢复。从操作系统的角度来看,除了进入方式、延迟和使用相关的约束外,retention状态和待机状态之间没有区别。然而,从外部调试器的角度来看,这两种状态有所不同,因为retention状态下,外部调试请求的调试事件仍然挂起,核心电源域中的调试寄存器无法访问。
Powerdown-关机
在这种状态下,正如其名称所示,核心已关闭电源。设备上的软件必须保存所有核心状态,以便在断电期间进行保留。从关机状态切换到运行操作必须包括:
- 在恢复电源后,对核心进行复位。
- 恢复保存的核心状态。
关机状态的定义特征是它们会破坏上下文。这意味着所有数据、操作条件和操作状态都会丢失。这会影响在给定状态下关闭的所有组件,包括核心,以及在更深的状态下系统中的其他组件,如GIC或特定于平台的IP。根据调试和跟踪电源域的组织方式,调试和跟踪上下文中的一个或两个可能会在某些关机状态下丢失。必须提供机制,使操作系统能够针对每个给定状态执行相关的上下文保存和恢复。执行恢复从复位向量开始,之后每个操作系统必须恢复其上下文。
Dormant mode-休眠模式
休眠模式是关机状态的一种实现。在休眠模式下,核心逻辑关闭电源,但cache RAMs保持通电。通常,RAM被保持在低功耗retention状态,即它们保持其内容但没有其他功能。这比完全关闭提供了更快的重新启动速度,因为活动数据和代码保留在缓存中。同样,在cluster中,可以将单个核心置于休眠模式。
在允许单个核心进入休眠模式的cluster中,当核心断电时没有保持一致性的空间。因此,这些核心必须首先从一致性域中隔离出来。它们在执行此操作之前清除所有脏数据,并且通常是通过另一个核心发出信号,以通知外部逻辑重新应用电源来唤醒它们。
然后,唤醒的核心必须在重新加入一致性域之前恢复原始核心状态。由于核心在休眠模式下时内存状态可能已更改,因此可能仍然需要使缓存失效。因此,休眠模式更可能在单个核心环境中有用,而不是在cluster中。这是因为离开和重新加入一致性域的额外成本。在集群中,休眠模式通常只有在其他核心已经关闭时,最后一个核心才会使用。
Hotplug-热插拔
热插拔是一种动态开关核心的技术。OSPM可以利用热插拔根据当前计算需求来改变可用的计算容量。有时,热插拔也用于可靠性方面的考虑。
热插拔和将核心置于关机状态以节能的使用之间存在几个不同之处:
- 当一个核心被热拔插时,监督软件会停止所有对该核心的中断和线程处理。该核心不再被调用的操作系统视为可用。
- OSPM必须发出一个明确的命令将一个核心重新上线,即热插拔一个核心。适当的监督软件只有在此命令之后才开始对该核心进行调度或启用中断。
操作系统通常会在一个主核上执行大部分内核引导过程,并在稍后的阶段将从核bringing up。Secondary boot的行为类似于将一个核心热插入系统中。这两种情况下的操作几乎是相同的。
三、动态电压和频率调节
许多系统在其工作负载可变的条件下运行。因此,能够降低或提高核心性能以匹配预期的核心工作负载是很有用的。降低核心的时钟频率可以减少动态功耗。动态电压频率调节(DVFS)是一种利用以下特性的节能技术:
- 功耗与操作频率之间的线性关系。
- 功耗与操作电压之间的二次方关系。该关系可表示为: P = C × V^2 × f
其中:
P 是动态功耗。
C 是相关逻辑电路的开关电容。
V 是操作电压。
f 是操作频率。
通过调整核心时钟的频率来实现节能。
在较低的频率下,核心还可以以较低的电压运行。降低供电电压的优点是既降低了动态功耗,也降低了静态功耗。
对于给定电路,操作电压和电路可以安全运行的频率范围之间存在着具体的实现关系。操作频率和相应的操作电压组合成一个元组,称为操作性能点(Operating Performance Point,OPP)。对于给定系统,可达到的OPP范围总称为系统DVFS曲线。
操作系统使用DVFS来节省能量,并在必要时保持在热限制内。操作系统提供DVFS策略来管理所消耗的电力和所需的性能。针对高性能的策略选择更高的频率并使用更多的能量。而针对节能的策略选择较低的频率,因此使性能较低。
四、汇编语言power指令
ARM汇编语言包括可用于将核心置于低功耗状态的指令。架构将这些指令定义为提示(hints),这意味着核心在执行它们时不需要采取任何特定的操作。然而,在Cortex-A处理器系列中,这些指令是以一种方式实现的,即关闭了几乎所有核心部件的时钟。这意味着核心的功耗被降低,以至于只有静态漏电电流,而没有动态功耗。使用WFI指令可以将执行暂停,直到核心被以下条件之一唤醒:
- IRQ中断,即使PSTATE I位被设置。
- FIQ中断,即使PSTATE F位被设置。
- 异步abort。
如果核心在相应的PSTATE中断标志被禁用时被中断唤醒,则核心在WFI之后执行下一条指令。
WFI指令在电池供电的系统中被广泛使用。例如,移动电话可以将核心置于待机模式,而在等待按下按钮时可能会多次进行这样的操作。
WFE与WFI类似。它暂停执行直到发生事件。这可以是列出的事件条件之一,也可以是cluster中另一个核心发出的事件。其他核心可以通过执行SEV指令来发出事件。SEV向所有核心发出事件信号。通用定时器也可以编程触发周期性事件,从而唤醒核心离开WFE。
五、电源状态协调接口
电源状态协调接口(PSCI)提供了一种与操作系统无关的方法,用于实现核心的启动或关闭的功耗管理用例。这包括:
- 核心空闲管理。
- 动态添加和移除核心(热插拔),以及从核引导。
- big.LITTLE 迁移。
- 系统shutdown和reset。
通过这个接口发送的消息被所有相关执行级别接收。也就是说,如果EL2和EL3被实现,操作系统在虚拟机中执行的消息必须被一个hypervisor接收。如果hypervisor发送它,消息必须被安全固件接收,然后与一个可信操作系统进行协调。这使得每个操作系统可以确定是否需要进行上下文保存。