baron · 3月31日 · 四川

spin_unlock中的stlr是怎样让cpu退出low-power模式的?

快速连接

👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈


 title=

说明
在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 5.14, optee3.14
引流关键词: spin_lock,spin_unlock,global monitor,local monitor,exclusive,inclusive,独占机制,ldxr,stxr,optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存管理、页表…

在很多OS的aarch64的代码中,spin_lock和spin_unlock的底层实现如下所示,原理其实很简单:

  • 在操作变量lock的时候,使用ldxr和stxr独占指令,确保万无一失
  • 在无法获得该所的时候,使用wfe进入standby低功耗模式,并不是在那里死等
  • 在spin_unlock的时候,再 让cpu退出standby模式
    在这里插入图片描述

我们都知道,与wfe相对应的指令,就是sev,该指令可以让cpu退出standby低功耗模式,在很多版本的os中的spin_unlock函数中,也是可以看见sev指令的。然后有些版本(比如上图所示)是找不到sev指令的,<font color=red size=5> 那么是spin_unlock是如何让cpu退出standby低功耗模式的呢?</font>


查略ARM ARM文档( 注,这是ARM Architecture Reference Manual的简称), 看到最相关的语句An event caused by the clearing of the global monitor for the PE, 也就是说任何一个清除global monitor动作,都会产生这个event,然后去唤醒WFE。
那么我们也看到了,其spin_unlock的实现,其实就一句话stlr wzr ,[x0],难道stlr可以达到清除global monitor的效果?
在这里插入图片描述
我们继续查找文档,其实看armv8的不太好理解,这里不如也看下armv7的文档 意思也就是说,global monitor 会存储TAG physical address, 然后任何对该地址的写入成功,都将会从global monitor清除这个TAG physical address</font>,
在这里插入图片描述

留下一个小疑问
思考:很多操作系统中的spin_unlock在signaling global event时为什么使用stlr不用sev ??


也可参考 :AArch64 arch_spin_unlock not signaling global event?


关注"Arm精选"公众号,备注进ARM交流讨论区。
图片1.png

推荐阅读
关注数
9438
内容数
191
以易懂、渐进、有序的方式,深入探讨ARMv8/ARMv9架构的核心概念。我们将从基础知识开始,逐步深入,覆盖最新的架构,不再纠缠于过时技术。本系列内容包含但不限于ARM基础、SOC芯片基础、Trustzone、gic、异常和中断、AMBA、Cache、MMU等内容,并将持续更新。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息