Linux + arm 内存屏障

ARM 硬件层的屏障指令

  • DMB (Data Memory Barrier):保证在它之前的内存访问(符合给定域/类型)在它之后的内存访问之前对可见性排序。常用域:ish(Inner Shareable),sy(system-wide,最强)。

  • DSB (Data Synchronization Barrier):比 DMB 更强,等到之前的访问“完成”才继续执行下一条指令;常用于设备寄存器编程后需要确保“已生效”的情景。

  • ISB (Instruction Synchronization Barrier):刷新取指流水,常用于修改系统寄存器后,或自修改代码等需要让新指令可见的场景。

  • Acquire/Release 指令(ARMv8):LDAR(获取/读-获取),STLR(释放/写-释放),提供更精细的有序性而不必全栈 DMB

Linux 内核里的内存屏障原语(SMP 语义)

这些在 SMP 有效,在 UP 可能是 no-op(但保持可读性与可移植性):

  • smp_mb():全栅栏(读写都排序)。

  • smp_rmb() / smp_wmb():仅读-读/写-写排序(以及与相对方向的最小保障,取决于架构实现)。

  • smp_store_release(p, v) / smp_load_acquire(p):推荐!映射到 ARM 的 STLR/LDAR,开销更低,适合无锁队列/环形缓冲区。

  • READ_ONCE(x) / WRITE_ONCE(x, v):防止编译器优化/拆分访问,但提供跨 CPU 的排序;常与 acquire/release 或 smp_* 组合用。

  • 原子操作:大多自带适当的屏障语义(比如 atomic_xxx_return 通常是 full barrier),但具体要看接口文档;不要想当然。

锁类原语自带屏障:

  • spin_lock/unlock:进入/退出临界区相当于 acquire/release 屏障。

  • mutex_lock/unlockrcu_read_lock/unlock 等也带有已定义的顺序保证。

设备/MMIO 与 I/O 屏障

  • 不要用 *(volatile u32 *)addr = v; 直接访问 MMIO;统一使用内核提供的 readl/writel(或 ioread32/iowrite32)。

  • readl()/writel():大多数架构上带必要的 I/O 可见性屏障(比如在 writel() 前插入 wmb() 或在 readl() 后插入 rmb() 等),确保 MMIO 与普通内存的顺序。但它们的强度和位置是“架构相关”的。

  • readl_relaxed()/writel_relaxed()省略默认的 I/O 屏障,只做单次 MMIO 访问。需要你显式加 mb()/rmb()/wmb() 或专用 I/O 屏障来保证顺序。

  • mmiowb():在某些架构/场景下用来约束向不同设备的写入顺序(通常在解锁自旋锁后确保批量 MMIO 写顺序对设备可见)。

  • 经验法则:

    • 如果你对设备写 doorbell/控制寄存器,且之前更新了普通内存中的描述符/数据:wmb()(或 dma_wmb()),再 writel() doorbell

    • 如果要读取设备状态后再读普通内存里的缓冲区:readl() 取状态,再 rmb(),再读内存(或使用配套的 acquire 读方案)。

DMA 与缓存一致性(非一致平台尤需注意)

  • 可用 一致性 DMA(coherent)或 非一致性 DMA(streaming)。

  • 非一致性路径:

    • CPU → 设备(CPU 填好 buffer/描述符):

      • dma_sync_single_for_device(dev, dma_addr, len, DMA_TO_DEVICE)(或在某些轻量场景用 dma_wmb() 之后写 doorbell)

      • writel() doorbell/启动寄存器

    • 设备 → CPU(设备写回数据):

      • 中断/轮询得知完成

      • dma_sync_single_for_cpu(dev, dma_addr, len, DMA_FROM_DEVICE)

      • 再读 buffer(必要时配合 dma_rmb()/rmb()

  • 一致性 DMA路径(cache 一致):

    • 常用顺序:更新内存dma_wmb()writel();读回数据前 dma_rmb()

  • 简化口诀:“写前 wmb,读后 rmb;doorbell 前 wmb;拿状态后 rmb。”

常见并发模式示例

生产者(CPU0)/消费者(CPU1)单向通信(无锁队列一类)

/* 生产者:先写数据,再发布索引 */
buf[idx] = data;
smp_store_release(&tail, idx + 1);/* 消费者:先拿到已发布的索引,再读数据 */
int t = smp_load_acquire(&tail);
if (head < t) {item = buf[head];head++;
}
  • store_release 确保对 buf 的写在发布 tail 之前对其他 CPU 可见;

  • load_acquire 确保拿到新的 tail 后,再读 buf 一定能看到对应数据。

中断上下文与线程上下文

线程设置“已就绪标志”,中断处理里读取:

/* 线程上下文 */
WRITE_ONCE(flag, 1);
smp_wmb();          /* 或者把下一条换成 store_release */
writel(START, dev->doorbell);/* 中断上下文 */
status = readl(dev->status);
smp_rmb();          /* 或 load_acquire 来读取 flag 等 */
if (READ_ONCE(flag))handle();

更新 MMIO 描述符 + Doorbell

/* 更新环形队列的描述符(普通内存) */
desc->len = len;
desc->addr = dma_addr;
/* 确保描述符写入先于设备可见 */
dma_wmb();
/* 通知设备 */
writel(DBELL_KICK, dev->db_reg);
  1. 内存类型与顺序直觉

  • Normal(缓存able):ARM 默认弱内存模型,读写可能乱序,需要栅栏/acq-rel。

  • Device(nGnRnE / nGnRE / GRE):对同一设备 MMIO 访问有先后规则,但CPU 对普通内存与 MMIO 的相对顺序不一定天然符合你的期望;因此 Linux 以 readl/writel + 栅栏来提供统一模型。

  • 不要volatile 代替屏障;volatile 只约束编译器,不约束 CPU 重排序。

  1. 该用谁?最简决策表

目的用法
线程间发布数据smp_store_release / smp_load_acquire
强制完全排序smp_mb()
只约束读序/写序smp_rmb() / smp_wmb()
访问 MMIO(设备寄存器)readl()/writel()(性能敏感才考虑 _relaxed + 显式屏障)
Doorbell 前确保内存已可见dma_wmb() 或 wmb(),然后 writel()
设备写回后 CPU 读缓冲dma_sync_single_for_cpu() 或 dma_rmb()/rmb() 之后再读
上锁/解锁的顺序保证spin_lock=acquire,spin_unlock=release
  1. 常见坑

  • 只用 WRITE_ONCE/READ_ONCE没有配对的 acquire/release 或 smp_mb()——在 ARM 上会出错。

  • _relaxed 版本的 readl/writel 却忘记加 mb()/wmb()/rmb()

  • 在非一致性 DMA 平台忘了 dma_sync_single_for_*,导致读到脏缓存或设备看不到最新内存。

  • dsb sy 当成“万金油”滥用,性能大杀器;优先考虑 acquire/release 语义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919529.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全中的远程控制活动检测与防御策略

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;远程控制技术在IT领域中用于网络连接和设备操作&#xff0c;但同样被黑客利用进行非法入侵。端口占用情况是识别远程控制活动的关键因素&#xff0c;使用工具如"cports"可以监控这些端口。系统中未知…

UIGestureRecognizer 各个子类以及其作用

在 iOS 里&#xff0c;UIGestureRecognizer 是一个抽象基类&#xff0c;专门用来处理手势事件。它本身不能直接用&#xff0c;必须用它的 子类。这些子类分别对应常见的手势识别器。常见的 UIGestureRecognizer 子类及作用1. UITapGestureRecognizer作用&#xff1a;点击手势&a…

计算机网络 HTTPS 全流程

HTTPS 通信的全流程&#xff08;特别是 TLS 握手阶段&#xff09;中使用的三个随机数是保障安全性的核心设计&#xff0c;不能随意减少。每个随机数都承担着至关重要的安全职责。下面详细解释 HTTPS 全流程&#xff0c;并重点分析这三个随机数的作用和必要性&#xff1a;&#…

DL00271-基于YOLOv11的激光雷达LiDAR船舶目标检测含完整数据集

【CSDN推荐】基于YOLOv11的激光雷达&#xff08;LiDAR&#xff09;船舶目标检测——含完整数据集&#xff01;&#x1f6a2; 科研人员必看&#xff01; 高校老师、学生和研究者们&#xff0c;前沿技术来了&#xff01;本论文利用YOLOv11模型&#xff0c;结合激光雷达&#xff0…

SQL-leetcode—3374. 首字母大写 II

3374. 首字母大写 II 表&#xff1a;user_content -------------------- | Column Name | Type | -------------------- | content_id | int | | content_text| varchar | -------------------- content_id 是这张表的唯一主键。 每一行包含一个不同的 ID 以及对应的文…

告别笼统的 200 OK:一份给 API 设计者的 HTTP 状态码终极指南

文章目录写在前面问题描述核心结论与建议简要描述详细阐述1xx - 信息性响应 (Informational)2xx - 成功 (Successful)3xx - 重定向 (Redirection)4xx - 客户端错误 (Client Error)5xx - 服务器错误 (Server Error)HTTP 状态码速查表参考以及更多更详细的状态码查询写在前面 你…

从防抖节流到链表树:编程世界中的抽象优化艺术

从防抖节流到链表树&#xff1a;编程世界中的抽象优化艺术 在编程的知识体系中&#xff0c;有些概念看似毫不相关&#xff0c;却在底层逻辑上有着惊人的相似之处。防抖与节流、链表与树&#xff0c;这两组分属不同领域的概念&#xff0c;正是这种思维共性的典型代表。它们不仅展…

第三阶段数据-3:数据库脚本生成,备份与还原,分离与附加

1_生成数据库脚本&#xff08;1&#xff09;在数据库上右键选择任务&#xff08;2&#xff09;选择生成脚本&#xff08;3&#xff09;选择下一步&#xff0c;如果下次不想显示此页面&#xff0c;可勾选不再显示此页&#xff08;4&#xff09;如果导出全部数据&#xff0c;选择…

React框架超详细入门到实战项目演练【前端】【React】

React框架 1.前端展示解释 当客户端访问服务器时&#xff0c;会从服务器中下载很多静态文件到本地&#xff0c;比如css、js等前端渲染文件 下载完成之后浏览器会将这些文件组合形成前端页面渲染出来。 2.React概述 React是一个专注于构建用户界面的JavaScript库&#xff0c;…

本地部署的终极多面手:Qwen2.5-Omni-3B,视频剪、音频混、图像生、文本写全搞定

Qwen2.5-Omni-3B是什么&#xff1f; Qwen2.5-Omni-3B 是由阿里巴巴 Qwen 团队推出的一款轻量级多模态大模型&#xff0c;作为 Qwen2.5-Omni-7B 的高效优化版本&#xff0c;专为消费级硬件环境量身打造。该模型具备处理文本、音频、图像和视频等多种模态输入的能力&#xff0c;…

连续空间强化学习:策略输出的两种形态 —— 概率分布与确定性动作

在强化学习的世界里&#xff0c;智能体与环境的交互核心是 “动作选择”。当面对离散动作空间&#xff08;如围棋的落子点、游戏的按键操作&#xff09;时&#xff0c;智能体可以直接枚举或概率选择有限的动作&#xff1b;但在连续动作空间中&#xff08;如机器人关节角度、无人…

IT运维背锅权限泄露?集中式管控如何化解风险?

在企业数字化转型的浪潮中&#xff0c;IT运维团队常常被推到风口浪尖。员工离职后权限未及时回收、账号共享导致数据泄露、跨系统权限配置不一致……这些问题一旦暴露&#xff0c;IT运维往往成为“背锅侠”。权限泄露不仅威胁企业数据安全&#xff0c;还可能导致合规性风险&…

2025 世界机器人大会启示录:机构学 × AI × 视频链路的融合之路

引言 2025 年 8 月 8 日&#xff0c;北京再一次成为全球瞩目的科技焦点——世界机器人大会盛大开幕。来自全球的 200 余家顶尖企业齐聚一堂&#xff0c;带来超过 1500 件展品&#xff0c;其中首发新品突破 100 款&#xff0c;涵盖了从工业制造、医疗康复到服务陪伴、特种作业的…

从零开始部署经典开源项目管理系统最新版redmine6-Linux Debian12

安装Debian 12 前面为了在windows上好开发&#xff0c;想要在windows上配置开发环境&#xff0c;以源码方式在本地部署运行&#xff0c;但经过好几天各种版本切换及配置组件库等各种操作后&#xff0c;证明windows上搭建redmine6支持的运行环境没有那么简单&#xff0c;后续有…

超长视频生成新突破!LongVie框架问世,创作不再受时长限制

超长视频生成新突破&#xff01;LongVie框架问世&#xff0c;创作不再受时长限制 文章来源&#xff1a;Poixe AI 在AI技术飞速发展的当下&#xff0c;视频生成领域取得了令人瞩目的进步&#xff0c;尤其是在短视频创作方面。然而&#xff0c;当视频时长超过一分钟时&#xff…

MongoDB 查询方法与高级查询表(Python版)

目录 一、MongoDB3步快速安装 1.1​下载安装包 1.2运行安装程序​ 1.3​验证安装​打开CMD执行&#xff1a; 1.4 基本查询操作 二、高级查询操作符表 2.1 比较操作符 2.2 逻辑操作符 2.3 元素操作符 2.4 数组操作符 三、高级查询案例 3.1 复杂条件组合 3.2 数组查…

选型指南:如何为企业挑选合适的边缘计算网关

选型指南&#xff1a;如何为企业挑选合适的边缘计算网关在企业迈向智能化转型的道路上&#xff0c;选择一款合适的物联网边缘计算网关至关重要。面对众多型号和功能各异的网关产品&#xff0c;企业该如何做出正确抉择呢&#xff1f;​首先要考虑的是网关的兼容性。蓝蜂物联网边…

HT8693 音频功率放大器:赋能优质音频体验的核心之选

在音频设备快速迭代的当下&#xff0c;用户对音质表现、设备稳定性和场景适应性的需求日益提升&#xff0c;一款性能卓越的音频功率放大器成为连接音源与听觉享受的关键桥梁。HT8693 凭借双模式切换、强劲输出、智能保护等核心优势&#xff0c;为各类音频设备提供了可靠的性能支…

python+flask后端开发~项目实战 | 博客问答项目--模块化文件架构的基础搭建

项目功能概述&#xff1a; 首页(公开博客显示)博客发布与查询用户登录与注册底层MySQL数据库的动态响应与支持 简介&#xff1a;Flask作为Python的一个轻量级Web框架&#xff0c;以其灵活性和可扩展性&#xff0c;赢得了众多开发者的青睐。从本文开始&#xff0c;你将从0开始…

精品方案 | GCKontrol与OMNeT++联合仿真在机载网络性能分析中的应用

概述本文基于GCKontrol搭建了飞行仿真模型&#xff0c;并基于OMNeT搭建了机内网络系统&#xff0c;实现了不同专业、不同平台的模型集成与调试。通过这种联合仿真架构&#xff0c;能够模拟飞机在不同飞行状态下的网络性能&#xff0c;极大提高了性能评估的精度和可靠性。这不仅…