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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

02-Linux Kernel(armv8-aarch64)的原子操作的底层实现

發布時間:2025/3/21 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 02-Linux Kernel(armv8-aarch64)的原子操作的底层实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈


說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構,linux kernel 5.14


通常我們代碼中的a = a + 1這樣的一行語句,翻譯成匯編后蘊含著3條指令:

ldr x0, &a add x0,x0,#1 str x0,&a


(1)從內存中讀取a變量到X0寄存器
(2)X0寄存器加1
(3)將X0寫入到內存a中

既然是3條指令,那么就有可能并發,也就意味著返回的結果可能不說預期的。

然后在linux kernel的操作系統中,提供訪問原子變量的函數,用來解決上述問題。其中部分原子操作的API如下:

  • atomic_read
  • atomic_add_return(i,v)
  • atomic_add(i,v)
  • atomic_inc(v)
  • atomic_add_unless(v,a,u)
  • atomic_inc_not_zero(v)
  • atomic_sub_return(i,v)
  • atomic_sub_and_test(i,v)
  • atomic_sub(i,v)
  • atomic_dec(v)
  • atomic_cmpxchg(v,old,new)

那么操作系統(僅僅是軟件而已)是如何保證原子操作的呢?(還是得靠硬件),硬件原理是什么呢?
以上的那些API函數,在底層調用的其實都是如下__lse_atomic_add_return##name宏的封裝,這段代碼中最核心的也就是ldadd指令了,這是armv8.1增加的LSE(Large System Extension)feature。

(linux/arch/arm64/include/asm/atomic_lse.h)static inline int __lse_atomic_add_return##name(int i, atomic_t *v) \ { \u32 tmp; \\asm volatile( \__LSE_PREAMBLE \" ldadd" #mb " %w[i], %w[tmp], %[v]\n" \" add %w[i], %w[i], %w[tmp]" \: [i] "+r" (i), [v] "+Q" (v->counter), [tmp] "=&r" (tmp) \: "r" (v) \: cl); \\return i; \ }

那么系統如果沒有LSE擴展呢,即armv8.0,其實現的原型如下所示,這段代碼中最核心的也就是ldxr、stxr指令了

(linux/arch/arm64/include/asm/atomic_ll_sc.h)static inline void __ll_sc_atomic_##op(int i, atomic_t *v)\ { \unsigned long tmp; \int result; \\asm volatile("// atomic_" #op "\n" \__LL_SC_FALLBACK( \ " prfm pstl1strm, %2\n" \ "1: ldxr %w0, %2\n" \ " " #asm_op " %w0, %w0, %w3\n" \ " stxr %w1, %w0, %2\n" \ " cbnz %w1, 1b\n") \: "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \: __stringify(constraint) "r" (i)); \ }

那么在armv8.0之前呢,如armv7是怎樣實現的? 如下所示, 這段代碼中最核心的也就是ldrex、strex指令了

(linux/arch/arm/include/asm/atomic.h)static inline void atomic_##op(int i, atomic_t *v) \ { \unsigned long tmp; int result; \\prefetchw(&v->counter); \__asm__ __volatile__("@ atomic_" #op "\n" \ "1: ldrex %0, [%3]\n" \ " " #asm_op " %0, %0, %4\n" \ " strex %1, %0, [%3]\n" \ " teq %1, #0\n" \ " bne 1b" \: "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) \: "r" (&v->counter), "Ir" (i) \: "cc"); \ }

總結:
在很早期,使用arm的exclusive機制來實現的原子操作,exclusive相關的指令也就是ldrex、strex了,但在armv8后,exclusive機制的指令發生了變化變成了ldxr、stxr。但是又由于在一個大系統中,處理器是非常多的,競爭也激烈,使用獨占的存儲和加載指令可能要多次嘗試才能成功,性能也就變得很差,在armv8.1為了解決該問題,增加了ldadd等相關的原子操作指令

總結

以上是生活随笔為你收集整理的02-Linux Kernel(armv8-aarch64)的原子操作的底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧美日p视频 | 久久精品5 | 国产激情视频在线 | 国产av无码国产av毛片 | 国产精品视频在线观看免费 | 91免费观看视频在线 | 欧美一区免费观看 | 老头糟蹋新婚少妇系列小说 | 久草福利在线 | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 公车激情云雨小说 | 91日本在线观看 | 免费a视频 | 黄色h视频 | 国产一av| 亚洲综合久久av一区二区三区 | 成年男女免费视频 | 天天干天天草天天射 | av网站免费在线 | 欧美日韩在线观看一区二区 | 强侵犯の奶水授乳羞羞漫虐 | 污黄视频在线观看 | 黄色大片a级 | 国产探花一区 | 成人av网站在线观看 | 亚洲精品123区 | 日韩一区在线观看视频 | av观看网 | 久久精品一区二区三区四区 | 日韩一区二区三区四区在线 | 日韩视频一区二区三区在线播放免费观看 | 久久噜噜色综合一区二区 | 国产精品偷伦视频免费看 | 久操操| 国产免费二区 | 天天性综合 | 色噜噜视频 | 一级国产黄色片 | 热久久最新 | 高清欧美精品xxxxx在线看 | 国产无精乱码一区二区三区 | 69精品久久| 亚洲国产第一区 | 亚洲综合av一区二区 | 久久男 | 天堂成人国产精品一区 | 日日爱av| 亚洲一级片免费看 | 在线观看69 | 看全色黄大色黄大片大学生 | 黄色不卡av| 亚洲欧美在线一区二区 | 美女免费福利视频 | 久久久久久久久久一区二区三区 | 国产超碰精品 | 日本一区二区三区视频在线 | 韩国性经典xxxxhd | 国产人妻一区二区三区四区五区六 | a级片国产| 国产在线免费观看 | 精品一区二区三区免费观看 | 少妇人禽zoz0伦视频 | 天天干天天草天天射 | 亚洲午夜精品 | 国产不卡在线播放 | www.youji.com| 午夜在线一区 | 国内精品91 | 欧美精品久久久久久久 | 久久中文字幕人妻 | 国产山村乱淫老妇女视频 | 91成人动漫 | 亚洲精品久久久久久动漫器材一区 | 蜜桃综合网 | 欧美精品国产动漫 | 美女精品一区 | 国产精品69久久久久孕妇欧美 | 三上悠亚一区二区三区 | 久操欧美| 污在线观看 | 亚洲AV无码久久精品浪潮 | 欧美日韩生活片 | 一区二区三区在线观看 | 久草热在线观看 | 亚洲AV无码一区二区三区蜜桃 | 亚洲一区二区三区四区五区xx | 亚洲熟妇一区二区三区 | 天天躁日日躁aaaa视频 | 在线观看视频国产 | 婷婷四月 | 男人天堂资源 | 国产成人精品自拍 | 日本一卡二卡在线 | 中国黄色一级毛片 | 国产嫩草在线 | 久久天堂电影 | 久久久久久久久久一区二区 | 欧美高h视频 | 国产黄色录相 |