新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 分析Linux中Spinlock在ARM及X86平臺上的實現

        分析Linux中Spinlock在ARM及X86平臺上的實現

        作者: 時間:2012-12-08 來源:網絡 收藏

          本文主要以2.6.22.6內核分析中spinlock在上的實現(不同版本的內核實現形式會有一些差異,但原理大致相同)。此處默認大家已經熟悉了spinlock的使用,重點解釋容易引起迷惑的體系結構相關的實現部分。

          一、spin_lock(lock)的實現

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

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

          //如果配置了SMP或配置自旋鎖調試功能

          # include linux/spinlock_api_smp.h>

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

          # 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():禁止搶占

          (2)__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)

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

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

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

          (3)(void)(lock):通過插入一個變量本身的求值表達式,使編譯器不再報警,如:“variable 'lock' is defined but never used”。這種求值不會影響運行時的速度。

          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();

          //關閉搶占

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

          //自旋鎖調試用,在沒有定義自旋鎖調試的時候是空函數

          _raw_spin_lock(lock);

          }

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

          #ifdef CONFIG_DEBUG_SPINLOCK

          extern void _raw_spin_lock(spinlock_t *lock);//在lib/spinlock_debug.c中實現

          #else //smp情況

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

          3、__raw_spin_lock在處理器上的實現

          /******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操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        關鍵詞: Linux Spinlock ARM X86平臺

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 朝阳县| 华池县| 射阳县| 西贡区| 六盘水市| 鹤壁市| 工布江达县| 连城县| 南溪县| 高碑店市| 南充市| 嵩明县| 米脂县| 湟源县| 葵青区| 镇远县| 来凤县| 肥西县| 安阳市| 秦皇岛市| 和政县| 田阳县| 济源市| 三河市| 黄陵县| 汉源县| 卫辉市| 本溪市| 江达县| 长丰县| 梓潼县| 邮箱| 盈江县| 石台县| 马龙县| 花莲县| 牙克石市| 梁河县| 普格县| 双牌县| 平昌县|