optee中spinlock的实现原理详解
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
相關推薦:
optee中mutex的實現方式
說明: 在默認的情況下,本文講述的是armv8 aarch64體系,optee 3.12.0代碼
文章目錄
- 1、cpu_spin_lock
- 2、cpu_spin_unlock
- 3、示例-舉例說明
透過事務看本質:
spin_lock的時候,如果lock等于1了,則調用wfe指令,讓cpu進入低功耗模式; 如果lock不等于1,則lock++
spi_unlock的時候,直接給lock賦0, 并釋放語義,產生等類似于ev指令的信號,喚醒正在處于wfe低功耗的cpu。
1、cpu_spin_lock
static inline void cpu_spin_lock(unsigned int *lock) {cpu_spin_lock_no_dldetect(lock); }static inline void cpu_spin_lock_no_dldetect(unsigned int *lock) {assert(thread_foreign_intr_disabled());__cpu_spin_lock(lock);spinlock_count_incr(); }static inline void spinlock_count_incr(void) { }/* void __cpu_spin_lock(unsigned int *lock); */ FUNC __cpu_spin_lock , :mov w2, #SPINLOCK_LOCK --(1)sevl --(2) l1: wfe --(3) l2: ldaxr w1, [x0] --(4)cbnz w1, l1 --(5)stxr w1, w2, [x0] --(6)cbnz w1, l2 --(7)ret --(8) END_FUNC __cpu_spin_lock2、cpu_spin_unlock
static inline void cpu_spin_unlock(unsigned int *lock) {assert(thread_foreign_intr_disabled());__cpu_spin_unlock(lock);spinlock_count_decr(); }static inline void spinlock_count_decr(void) { }/* void __cpu_spin_unlock(unsigned int *lock); */ FUNC __cpu_spin_unlock , :stlr wzr, [x0] --(9)ret --(10) END_FUNC __cpu_spin_unlock3、示例-舉例說明
假設有下列代碼,進程A和進程B都要訪問臨界區(代碼請參考上面的)
static unsigned int xxx_spinlock;cpu_spin_lock(&xxx_spinlock);// 臨界區cpu_spin_unlock(&xxx_spinlock);-
進程A調用cpu_spin_lock, 其執行順序:
(1)(2)(3)(4)(5)(6)(7)(8), 執行后xxx_spinlock=1,其中步驟(4)是帶有語義的獨占指令
然后進程A進入臨界區 -
進程B調用cpu_spin_lock, 其執行順序:
(1)(2)(3)(4)(5)(3), 此時wfe讓cpu進入低功耗模式 -
進程A執行完臨界區后,調用cpu_spin_unlock,
進程A的執行順序:
(9)(10),步驟(9)給[x0]清0了,即lock=0, 在執行(9)的時候,操作的[x0]地址正是spi_lock時帶有語義的獨占指令操作的,這里就會釋放該獨占指令,將會產生一個類似于sev的信號
進程B收到喚醒信號時,進程B的執行順序:
(5)(6)(7)(8), 進程B也進入了臨界區
我們知道spin_lock是鎖cpu之間的互斥的,對應一個cpu之間的搶占是無法鎖住的。
所以呢,optee在實現spin_lock時,規定了:在調用spin_lock之前,必需disable掉所有中斷,spin_unlock在放開中斷。這樣就不會有搶占的問題了
總結
以上是生活随笔為你收集整理的optee中spinlock的实现原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: optee_os中静态共享内存的注册
- 下一篇: optee中mutex的实现方式