快速连接
👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈
说明
在默认情况下,本文讲述的都是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交流讨论区。