Linux 自旋锁学习总结

前言

基于 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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值