目录
2.3 如何刷新TLB? RISC-V上的sfence.vma
概述
在 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,对称多处理。 <

最低0.47元/天 解锁文章
266

被折叠的 条评论
为什么被折叠?



