在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 分析Linux中Spinlock在ARM及X86平臺(tái)上的實(shí)現(xiàn)

            分析Linux中Spinlock在ARM及X86平臺(tái)上的實(shí)現(xiàn)

            作者: 時(shí)間:2012-12-08 來源:網(wǎng)絡(luò) 收藏

              本文主要以2.6.22.6內(nèi)核分析中spinlock在上的實(shí)現(xiàn)(不同版本的內(nèi)核實(shí)現(xiàn)形式會(huì)有一些差異,但原理大致相同)。此處默認(rèn)大家已經(jīng)熟悉了spinlock的使用,重點(diǎn)解釋容易引起迷惑的體系結(jié)構(gòu)相關(guān)的實(shí)現(xiàn)部分。

              一、spin_lock(lock)的實(shí)現(xiàn)

              /***include/linux/spinlock.h中***/

              #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)

              //如果配置了SMP或配置自旋鎖調(diào)試功能

              # include linux/spinlock_api_smp.h>

              #else //如果是單處理器且不配置自旋鎖調(diào)試功能

              # include linux/spinlock_api_up.h>

              #endif

              ……

              #define spin_lock(lock) _spin_lock(lock)

              1、如果是單處理器

              /****include/linux/spinlock_api_up.h****/

              #define _spin_lock(lock) __LOCK(lock)

              #define __LOCK(lock)

              do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)

              (1)preempt_disable():禁止搶占

             ?。?)__acquire(lock):在include/linux/compiler.h中有定義

              #ifdef __CHECKER__

              ……

              # define __acquire(x) __context__(x,1)

              # define __release(x) __context__(x,-1)

              #else

              ……

              # define __acquires(x)

              # define __releases(x)

              這是一對(duì)用于sparse對(duì)代碼檢測(cè)的相互關(guān)聯(lián)的函數(shù)定義,第一句表示要增加變量x的計(jì)數(shù),增加量為1,第二句則正好相反,這個(gè)是用來函數(shù)編譯的過程中。如果在代碼中出現(xiàn)了不平衡的狀況,那么在Sparse的檢測(cè)中就會(huì)報(bào)警。如果要使用Sparse檢測(cè)功能就需要安裝sparse工具(參考相關(guān)安裝方法),然后編譯內(nèi)核

              #make zImage C=1 (C=1,只檢測(cè)新編譯的文件,C=2是查所有文件)

              Sparse會(huì)定義__CHECKER__,如果你沒有使用sparse工具,__acquire(lock)則定義為空

             ?。?)(void)(lock):通過插入一個(gè)變量本身的求值表達(dá)式,使編譯器不再報(bào)警,如:“variable 'lock' is defined but never used”。這種求值不會(huì)影響運(yùn)行時(shí)的速度。

              2、如果配置了SMP

              /****include/linux/spinlock_api_smp.h中****/

              void __lockfunc _spin_lock(spinlock_t *lock) __acquires(lock);

              /***kernel/spinlock.c***/

              void __lockfunc _spin_lock(spinlock_t *lock)

              {

              preempt_disable();

              //關(guān)閉搶占

              spin_acquire(lock->dep_map, 0, 0, _RET_IP_);

              //自旋鎖調(diào)試用,在沒有定義自旋鎖調(diào)試的時(shí)候是空函數(shù)

              _raw_spin_lock(lock);

              }

              /***include/linux/spinlock.h***/

              #ifdef CONFIG_DEBUG_SPINLOCK

              extern void _raw_spin_lock(spinlock_t *lock);//在lib/spinlock_debug.c中實(shí)現(xiàn)

              #else //smp情況

              # define _raw_spin_lock(lock) __raw_spin_lock((lock)->raw_lock)

              3、__raw_spin_lock在處理器上的實(shí)現(xiàn)

              /******include/asm-arm/spinlock_types.h***/

              typedef struct {

              volatile unsigned int lock;

              } raw_spinlock_t;

              #define __RAW_SPIN_LOCK_UNLOCKED { 0 }

              /******include/asm-arm/spinlock.h***/

              #if __LINUX__ARCH__ 6

              #error SMP not supported on pre-ARMv6 CPUs //ARMv6后,才有多核ARM處理器

              #endif

              ……

            linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

            上一頁 1 2 下一頁

            關(guān)鍵詞: Linux Spinlock ARM X86平臺(tái)

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉