日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

optee中spinlock的实现原理详解

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_lock

2、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_unlock

3、示例-舉例說明

假設有下列代碼,進程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的实现原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。