Linux内核26-ARM的WFI和WFE指令

简介: Linux内核26-ARM的WFI和WFE指令

1 前言


今天在理解读写自旋锁的实现的时候,看到了WFE指令,对其不理解。通过调查,弄清楚了它的来龙去脉,记录一下。在此,还要特别感谢窝窝科技的这篇文章【ARM WFI和WFE指令】,让我茅塞断开。

WFI(Wait for interrupt)WFE(Wait for event)是两个让ARM核进入低功耗待机模式的指令,由ARM架构规范定义,由ARM核实现。


2 WFI和WFE


  • 1)共同点
    WFI和WFE的功能非常类似,以ARMv8-A为例(参考DDI0487A_d_armv8_arm.pdf的描述),主要是“将ARMv8-A PE(Processing Element, 处理单元)设置为低功耗待机状态”。
    需要说明的是,ARM架构并没有规定“低功耗待机状态”的具体形式。因而,可以由IP核自由发挥,根据ARM的建议,一般可以实现为standby(关闭clock、保持供电)、dormantshutdown等等。但有个原则,不能造成内存一致性的问题。以Cortex-A57 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核会立即进入低功耗待机模式,直到有WFI唤醒事件发生。
    而WFE则稍微不同,执行WFE指令后,根据事件寄存器(一个单bit的寄存器,每个PE一个)的状态,有两种情况:如果事件寄存器为1,该指令会把它清零,然后执行完成(不会standby);如果事件寄存器为0,和WFI类似,进入低功耗待机模式,直到有WFE唤醒事件发生。
    WFI唤醒事件和WFE唤醒事件可以分别让ARM核从WFI和WFE状态唤醒,这两类事件大部分相同,如任意的IRQ中断、FIQ中断等等。一些细微的差别,可以参考“DDI0487A_d_armv8_arm.pdf“的描述。而最大的不同是,WFE可以被任何PE上执行的SEV指令唤醒。
    所谓的SEV指令,就是一个用来改变事件寄存器的指令,有两个:SEV会修改所有PE上的寄存器;SEVL,只修改本PE的寄存器值。下面让我们看看WFE这种特殊设计的使用场景。


3 使用场景


  • 1)WFI
    WFI一般用于cpu空闲时。
  • 2)WFE
    WFE的一个典型使用场景,是用在spinlock中(可参考arch_spin_lock,对arm64来说,位于arm64/include/asm/spinlock.h中)。spinlock的功能,是在不同CPU核之间,保护共享资源。使用WFE的流程是:
  1. CPU核1访问资源,申请lock,获得资源。
  2. CPU核2访问资源,此时资源不空闲,执行WFE指令,让CPU核进入低功耗待机模式。
  3. CPU核1释放资源,释放lock,释放资源,同时执行SEV指令,唤醒核2。
  4. CPU核2申请lock,获得资源。

我们在学习spinlock的时候,已经知道,当申请lock失败的时候,CPU核会进入忙等待,比如著名的x86架构。而ARM本身就是低功耗处理器的代名词,所以通过在申请lock的过程中,插入WFE指令,可以节省一点功耗,充分将低功耗设计发挥到了极致。


4 补充


当没有获取spinlock的时候,CPU核会调用wfe,等待其他cpu使用sev来唤醒自己。

在ARM64中,arch_spin_unlock并没有显示的调用sev来唤醒其他cpu,而是通过stlr指令完成的。在ARM ARM文档中有说:在执行store操作的时候,如果要操作的地址被标记为exclusive的,那么global monitor的状态会从exclusive access变成open access,同时会触发一个事件,唤醒wfe中的cpu。

相关文章
|
14天前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
1天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
1天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
3天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
23 4
|
4天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
7天前
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
23 1
|
7天前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
9 0
|
13天前
|
缓存 算法 安全
深入理解Linux操作系统的心脏:内核与系统调用####
【10月更文挑战第20天】 本文将带你探索Linux操作系统的核心——其强大的内核和高效的系统调用机制。通过深入浅出的解释,我们将揭示这些技术是如何协同工作以支撑起整个系统的运行,同时也会触及一些常见的误解和背后的哲学思想。无论你是开发者、系统管理员还是普通用户,了解这些基础知识都将有助于你更好地利用Linux的强大功能。 ####
23 1
|
14天前
|
缓存 编解码 监控
深入探索Linux内核调度机制的奥秘###
【10月更文挑战第19天】 本文旨在以通俗易懂的语言,深入浅出地剖析Linux操作系统内核中的进程调度机制,揭示其背后的设计哲学与实现策略。我们将从基础概念入手,逐步揭开Linux调度策略的神秘面纱,探讨其如何高效、公平地管理系统资源,以及这些机制对系统性能和用户体验的影响。通过本文,您将获得关于Linux调度机制的全新视角,理解其在日常计算中扮演的关键角色。 ###
40 1
|
4天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
11 0