从“边拆边刷”到“批量刷新”:深入剖析 RISC-V 内核 TLB Shootdown 优化

一文分析RISC-V Linux启动之页表创建 RISC-V Linux启动时的页表创建相对来说还是比较容易理解的,都是C语言创建的,代码也比较少。主要就是setup_vm()和setup_vm_final()两个页表创建函数。理解了sv39的一些地址格式后,再去分析源码就比较容易。不过不同kernel版本代码都不一样,需要具体情况具体分析。本篇提到了setup_vm()会检查kernel入口地址是否2M对齐,如果不对齐kernel无法启动,但其实我们可以解除这个2M对齐限制,将这部分空间利用起来,下篇教大家优化这部分内存。 阅读详情

目录

概述

1 问题背景

2 前置知识

2.1 TLB是什么

2.2 何时需要刷新TLB

2.3 如何刷新TLB? RISC-V上的sfence.vma

2.4 什么事SMP,以及多核处理器的关系

2.5 多核系统(SMP)中的问题

2.6 IPI与SBI rfence的关系

3 性能瓶颈:频繁的TLB刷新=性能杀手

4 解决方案:批处理TLB刷新机制

4.1 linux内核如何支持批处理刷新

4.1.1 在内核的mm子系统里

4.1.2 架构测如何“接入”这套框架

5 RISC-V 补丁实现细节

6 性能测试与结果

7 总结


概述

在 Linux 内核中,每当进程释放内存(如 munmap())或进行内存迁移时,系统必须同步刷新所有 CPU 核心上的 TLB(Translation Lookaside Buffer),以确保地址映射的一致性。这一过程称为 TLB Shootdown,但在多核系统中,频繁的刷新会带来大量 IPI(核间中断)和 sfence.vma 指令开销,严重拖慢性能。

本文深入分析一个被 Linux 6.8-rc1 合入的关键补丁:riscv: Add support for BATCHED_UNMAP_TLB_FLUSH。该补丁将 RISC-V 架构原有的“每删一页就刷一次 TLB”的模式,改为“延迟 + 批量刷新”机制,显著减少了 IPI 和远程 TLB 失效次数。实测显示,在高频率内存回收场景下,系统性能提升超过 30%。

我们将从 TLB 原理、SMP 通信机制、IPI 与 SBI 的关系讲起,逐步剖析该补丁的设计思想、实现细节与性能收益,带你彻底理解现代内核如何优化“看不见的开销”。

1 问题背景

目标补丁 riscv: Add support for BATCHED_UNMAP_TLB_FLUSH
访问地址 https://patchwork.kernel.org/project/linux-riscv/patch/20240108193640.344929-1-alexghiti@rivosinc.com/
此补丁的v2版本被内核团队接受,并在6.8-rc1上提交:https://gitee.com/mirrors/linux_old1/commits/v6.8-rc1/arch/riscv/mm/tlbflush.c


在回收/迁移内存或大量munmap()的路径里,RISC-V现在会“边拆边映射,边刷TLB。”也就是说每拆掉一批页表映射就触发一次TLB失效(本地sfence.vma,跨CPU还要IPI/SBI rfence),在SMP上会造成过多的IPI和过密的sfence.vma,把大量时间花在TLB shootdown上,吞吐明显被拖慢。
此补丁把这些按页/小批量的立即刷新改成“延迟+合并刷新”:把需要刷新的CPU聚合起来,等到这一轮unmap结束再一次性做范围TLB失效,从而显著降低IPI次数和sfence.vma调用开销。
简单一句话:它要解决的就是TLB刷新太频繁的问题,把“多次小刷”变成“一次大刷”,减少IPI和sfence.vma,从而加速内存回收/迁移等映射密集场景。

2 前置知识

2.1 TLB是什么

TLB = Translation Lookaside Buffer,翻译快表。

它是 CPU 中的一个硬件缓存,用来缓存虚拟地址到物理地址的映射关系(即页表项)。

每次 CPU 访问内存时,都要把虚拟地址翻译成物理地址。如果没有 TLB,就得查多级页表(很慢)。

有了 TLB,大部分地址翻译可以直接命中缓存,速度飞快。

类比:就像浏览器缓存网页,TLB 缓存地址翻译结果。

2.2 何时需要刷新TLB

当你修改或删除页表映射时(比如 munmap()、mmap() 覆盖、fork()、内存迁移、内存回收等),旧的 TLB 缓存就失效了。

如果不刷新 TLB:

  • CPU 可能还在用旧的、已经无效的映射访问内存。
  • 导致读到错误数据,甚至安全漏洞。

所以:改页表 → 必须刷新 TLB。

2.3 如何刷新TLB? RISC-V上的sfence.vma

在 RISC-V 架构中,刷新 TLB 的指令是:

sfence.vma [va], [asid]
  • va: 虚拟地址(可选),指定刷新哪个地址的 TLB 条目。
  • asid: 地址空间 ID(可选),用于多进程隔离。
  • 如果不带参数,就是刷新整个 TLB。
  • 注意:sfence.vma 是本地 CPU 指令,只对自己这颗核有效。

2.4 什么事SMP,以及多核处理器的关系

SMP 是 Symmetric Multi-Processing 的缩写,中文通常翻译为 对称多处理。
它确实与“多核处理器”密切相关,但两者不是完全等同的概念。我们可以这样理解它们的关系:

SMP(对称多处理):一种系统架构或设计模式
SMP 描述的是一个计算机系统中,多个处理器(CPU) 以一种“对称”和“平等”的方式协同工作。SMP 的核心特点包括:多个处理器:系统中有两个或更多个 CPU。共享内存:所有 CPU 都连接到同一个物理内存总线上,共享同一块主内存。平等地位:所有 CPU 在功能上是平等的,没有主从之分。任何一个 CPU 都可以执行操作系统内核代码或用户程序。统一管理:操作系统将所有 CPU 视为一个统一的资源池,负责在它们之间调度任务(进程、线程)。共享 I/O:通常也共享 I/O 子系统。SMP 是一种架构概念,它关注的是多个处理器如何协同工作。
多核处理器(Multi-core Processor):一种硬件实现
多核处理器指的是在一个单一的物理芯片(Die)上,集成了多个独立的处理器核心(Core)。例如:一颗 CPU 芯片上有 4 个核心 → 四核处理器一颗 CPU 芯片上有 8 个核心 → 八核处理器每个“核心”本质上就是一个独立的处理器,拥有自己的算术逻辑单元(ALU)、寄存器、一级缓存(L1 Cache)等。
两者的关系:多核是实现 SMP 的主流方式
过去:SMP 系统通常是通过在主板上安装多个独立的物理 CPU 芯片来实现的(比如双路服务器主板)。现在:随着集成电路技术的发展,多核处理器成为了实现 SMP 架构的最主要和最高效的方式。所以,可以这么认为:现代的 SMP 系统,绝大多数都是基于多核处理器构建的。一颗多核 CPU(如 i7-13700K 有 16 核)本身就构成了一个 SMP 系统。但“SMP”强调的是系统级的多处理器协同工作模式,而“多核”强调的是单个芯片上的硬件集成度。

2.5 多核系统(SMP)中的问题

什么是SMP?

  • Symmetric Multi-Processing,对称多处理。
  • <
Mac上除了Homebrew,这几种安装ADB的方法你可能也需要知道(含手动配置避坑) 本文全面解析Mac上五种ADB安装方案,从Homebrew到手动配置,涵盖常见问题解决与环境变量配置。特别针对macOS High Sierra等老旧系统提供专属解法,帮助开发者高效安装Android Debug Bridge(ADB),避免常见陷阱,提升开发效率。 阅读详情

相关推荐

【深度解析】信息素养提升实践活动(附:历年获奖作品分析)

全国师生信息素养提升实践活动是由教育部教育技术与资源发展中心(中央电化教育馆)主办,面向全国师生的一项信息化交流展示活动。

m0_74417957的博客 9651

Linux-RGMII PHY 88E1512 驱动调试记录

1. 简介 1)开发板平台:创龙 AM5728 (tl5728-easy-evm) 2)PHY芯片:Marvell 88E1512 88E1512和88E1510都是一个系列的phy,采用marvell的通用phy驱动,驱动源码路径如下:drivers/net/phy/marvell.c 2. 应用场景 1)系统框图 AM5728连接两个PHY,PHY0的工作模式是 RGMII to Copper (RGMII到电口),PHY1的工作模式是 RGMII to SGMII。 两个PHY与处理器的连接方式都是

weixin_40407893的博客 2万+

QT快速配置MSVC2017编译环境(3分钟极简指南)

本文提供了一份3分钟极简指南,帮助开发者快速配置QT的MSVC2017编译环境。通过断网安装、精准勾选组件和配置QT Creator编译器路径等步骤,大幅提升QT开发效率。MSVC2017作为Windows平台高性能C++编译器,特别适合处理大型QT项目,编译速度优势明显。

weixin_30399821的博客 504

通信算法之325:无人机云哨协议及发射机接收机仿真算法

【代码】通信算法之325:无人机云哨物理层协议及发射机接收机仿真代码。

leegang12的专栏 362

搞定ESD(四):ESD干扰耦合路径深入分析(二)

静电放电过程中静电干扰主要通过三种间接耦合方式干扰敏感源,即电场耦合、磁场耦合、地弹。前文已经深入分析了静电放电过程中的电场耦合,今天就谈谈静电放电过程中的磁场耦合,也可以理解环路耦合。熟话说的好〝人往高处走,水往低处流〞,静电电流也会选择阻抗最低的路径返回到源端。静电电流流会源端的路径实际上就构成了电流环路,当敏感信号形成的电流环路与静电电流环路存在共环路时,就会将静电放电干扰耦合到敏感信号环路内,干扰敏感信号。

记得诚 2795

视觉SLAM十四讲slambook2示例代码所有依赖库的编译安装教程(VTK、OpenCV3、ceres、Sophus、g2o、Eigen、Pangolin、googletest等)

这是2021年的最后一篇博客~ 新年快乐! 0 准备工作   首先需要先安装cmake编译器: sudo apt-get install cmake   以及,将十四讲的示例代码克隆下来(十四讲的源码地址点击这里): git clone --recursive https://github.com/gaoxiang12/slambook2.git   由于里面的3rdparty文件夹内所有内容都来自于其他github仓库,所以需要加上--recursive参数,不然克隆下来的内容不完整。   如果你.

zeeq的博客 7839

2023华为od机试【最小循环子数组】C++

2023华为od机试【最小循环子数组】C++ 给定一个由若干整数组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。

MISAYAONE的博客 2185

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 基于Licheepi 4a开发板构建自己的Linux操作系统
下一篇: 基于Licheepi 4a开发板构建自己的Linux操作系统
KeyarchOS
博客等级 码龄3年 1312粉丝 339原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值