当前位置: 首页 > news >正文

linux hwspinlock 学习

一、为什么需要 hwspinlock

在传统的 Linux SMP 系统中,自旋锁(spinlock)依赖于共享内存+ 原子指令实现,适用于:

  • 同一 OS

  • 同一 cache coherent 域

  • 同一 CPU 集群

然而,在以下场景中,普通 spinlock 已经不再适用:

  • 多 OS(Linux + RTOS / FW / SCP)

  • 多 die / 多 cluster(无 cache coherence)

  • Host CPU 与外设子系统(DSP / MCU)

  • SoC 内部通过APB/AXI互联的异构处理单元

这些系统之间无法共享 Linux 的原子语义,但又需要访问同一块共享资源或共享内存。 这正是hwspinlock(硬件自旋锁)存在的意义。


二、hwspinlock 的设计目标

Linux hwspinlock 的核心目标可以总结为三点:

  • 提供 OS 无关的互斥原语

  • 基于硬件寄存器实现排他访问

  • 统一 Linux 侧的使用接口

本质上,hwspinlock 是:

Linux 对“硬件互斥单元(HardwareMutex/ Spinlock)”的一层抽象


三、Linux hwspinlock 的整体架构

从软件栈角度看,hwspinlock 位于设备驱动层与通用内核接口之间

注册就是上register和unregister


四、hwspinlock 的核心数据结构

4.1 struct hwspinlock

语义说明:

  • lock保护 hwspinlock 内部状态的 Linux 自旋锁→ 注意:不是跨 OS 的锁

  • ops→ 硬件相关的操作集(trylock / unlock)

  • priv→ 指向 SoC 私有数据(寄存器基址、ID 等)


4.2 struct hwspinlock_ops

这是 hwspinlock 的关键抽象层

  • Linux不关心硬件如何实现

  • 只要求:

    • 能不能“抢到锁”

    • 如何“释放锁”


五、Linux 侧的使用接口

5.1 获取 hwspinlock

struct hwspinlock *hwlock;

hwlock = hwspin_lock_request_specific(id);

Linux 通常使用编号(ID)来标识一把硬件锁


5.2 加锁与解锁

hwspin_lock_timeout(hwlock, timeout);...hwspin_unlock(hwlock);

或非阻塞方式:

if (hwspin_trylock(hwlock)) {...hwspin_unlock(hwlock);}

重要特性

  • hwspinlock不会睡眠

  • 典型使用场景:

    • 中断上下文

    • 共享内存访问

    • mailbox / rpmsg / IPC 同步


六、hwspinlock 与 Linux spinlock 的本质区别

对比项spinlockhwspinlock
实现基础原子指令硬件寄存器
适用范围单 OS多 OS / 多 die
cache 依赖
速度极快较慢(MMIO)
典型用途内核同步OS 间互斥

一句话总结:

hwspinlock 解决的是“系统边界外”的互斥问题


七、APB Spinlock 的硬件实现原理

7.1 APB Spinlock 的基本思想

APB spinlock 通常由一组内存映射寄存器组成,例如:

SPINLOCK_BASE + 0x0 LOCK0SPINLOCK_BASE + 0x4 LOCK1SPINLOCK_BASE + 0x8 LOCK2...

每个寄存器代表一把独立的硬件锁


7.2 加锁(trylock)& 解锁(unlock)机制

writel(0, lock_reg);

释放锁后,其他 master 才能重新获取。

当处理器使用hwspinlock的时候,需要通过SPINLOCK_STATUS_REG寄存器读取hwspinlock状态。

  • 读操作:读SPINLOCK_LOCK_REG返回0时,说明进入locked状态;再次读SPINLOCK_STATUS_REG该状态位,返回1,说明已经成为locked状态

  • 写操作:当spinlock处于locked状态时,写SPINLOCK_LOCK_REG为0可转化为unlocked状态,其他状态写操作均无效

  • reset操作:reset操作后,默认为unlocked

hwspinlock 状态
  • 当spinlock处于unlocked状态时,写0/1均无效

  • 当spinlock处于unlocked状态,读操作,返回0说明进入locked状态

  • 当spinlock处于locked状态时,写0可转换为unlocked状态

  • 当spinlock处于locked状态,写1无效

  • 当spinlock处于locked状态时,再次读该状态位,返回1,说明已经是locked状态

  • reset操作后默认为unlocked状态

当Free lock动作产生(即lock状态由locked变为unlocked时),即可产生中断

切换状态
  • SPINLOCKN_LOCK_REG(0~31)读0,进入locked状态

  • 执行应用代码,当前SPINLOCK_STATUS_REG对应位状态为1

  • SPINLOCKN_LOCK_REG(0~31)写0,进入unlocked状态,释放相应的spinlock


7.4 硬件层保证的是什么?

APB spinlock 硬件通常保证:

  • 同一时刻:

    • 只有一个 bus master 能持有锁

  • 锁状态:

    • 独立于 CPU cache

    • 独立于 OS

不保证

  • 死锁检测

  • owner 身份校验(有些 SoC 支持)


八、Linux hwspinlock 驱动如何对接 APB Spinlock

典型 APB spinlock 驱动做三件事:

  • 解析设备树

    • 锁数量

    • 寄存器基址

  • 初始化 hwspinlock 实例数组

  • hwspinlock_init(&bank->locks[i]);

  • 实现 ops

  • .trylock = apb_hwspin_trylock,.unlock = apb_hwspin_unlock,

Linux hwspinlock core 完全不知道:

  • APB / AXI

  • 寄存器布局

  • SoC 细节

这就是抽象层的价值。


九、hwspinlock 的典型使用场景

  • Linux ↔ RTOS 共享 ringbuf

  • Linux ↔ SCP 共享 mailbox

  • 多 die 共享 SRAM

  • remoteproc / rpmsg 的全局同步

  • 非一致性内存上的 allocator(genpool / bitmap)

hwspinlock 适合“粒度粗、时间短、访问频率低”的互斥


十、总结

Linux hwspinlock 是一种面向异构系统的同步机制

  • 上层:统一 Linux API

  • 中层:hwspinlock core 框架

  • 底层:SoC 私有硬件实现(如 APB spinlock)

它并不是为了替代 spinlock,而是解决:

Linux 原子语义无法覆盖的系统边界问题

http://www.jsqmd.com/news/330987/

相关文章:

  • 热身赛 全华班武汉城市 2-0 客胜罗马尼亚六级联赛球队阿斯特拉勒杜卡内尼
  • JavaScript DOM操作实战:从入门到精通
  • 2026年 碳纤维管材厂家推荐榜单:高强度轻量化碳纤维管/碳纤维管材,专业定制与创新应用深度解析
  • 2026年碳纤维板厂家推荐排行榜:高强度轻量化碳纤维板材,航空航天/汽车工业专用定制源头工厂精选
  • ArcGIS Pro开发学习
  • 洛谷 P3383:线性筛素数 ← 埃氏筛
  • 电磁波的反射与透射
  • 2026年 数控小钢炮厂家推荐排行榜:高刚性/高光/4万转/20-30KW大主轴/全自动换刀/龙门结构/粗精加工一体/西门子数控系统,性能强悍之选!
  • 【题解】SS221101C.iiidx
  • Flink Agents 0.1.0 发布公告 - 教程
  • 2026年碳纤维制品厂家推荐榜单:碳纤维羽毛球拍/网球拍/台球杆/自行车车架/无人机/运动器材/医疗器械等高端轻量化产品源头实力解析
  • 汉中串串综合排名榜(2026本地精选)
  • 方寸微PT153s芯片,国产USB转RJ45千兆网口芯片,替代RTL8153b方案
  • 方寸微T153s芯片,国产USB转RJ45千兆网口芯片,替代RTL8153b方案
  • 2026年方管厂家实力推荐榜:友发牌/镀锌/低合金/不锈钢/冷拔无缝等全品类优质品牌深度解析与选购指南
  • 用Python实现第一个量子机器学习模型完整教程:Qiskit与TensorFlow集成
  • 04课程:10、11通过yum安装Nginx~12简单源码安装和yum安装的区别~13通过Nginx源码复杂安装
  • Github源码推荐 | Prometheus:让自主无人机开发更简单、更高效!
  • 2026年 热熔胶厂家推荐排行榜:热熔胶颗粒/热熔胶块/压敏胶/聚烯烃热熔胶/聚酰胺热熔胶/EVA热熔胶/滤清器热熔胶/快递袋热熔胶/包装热熔胶/标签热熔胶,专业粘合解决方案
  • 新域名 oierin.top
  • 实用指南:Ubuntu 虚拟机配置静态 IP
  • 仿真引擎——构建系统跳动的心脏
  • 基于ssm+vue+mysql的爱心商城系统(源码+部署调试+大文档+讲解)
  • 2026年 云南旅行社推荐榜单:诚信地接+包车导游服务,火车站附近接送机一站式解决方案
  • 系统自动触发的登出逻辑*
  • 2026年 台湾物流专线服务商推荐排行榜:台湾专线物流/整柜运输/清关派送/电商物流/小三通物流/大件物流/海运运输,高效稳定跨境解决方案
  • U654615 比特聚集(bit)补题报告
  • 虚拟机需要连外网,同时笔记本连接wlan,IP经常变,该怎么配置网络?
  • 计算机毕业设计 | SpringBoot+vue高校迎新系统 新生报道高校宣传招生平台(附源码)
  • QTCreator error: C3861: “_mm_loadu_si64”: 找不到标识符