前言
基于 2.4 内核学习笔记
参考资料:
《Linux 内核情景分析》
《Linux 内核设计与实现》
《Linux 设备驱动程序》
概述
自旋锁:从名字上来讲就是一种忙等待机制,即在资源被占用时,其他程序检测忙等
下面是相关 API :
硬件原理
其实主要是用到了 lock 指令,这条指令主要用于锁总线用的,所谓锁总线嘛,总是在我这条命令操作时,不让其他模块访问系统总线,
从而保证我这条命令执行时不受其他命令干扰,因为一条指令执行并不是一步到位的,也是分为几个步骤的,比如至少分为取指周期+执行周期,是可能受其他指令干扰的。
下面为系统总线示意图:
软件实现
核心结构体:
typedef struct {
volatile unsigned long lock; // 0 表示空闲,负数表示锁定
} spinlock_t;
void spin_lock(spinlock_t *lock)
{
__asm__ __volatile__(
spin_lock_string
#define spin_lock_string \
"\n1:\t" \
"lock ; decb %0\n\t" \ // 将 spinlock_t->lock 减 1 ,操作时锁住总线
"js 2f\n" \ // 非负,表示成功,返回
".section .text.lock,\"ax\"\n" \
"2:\t" \ // 否则跳到这里进行循环测试
"cmpb $0,%0\n\t" \
"rep;nop\n\t" \
"jle 2b\n\t" \
"jmp 1b\n" \
".previous"
:"=m" (lock->lock) : : "memory");
}
// spinunlock 函数
spin_unlock(spinlock_t *lock)
{
__asm__ __volatile__(
spin_unlock_string
#define spin_unlock_string \
"movb $1,%0" // 命令本身就是原子性的,不需要 lock
:"=m" (lock->lock) : : "memory");
}