当前位置:中国高校自动化网 >> 单片机技术 >> 浏览文章

分析Linux中Spinlock在ARM及X86平台上的实现

文章来源:不详 作者:佚名


该文章讲述了分析Linux中Spinlock在ARM及X86平台上的实现应用

 

 

 

作者:刘洪涛,华清远见嵌入式学院讲师。

本文主要以2.6.22.6内核分析Linux中spinlock在ARM及X86平台上的实现(不同版本的内核实现形式会有一些差异,但原理大致相同)。此处默认大家已经熟悉了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

相关文章:
  • 80C51和CH375的USB打印机驱动设计
  • MEGA8的twi访问sd2000实时时钟的程序
  • 一种实用的车载空调控制器设计
  • 上一篇:智林STM32开发板上的FatFS移植过程分析十三
    下一篇:ZStack-1.4.3-1.2.1学习5
    最近更新