<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ARM 原子操作里的兩個(gè)匯編指令

          共 1365字,需瀏覽 3分鐘

           ·

          2020-08-25 01:45

          今天一個(gè)讀者朋友給我留言,問(wèn)了這個(gè)問(wèn)題,ARM原子操作的匯編代碼,還給我截圖了兩個(gè)不同的解釋,讓我說(shuō)哪個(gè)是正確的。

          原子操作的起因是為了內(nèi)核同步,保證數(shù)據(jù)在正確性,之前已經(jīng)吹過(guò)一波,可以看這幾篇文章。

          Linux 互鎖斥 信號(hào)量 死鎖 原子操作

          第4章 原子操作

          第4章 原子操作 第二節(jié)

          CPU和和存儲(chǔ)的連接圖

          原子操作的代碼

          我截取的這段是ARM7之后的代碼,在ARM6之前的CPU并不支持SMP。所以原子操作的代碼也分成了ARM6之前的和ARM7之后的區(qū)分。

          #define?ATOMIC_OP(op,?c_op,?asm_op)?????\
          static?inline?void?atomic_##op(int?i,?atomic_t?*v)???\
          {?????????\
          ?unsigned?long?tmp;??????\
          ?int?result;???????\
          ?????????\
          ?prefetchw(&v->counter);??????\
          ?errata_855872_dmb();??????\
          ?????????\
          ?__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");???????\
          }????

          我們主要討論兩個(gè)匯編指令

          LDREX ,[]

          LDREX 指令從「」中獲取「內(nèi)存地址」,并且將「內(nèi)存地址」的內(nèi)容加載到「」目標(biāo)寄存器中。

          STREX,,[]

          STREX 指令從「」中獲取「內(nèi)存地址」,并且將「內(nèi)存地址」的內(nèi)容加載到「」目標(biāo)寄存器中,并且把執(zhí)行結(jié)果保存在 「」。

          在執(zhí)行的時(shí)候,還有兩個(gè)監(jiān)視器在共同工作

          • local monitor 「本地監(jiān)視器
          • global monitor「全局監(jiān)視器

          單CPU執(zhí)行原子操作執(zhí)行的同步情況

          單CPU的情況下是不需要global monitor 參與的。

          多CPU執(zhí)行原子操作執(zhí)行的同步情況

          多CPU的情況下需要global monitor 參與。

          關(guān)于這個(gè)同步機(jī)子的C語(yǔ)言嵌入?yún)R編代碼,還有更加詳細(xì)的解釋,大家如果有興趣的話,可以看這幾個(gè)鏈接,會(huì)更加詳細(xì)。

          http://www.wowotech.net/linux_kenrel/atomic.html

          https://biscuitos.github.io/blog/ATOMIC/



          ? 推薦閱讀:
          ? ??專輯|Linux文章匯總
          ? ??專輯|程序人生
          ? ??專輯|C語(yǔ)言


          嵌入式Linux
          微信掃描二維碼,關(guān)注我的公眾號(hào)?
          瀏覽 117
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜撸视频网站 | 99精品成人在线视频 | 日韩无码影视 | 内射肉丝内射在线播放 | 操老逼网 |