20.Power Management
许多ARM系统是移动设备,由电池供电。在这些系统中,优化功耗(实际上,更准确的说法是总能耗)是一个关键的设计约束。程序员经常花费大量时间来延长此类系统的电池寿命。即使在不使用电池的系统中,节能也是需要关注的问题。例如,为了降低消费者的电费成本或出于环保原因,可能希望尽量减少能耗。
ARM内核中内置了许多旨在降低功耗的硬件设计方法。能耗可以分为两个部分——动态功耗和静态功耗,两者都很重要。静态功耗发生在核心逻辑或RAM模块通电时。一般来说,漏电流(理想电流为零时的任何电流)与总硅片面积成正比——芯片越大,漏电越多。随着制造工艺的进步,漏电导致的功耗比例显著增加——在130nm及以下的制造工艺中情况更加严重。动态功耗则是由于晶体管的开关动作引起的,它与核心的时钟速度以及每个周期中状态改变的晶体管数量有关。显然,时钟速度越高,核心越复杂,功耗就越大。
支持电源管理的操作系统会根据当前的工作负载,动态调整核心的电源状态,试图在使用尽可能少的电量的同时,平衡可用的计算能力。这些技术中的一些会动态地切换核心的开关状态,或将其置于静止状态,在该状态下核心不再执行计算,因而消耗极少的功率。主要的这些技术包括:
类似big.LITTLE系统的性能管理与电源管理直接相关。操作系统电源管理(OSPM)可能需要根据计算的转移情况,在大核和小核之间,或者在小核和大核之间切换核心和集群的开关状态。
20.1 Idle management
当核心处于空闲状态时,操作系统电源管理(OSPM)会将其转换到一个低功耗状态。通常可以选择多种状态,每种状态都有不同的进入和退出延迟,以及不同的功耗水平。所使用的状态通常取决于核心再次需要的速度。任何时候可以使用的功耗状态也可能取决于SoC中其他组件的活动情况,而不仅仅是核心本身。每个状态都由进入该状态时将被时钟门控或电源门控的组件集来定义。状态有时被描述为“浅”或“深”。
从低功耗状态移动到运行状态所需的时间称为“唤醒延迟”,在较深的状态中,这个时间更长。虽然空闲功耗管理是由核心上的线程行为驱动的,但OSPM可以将整个平台置于影响核心之外的许多其他组件的状态中。如果集群中的最后一个核心进入空闲状态,OSPM可以选择影响整个集群的功耗状态。同样,如果SoC中的最后一个核心进入空闲状态,OSPM可以选择影响整个SoC的功耗状态。这个选择也受到系统中其他组件使用情况的驱动。一个典型的例子是当所有核心和其他总线控制器都处于空闲状态时,将内存置于自刷新状态。
OSPM必须提供必要的电源管理软件基础设施来确定正确的状态选择。在空闲管理中,当核心或集群进入低功耗状态时,可以随时通过核心唤醒事件重新激活它们。也就是说,一个可以唤醒核心的事件,例如中断,能够将其从低功耗状态中唤醒。OSPM不需要显式命令来将核心或集群重新投入运行。即使当前处于低功耗状态,OSPM始终认为受影响的核心是可用的。
20.1.1 Power and clocking
减少能耗的一种方法是切断电源,这将同时移除动态和静态电流(有时称为电源门控),或者停止核心的时钟,这仅移除动态功耗,可以称为时钟门控。
ARM核心通常支持以下几种级别的电源管理:
在某些操作中,需要在移除电源之前和之后保存和恢复状态,执行此操作所需的时间和由此产生的功耗是选择适当的电源管理活动时需要考虑的重要因素。
包含核心的SoC设备可能具有额外的低功耗状态,名称如“停止(STOP)”和“深度睡眠(Deep sleep)”。这些指的是硬件锁相环(PLL)和电压调节器可以由电源管理软件控制的能力。
20.1.2 Standby
在待机操作模式中,核心保持通电,但其大部分时钟被停止或时钟门控。这意味着核心的几乎所有部分都处于静态状态,唯一的功耗来自漏电流和少量监控唤醒条件的逻辑时钟。
该模式通过WFI(Wait For Interrupt,等待中断)或WFE(Wait For Event,等待事件)指令进入。ARM建议在WFI或WFE之前使用数据同步屏障(DSB)指令,以确保挂起的内存事务在改变状态之前完成。如果调试通道处于激活状态,它将保持激活状态。核心将停止执行,直到检测到唤醒事件。唤醒条件取决于进入模式的指令。对于WFI(等待中断),中断或外部调试请求将唤醒核心。对于WFE(等待事件),则存在许多指定的事件,包括集群中的另一个核心执行SEV(发送事件)指令。多核系统中的窥探控制单元(SCU)的请求也可以唤醒时钟以进行缓存一致性操作。这意味着处于待机状态的核心的缓存将继续与其他核心的缓存保持一致。核心复位将始终强制核心退出待机状态。
各种形式的动态时钟门控也可以在硬件中实现。例如,当检测到空闲状态时,SCU、GIC(通用中断控制器)、定时器、CP15、指令流水线或NEON块可以自动进行时钟门控,以节省电能。
待机模式可以快速进入和退出(通常在两个时钟周期内)。因此,它对核心的延迟和响应几乎没有影响。
对操作系统的电源管理而言,待机状态与保留状态几乎没有区别。这种区别对外部调试器和硬件实现是显而易见的,但对操作系统的空闲管理子系统而言并不明显。
20.1.3 Retention
在保留状态中,核心状态,包括调试设置,保存在低功耗结构中,允许核心至少部分关闭。从低功耗保留状态切换到运行状态不需要核心复位。在从低功耗保留状态切换到运行状态时,保存的核心状态会被恢复。从操作系统的角度来看,保留状态和待机状态没有区别,除了进入方式、延迟和使用相关的限制。然而,从外部调试器的角度来看,这些状态不同,因为外部调试请求调试事件保持挂起,并且核心电源域中的调试寄存器无法访问。
20.1.4 Power down
在断电状态下,核心被关闭。设备上的软件必须保存所有核心状态,以便在断电期间保持这些状态。从断电状态切换到运行状态必须包括:
断电状态的定义特征是它们会破坏上下文。这影响到给定状态下关闭的所有组件,包括核心,以及在更深的状态下系统的其他组件,例如GIC或特定平台的IP。根据调试和跟踪电源域的组织方式,在某些断电状态下,调试和跟踪上下文可能会丢失。必须提供机制使操作系统能够执行相关的上下文保存和恢复以适应每个给定状态。在断电状态下,执行恢复将从复位向量开始,之后每个操作系统必须恢复其上下文。
对于断电状态,接口需要一个返回地址。这是调用操作系统期望在其特权级别上唤醒时恢复执行的地址。从断电状态,核心将从复位向量重新启动,通常处于安全模式。在初始化之后,安全世界必须在所需的返回地址恢复调用断电接口的操作系统。
20.1.5 Dormant mode
在休眠模式下,核心逻辑被断电,但缓存RAM仍然保持通电状态。通常,RAM将处于一种低功耗的保留状态,在这种状态下,它们保留其内容但不执行其他功能。这比完全关机提供了更快的重新启动,因为活动数据和代码仍然存在于缓存中。同样,在多核系统中,单个核心可以进入休眠模式。
在允许集群中单个核心进入休眠模式的多核系统中,当核心断电时无法保持一致性。因此,这些核心在此之前必须先将自己从一致性域中隔离出来。它们会在执行此操作之前清除所有脏数据,并通常通过其他核心向外部逻辑发出信号来重新通电以唤醒。
被唤醒的核心必须在重新加入一致性域之前恢复原始核心状态。由于在核心处于休眠模式期间,内存状态可能发生了变化,因此它可能仍然需要使缓存失效。因此,休眠模式在单核环境中更有可能发挥作用,而不是在集群中。这是因为离开和重新加入一致性域会增加额外的成本。在一个集群中,休眠模式通常只有在其他核心已经关闭的情况下,才会由最后一个核心使用。
20.2 Hotplug
CPU热插拔是一种可以动态开关核心的技术。操作系统电源管理(OSPM)可以使用热插拔技术根据当前的计算需求来改变可用的计算能力。热插拔有时也用于提高系统的可靠性。热插拔与用于空闲的断电状态有以下几个不同之处:
当一个核心被热拔出时,管理软件会停止该核心在中断和线程处理中的所有使用。调用操作系统将不再认为该核心是可用的。
OSPM必须发出一个明确的命令才能将核心重新上线,也就是将核心热插入。在此命令之后,合适的管理软件才会开始在该核心上进行调度或启用中断。
操作系统通常在一个主核心上执行大部分内核启动过程,并在稍后阶段使辅助核心上线。辅助启动的行为与将核心热插入系统非常相似。这两种情况下的操作几乎是相同的。
20.3 Dynamic Voltage and Frequency Scaling
许多系统的工作负载是非常可变的。能够根据预期的核心工作负载来调整核心性能将非常有用。如果能够在核心不太繁忙时降低其时钟速度,就可以节省动态功耗。
动态电压和频率调节(DVFS)是一种节能技术,利用了以下关系:
功耗与运行频率的线性关系。
功耗与运行电压的平方关系。
这种关系可以表示为: 𝑃=𝐶×𝑉2×𝑓P=C×V2×f 其中:
𝑃P 是动态功耗。
𝐶C 是逻辑电路的开关电容。
𝑉V 是运行电压。
𝑓f 是运行频率。
通过根据核心的当前负载调整其频率,可以实现功耗的节约。在某些情况下,降低频率可以使用更低的电压,从而实现净平方功率的节约。
当核心运行得较慢时,供电电压也可以适当降低。降低供电电压的优点是可以同时减少动态和静态功耗。与快速运行然后进入待机,再快速运行的替代方案相比,以较低的电压缓慢运行可以节省更多的能量。为了成功实现这一点,需要解决两个困难的工程问题。SoC需要一种方式,使ARM核心上运行的软件能够可靠地修改核心的时钟速度和供电电压,而不会对系统造成问题。这需要芯片上具有电压电平转换器和分离的电源来应对可变供电,以及电压域之间的同步器来应对时序变化。同样重要的是,系统中运行的软件能够对未来的工作负载进行准确预测,以相应地设置电压和时钟速度。
给定电路的运行电压与该电路可以安全运行的频率范围之间存在特定的实现关系。一个给定的运行频率及其对应的运行电压被表示为一个元组,称为运行性能点(OPP)。对于一个给定系统,所有可达到的OPP范围统称为系统的DVFS曲线。
操作系统使用DVFS来节省能量,并在必要时保持在热限制范围内。核心的负载调节其运行频率。操作系统提供DVFS策略来管理功耗和所需性能。以高性能为目标的策略会选择更高的频率,使用更多的能量;而以节能为目标的策略会选择较低的频率,因此会导致较低的性能。
20.4 Assembly language power instructions
ARM汇编语言包含一些可以将核心置于低功耗状态的指令。架构将这些指令定义为提示——当核心执行它们时,不需要采取任何特定的动作。然而,在Cortex-A处理器系列中,这些指令以一种关闭核心几乎所有部分时钟的方式来实现。这意味着核心的功耗会显著降低——仅会产生静态漏电流,而不会有动态功耗。
WFI(等待中断)指令的作用是暂停执行,直到核心被以下条件之一唤醒:
一个IRQ中断,即使CPSR I位被设置。
一个FIQ中断,即使CPSR F位被设置。
一个异步中止。
一个调试进入请求,即使JTAG调试被禁用。
如果在相关CPSR中断标志被禁用的情况下由中断唤醒核心,核心将继续执行WFI后的下一条指令。在较早版本的ARM架构中,等待中断功能(也称为待机模式)是通过CP15操作而不是专用指令来访问的。
WFI指令在电池供电的系统中被广泛使用。例如,移动电话在等待用户按下按钮时,每秒可以多次将核心置于待机模式。
WFE(等待事件)与WFI类似。它会暂停执行直到发生某个事件。这可以是列出的事件之一,或者是另一种可能性——由集群中另一个核心发出的事件。其他核心可以通过执行SEV(发送事件)指令来发出事件。SEV会向集群中的所有核心发送一个事件信号。
20.5 Power State Coordination Interface
ARM架构通过其特权级别的架构定义,以及安全和虚拟化扩展,提供了一种方便的方法来对软件栈进行分区。这引入了架构中的不同执行模式,从而提供了一种将组成设备软件栈的系统进行分区的方法。正如我们所见,ARMv7架构具有以下特权级别,不同软件供应商的软件可以在这些级别上运行:
PL0 - 供用户应用供应商使用,例如从应用商店下载的应用程序。
PL1 - 丰富操作系统供应商,例如Android使用的Linux内核。
PL2 - 虚拟机管理程序供应商。
Secure PL0 - 来自受信任操作系统供应商的受信任操作系统应用程序。
Secure PL1 - 受信任操作系统。
Secure PL1 - OEM厂商提供的安全固件。
由于来自不同供应商的操作系统可以同时在ARM系统中执行,因此在执行电源控制时,需要一种协作方法。这意味着,如果负责管理电源的操作系统(无论是在监督级别PL1还是在虚拟机管理程序级别PL2)希望进入空闲状态,启动或关闭核心,或者执行big.LITTLE迁移,在其他特权级别的操作系统必须对这一请求作出反应。同样,如果核心因唤醒事件从电源状态中唤醒,则可能需要在不同特权级别上运行的操作系统执行诸如恢复状态的操作。目前没有可以自由使用的接口来实现各种操作系统之间的互操作和集成,这给操作系统供应商带来了困难。
ARM提供了一个软件接口,即电源状态协调接口(PSCI),以便操作系统电源管理(OSPM)在没有任务时将核心置于低功耗状态。通过使用此接口,操作系统和固件可以在big.LITTLE系统上实现诸如空闲、热插拔和状态迁移等电源管理技术。通过该接口发送的消息将被所有相关的执行级别接收。这意味着,如果实现了虚拟化和安全扩展,由丰富操作系统发送的消息必须由虚拟机管理程序接收。如果虚拟机管理程序发送消息,该消息必须由协调受信任操作系统的安全固件接收。这使得每个操作系统能够确定是否需要保存上下文。
PSCI指定了以下功能:
CPU_SUSPEND
挂起核心上的执行。该调用用于空闲子系统,在这种情况下,核心通过唤醒事件返回执行。
CPU_OFF
关闭核心电源。该调用用于热插拔。通过CPU_OFF关闭电源的核心只能通过CPU_ON重新启动。
CPU_ON
启动核心电源。此调用用于启动以下核心:
尚未引导进入调用操作系统的核心。
之前通过CPU_OFF调用关闭电源的核心。
MIGRATE
用于请求单个核心的受信任操作系统将其上下文迁移到特定核心。
(广告时间)
Arm架构类课程:
安全热销大课程:
安全类经典课程:
其它课程:
铂金VIP课程介绍
之最介绍
招牌课程:Truszone标准版、Trustzone高配版
销量前三课程:ARM三期、Secureboot、Android15安全架构
持续更新的课程:ARM三期、铂金VIP
非常好非常好但又被忽视的课程:CA/TA开发
近期更新/力推的课程/重点课程:optee系统架构从入门到精通
说点心里话:
1、不要再说课贵了,你看看咱这是啥课?别家的能比不?请不要拿通用的linux、android、python、C语言和咱这专业课比。
2、咱们的VIP是数十门课程的集合。不要拿别人一门课程的价格对标咱这20门课程价格。
3、这些知识很多人都会,但能拿出来讲的有多少人? 愿意拿出来讲的有多少人?会讲的又有多少人?
4、价格都是认真计算的,并非随意定价。都是根据内容质量、核心知识点、时长和节数计算而来。从来不无缘无故涨价(涨价是需要理由的,如课程内容增加了....)。咱靠的是内容质量和长期服务,而不是运营和营销(无脑涨价)。
5、如果你刷到此处,可能是老粉/铁粉,记得点赞、评论哦。感谢您的支持。