核心内容摘要
赛博世界的“禁色”守门人:鉴黄师色板背后的真实人间
为什么需要 hwspinlock在传统的 Linux SMP 系统中自旋锁spinlock依赖于共享内存 原子指令实现适用于同一 OS同一 cache coherent 域同一 CPU 集群然而在以下场景中普通 spinlock 已经不再适用多 OSLinux RTOS / FW / SCP多 die / 多 cluster无 cache coherenceHost CPU 与外设子系统DSP / MCUSoC 内部通过APB/AXI互联的异构处理单元这些系统之间无法共享 Linux 的原子语义但又需要访问同一块共享资源或共享内存。
这正是hwspinlock硬件自旋锁存在的意义。
hwspinlock 的设计目标Linux hwspinlock 的核心目标可以
总结为三点提供 OS 无关的互斥原语基于硬件寄存器实现排他访问统一 Linux 侧的使用接口本质上hwspinlock 是Linux 对“硬件互斥单元HardwareMutex/ Spinlock”的一层抽象
Linux hwspinlock 的整体架构从软件栈角度看hwspinlock 位于设备驱动层与通用内核接口之间注册就是上register和unregister
hwspinlock 的核心数据结构
1 struct hwspinlock语义说明lock→保护 hwspinlock 内部状态的 Linux 自旋锁→ 注意不是跨 OS 的锁ops→ 硬件相关的操作集trylock / unlockpriv→ 指向 SoC 私有数据寄存器基址、ID 等
2 struct hwspinlock_ops这是 hwspinlock 的关键抽象层Linux不关心硬件如何实现只要求能不能“抢到锁”如何“释放锁”
Linux 侧的使用接口
1 获取 hwspinlockstruct hwspinlock *hwlock;hwlock hwspin_lock_request_specific(id);Linux 通常使用编号ID来标识一把硬件锁
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 / 多 diecache 依赖强无速度极快较慢MMIO典型用途内核同步OS 间互斥一句话
总结hwspinlock 解决的是“系统边界外”的互斥问题
APB Spinlock 的硬件
实现原理
1 APB Spinlock 的基本思想APB spinlock 通常由一组内存映射寄存器组成例如SPINLOCK_BASE 0x0 LOCK0SPINLOCK_BASE 0x4 LOCK1SPINLOCK_BASE 0x8 LOCK
..每个寄存器代表一把独立的硬件锁。
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操作后默认为unlockedhwspinlock 状态当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~
读0进入locked状态执行应用代码当前SPINLOCK_STATUS_REG对应位状态为1SPINLOCKN_LOCK_REG(0~
写0进入unlocked状态释放相应的spinlock
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 共享 ringbufLinux ↔ SCP 共享 mailbox多 die 共享 SRAMremoteproc / rpmsg 的全局同步非一致性内存上的 allocatorgenpool / bitmaphwspinlock 适合“粒度粗、时间短、访问频率低”的互斥
十、