news 2026/2/18 16:52:52

linux hwspinlock 学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 原子语义无法覆盖的系统边界问题

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 9:20:38

用Python实现第一个量子机器学习模型完整教程:Qiskit与TensorFlow集成

——手把手代码教学与常见问题解决方案 作者:DREAMVFIA UNION 发布日期:2026年2月1日 版权:© 2026 DREAMVFIA UNION -------------------------------------------------- 目录 1. 第一章:引言——为什么学习量子机器学习 2. 第二章:量子计算基础回顾 3. 第三章…

作者头像 李华
网站建设 2026/2/8 7:58:38

U654615 比特聚集(bit)补题报告

先看题目:题目分析我们有一个长度为 的二进制字符串 ,包含字符 0 和 1,至少有一个 1。 可以交换相邻字符,每次交换算一次操作。 目标:让所有 1 连续排列(形成一段连续的 1)。 求最少操作次数思…

作者头像 李华
网站建设 2026/2/10 7:16:41

AI大模型基于LangChain 进行RAG与Agent智能体开发

大模型,英文名叫Large Model,大型模型。早期的时候,也叫Foundation Model,基础模型。 大模型是一个简称,完整的叫法,应该是“人工智能预训练大模型”。预训练,是一项技术,我们后面再…

作者头像 李华
网站建设 2026/2/10 14:07:17

开题报告-基于BS的在线电影视频播放系统的设计与实现

目录 研究背景与意义系统核心功能技术选型创新点设计预期成果应用价值 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 研究背景与意义 在线电影视频播放系统基于B/S架构(Browser/Server&…

作者头像 李华
网站建设 2026/2/9 0:12:47

【课程设计/毕业设计】基于SSM的疫情健康上报管理系统每日体温填报 异常症状上报(咳嗽、发热等) 数据可视化【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/16 19:59:12

SSM毕设选题推荐:基于SSM的手机商城基于SSM实现手机销售商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华