玩具的秘密:一个被迫成为测试员的奇幻漂流

核心内容摘要

美国XXXXXL56Endian的起源:一场颠覆性的数字革命
天美传媒:点燃创意之火,点亮品牌之路

孙尚香:乱世红颜,钢筋铁骨下的不屈之火

为什么需要 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 适合“粒度粗、时间短、访问频率低”的互斥

十、

总结Linux hwspinlock 是一种面向异构系统的同步机制上层统一 Linux API中层hwspinlock core 框架底层SoC 私有硬件实现如 APB spinlock它并不是为了替代 spinlock而是解决Linux 原子语义无法覆盖的系统边界问题

7C7PccA片1-7C7PccA片应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123