linux源码中spin_lock函数分析

本文深入探讨了spin_lock和raw_spin_lock的工作原理及其实现细节,包括它们的内部结构定义、关键函数的调用流程及其在不同系统配置下的行为差异。

spin_lock

代码位置:/kernel/include/linux/spinlock.h

static __always_inline void spin_lock(spinlock_t *lock)
{
   
   
        raw_spin_lock(&lock->rlock);
}

可见,spin_lock的实现实际上是通过raw_spin_lock实现的。
看一下spinlock和raw_spinlock的结构体定义:/kernel/include/linux/spinlock_types.h

typedef struct spinlock {
   
   
        union {
   
   
                struct raw_spinlock rlock;//raw_spinlock是成员

#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
                struct {
   
   
                        u8 __padding[LOCK_PADSIZE];
                        struct lockdep_map dep_map;
                };
#endif
        };
} spinlock_t;
......
typedef struct raw_spinlock {
   
   
        arch_spinlock_t raw_lock;
#ifdef CONFIG_DEBUG_SPINLOCK
        unsigned int magic, owner_cpu;
        void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
        struct lockdep_map dep_map;
#endif
} raw_spinlock_t;

可见,spinlock里包含raw_spinlock的成员,这才使spinlock调用raw_spinlock的函数变得可实现起来。

raw_spin_lock系列函数

/kernel/include/linux/spinlock.h中,

#define raw_spin_lock(lock)     _raw_spin_lock(lock)

/kernel/include/linux/spinlock_api_smp.h中,

#define _raw_spin_lock(lock) __raw_spin_lock(lock)

static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
   
   
        preempt_disable();
        spin_acquire(&lock->dep_map, 0, 0
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值