ARM -- 电源管理整理(一)
1、GICGICGeneric Interrupt Controller通用中断控制器是ARM架构中用于管理、优先级排序和分发中断的标准组件。它作为CPU与外设之间的“交通警察”接收来自各种外设的中断请求进行优先级判断和路由决策再将高优先级中断送达合适的处理器核心处理从而提升系统效率并支持虚拟化。GIC的核心功能与作用中断管理集中管理所有外设如键盘、传感器、网络模块产生的中断信号。优先级排序为不同中断分配优先级确保紧急任务如系统错误能被及时响应。中断分发将中断精准路由到指定的CPU核心尤其在多核系统中实现负载均衡。支持虚拟化在虚拟机环境中GIC可高效分发虚拟中断提升虚拟化性能。GIC在系统中的结构组成Distributor分发器管理共享外设中断SPI控制中断使能、优先级和路由。Redistributor重分发器处理私有外设中断PPI、软件生成中断SGI和LPI连接到CPU接口。CPU Interface每个处理器核心都有一个接口负责接收并响应中断。ITS中断转换服务用于复杂系统中实现中断的间接映射与虚拟化支持。2、SPI、PPI、SGI 和 LPI在 ARM 架构的通用中断控制器GICGeneric Interrupt Controller中SPI、PPI、SGI 和 LPI 是四种主要的中断类型。它们根据来源、作用范围以及配置方式的不同服务于不同的系统需求。以下是这四种中断类型的详细解析1. SGI (Software Generated Interrupt) - 软件生成中断定义由软件通过写入 GIC 寄存器主动触发的中断不依赖外部硬件信号。中断 ID 范围0 – 15共 16 个。主要用途核间通信IPI, Inter-Processor Interrupt。用于多核系统中 CPU 核心之间的协调与同步。常见场景包括进程调度迁移、TLB页表缓冲刷新、远程函数调用、CPU 停机或唤醒等。特点完全由软件控制无物理连线。可以发送给指定的一个或多个目标 CPU 核心。在 Linux 内核中SGI 常被映射为 IPI 消息如IPI_RESCHEDULE,IPI_CALL_FUNC等。2. PPI (Private Peripheral Interrupt) - 私有外设中断定义连接到特定 CPU 核心的本地外设产生的中断。每个核心拥有自己独立的 PPI 线路其他核心无法接收该中断。中断 ID 范围16 – 31共 16 个。注GICv3.1 及更高版本支持扩展 PPIID 范围可延伸至 1056–1119。主要用途处理核心本地的硬件事件。典型来源通用定时器Generic Timer、看门狗定时器Watchdog、本地错误中断等。核心本地外设(Timer, WDT)特点非共享虽然不同核心的 PPI ID 可能相同例如 ID 30 都是定时器中断但它们在物理上是隔离的属于各自核心的“私有财产”。配置简单通常直接绑定到产生中断的那个核心。3. SPI (Shared Peripheral Interrupt) - 共享外设中断定义由系统级共享外设产生的中断可以通过 GIC 的分发器Distributor路由到任何一个或多个 CPU 核心。中断 ID 范围32 – 1019最多约 988 个。注GICv3.1 及更高版本支持扩展 SPIID 范围可延伸至 4096–5119。主要用途处理大多数外部设备的中断请求。典型来源UART、GPIO、USB、以太网控制器、PCIe 控制器传统 INTx 模式、触摸屏、按键等。系统共享外设(UART, USB, GPIO)特点共享性GIC 可以根据负载均衡策略或固定绑定规则将中断分发给指定的核心。全局配置由GIC Distributor统一管理使能、优先级、触发方式电平/边沿和目标核心列表。是嵌入式系统和服务器中最常见的中断类型。4. LPI (Locality-specific Peripheral Interrupt) - 局部特定外设中断定义GICv3 引入的一种新型中断机制专门针对基于消息的中断Message Signaled Interrupts, MSI/MSI-X。中断 ID 范围8192 及以上数量巨大理论上可达数百万取决于实现。主要用途高性能 PCIe 设备中断。典型来源NVMe SSD、高速网卡100G、GPU、AI 加速器等支持 MSI/MSI-X 的设备。PCIe MSI/MSI-X 设备特点动态分配与传统 SPI 不同LPI 的配置信息如优先级、目标核心不存储在 GIC 的寄存器中而是存储在内存中的配置表里。ITS 支持需要配合 ITS (Interrupt Translation Service) 模块使用。ITS 负责将 PCIe 设备发出的 MSI 事务包转换为 GIC 能够识别的 LPI 事件。高扩展性解决了 SPI 数量有限~1000 个的问题适合现代数据中心和高性能计算场景中大量外设同时产生中断的需求。低功耗优化由于配置在内存中未使用的 LPI 不需要占用 GIC 内部寄存器资源有助于降低功耗。3、WFI、WFEWFIWait For Interrupt和 WFEWait For Event是 ARM 架构中用于实现低功耗管理的两条关键指令。它们允许处理器核心在空闲时进入低功耗待机状态从而显著降低系统功耗同时保持对特定事件的快速响应能力。以下是关于这两条指令的详细解析1. 基本定义与共同点WFI (Wait For Interrupt)等待中断。当执行该指令时处理器暂停执行并进入低功耗模式直到发生一个中断请求。WFE (Wait For Event)等待事件。当执行该指令时处理器暂停执行并进入低功耗模式直到发生一个“事件”Event。共同机制低功耗状态两者都会让处理器核心进入低功耗待机模式Low-power standby state。具体的实现方式由硬件决定通常表现为关闭核心时钟Clock Gating但保持核心供电仅消耗静态漏电流。流水线清空在执行 WFI/WFE 之前处理器会等待所有之前的指令包括内存访问完成或提交以确保系统状态的一致性避免死锁。唤醒后执行被唤醒后处理器会从 WFI/WFE 指令的下一条指令继续执行。2. 核心区别唤醒机制与行为逻辑虽然两者都用于低功耗等待但在进入条件和唤醒源上有显著不同A. 进入低功耗的条件WFI执行 WFI 指令后处理器立即进入低功耗模式。它不检查任何内部标志位无条件挂起。WFEWFE 的行为依赖于一个内部的单比特事件寄存器Event Register。如果事件寄存器为 1WFE 指令会将该位清零然后立即返回不进入低功耗模式。这被称为“虚假唤醒”保护或快速路径。如果事件寄存器为 0处理器进入低功耗模式直到有事件发生。B. 唤醒源WFI 的唤醒源主要由中断Interrupt唤醒。任何使能或未屏蔽的中断请求IRQ/FIQ到达时处理器都会退出 WFI 状态。复位Reset也可以唤醒。WFE 的唤醒源中断与 WFI 类似中断也可以唤醒 WFE。事件Event这是 WFE 独有的唤醒方式。事件可以通过以下途径产生SEV 指令其他核心执行SEV(Send Event) 指令会通过硬件信号线触发当前核心的事件寄存器置位从而唤醒处于 WFE 状态的核心。外部事件输入某些处理器支持专用的EVENTI引脚信号。特定硬件事件如独占访问监视器Exclusive Access Monitor的状态改变例如在自旋锁释放时。3. 典型应用场景WFICPU 空闲管理 (Idle Loop)场景操作系统调度器发现当前 CPU 没有任务可执行时。用法调用WFI让 CPU 进入深度睡眠直到下一个定时器中断、外设中断或 IPI核间中断到来。优势简单直接适用于大多数通用的空闲等待场景。WFE多核同步与自旋锁优化 (Spinlock)场景在多核系统中当一个核心试图获取已被另一个核心占用的锁Spinlock时。传统做法忙等待Busy Wait即不断循环检查锁状态。这会浪费大量功耗并占用总线带宽。WFE 优化做法尝试获取锁核心尝试原子操作获取锁。失败则等待如果获取失败执行WFE进入低功耗模式。释放锁并通知持有锁的核心在完成临界区操作后释放锁并执行SEV指令或利用释放锁时的存储操作触发事件。唤醒SEV或相关硬件事件将唤醒等待中的核心使其重新尝试获取锁。优势在等待锁期间大幅降低功耗减少总线流量提高多核系统的能效比。4. 技术细节与注意事项内存一致性在进入 WFI/WFE 之前软件通常需要使用数据同步屏障DSB, Data Synchronization Barrier来确保所有之前的内存访问已完成。这防止了因内存操作未完成而导致的潜在死锁或数据不一致。中断优先级对于 WFE如果唤醒源是一个被屏蔽或优先级不足的中断处理器可能会唤醒但不会立即进入中断服务程序ISR而是继续执行 WFE 后的代码。具体行为取决于处理器的配置如SEVONPEND位。多核事件广播SEV指令通常会向系统中的所有处理器核心广播事件。如果只需要唤醒特定核心可能需要结合其他机制或使用SEVLSend Event Local仅影响本地核心具体支持情况视架构版本而定。Cortex-M 系列的特殊性在 Cortex-M 微控制器中WFI/WFE 进入的具体低功耗模式Sleep 或 Deep Sleep还受系统控制寄存器SCR中的SLEEPDEEP位控制并由芯片厂商的电源管理单元PMU具体实现Gating Clocks门控时钟作用通过关闭空闲模块的时钟信号减少不必要的电平翻转从而降低动态功耗。实现方式使用使能信号Enable与逻辑门如AND门控制时钟通断。推荐采用基于锁存器或触发器的门控结构避免毛刺影响时序。应用场景FPGA、ASIC等低功耗集成电路设计中广泛使用。Flushing Caches刷新缓存目的确保缓存中的“脏数据”写回主存维持数据一致性防止DMA、多核访问时读取到过期数据。触发时机系统休眠如进入S3状态前。上下文切换、中断处理时。设备驱动中DMA传输前后。实现方法硬件层面执行WBINVDx86或dmb sy 清缓存指令ARM。软件层面调用sync()、fsync()或编译器内置函数。Disabling Coherency禁用一致性含义关闭缓存一致性协议如MESI通常在多核系统中某个核心即将关闭或复位时执行。原因避免该核心继续参与缓存监听snooping防止一致性协议异常。操作流程先刷新本地缓存。停止参与总线监听。进入非一致性状态等待电源控制器统一调度。这三项操作常在处理器进入低功耗状态如WFI、power down前由硬件自动或软件协同完成确保系统安全过渡。