ARMv9 是否支持 LSUI 特性

原始问题:ARMv9 是不是支持一个叫 LSUI 的特性 · 2026-07-01

</div>

是的,LSUI(FEAT_LSUI, Unprivileged Load Store Instructions) 是 ARMv9.6-A 引入的特性。但它不是用于加速 bulk memory copy(大块内存拷贝)的机制。

FEAT_LSUI 是什么

项目 说明
全称 Unprivileged Load Store Instructions
引入版本 ARMv9.6-A
ID 寄存器 ID_AA64ISAR3_EL1.LSUI
内核能力 ARM64_HAS_LSUI
Kconfig CONFIG_ARM64_LSUI
合入主线 v6.15(2026年4月,Yeoreum Yun @ ARM)

核心功能:消除 PAN toggling

传统上,内核访问用户空间内存需要:

MRS    x0, PSTATE        // 保存 PAN 位
STR    x0, [sp]
MSR    PAN, #0           // 清 PAN 以允许用户内存访问
LDR    w1, [x2]          // 实际访问用户地址
MSR    PAN, #0           // 恢复 PAN (实际是设置回原值)

这套 PAN toggling 操作有性能开销,尤其在高频 uaccess 路径(如 futex、KVM 描述符交换等)中更明显。

LSUI 的解法:提供带 t 后缀的特权级 load/store 指令,直接通过 EL0 页表翻译访问用户内存,无需修改 PSTATE.PAN。

LSUI 有哪些指令

LSUI 不是 memory copy 指令集,它提供的是 原子操作 + 单元素访问 指令:

类别 指令 用途
原子操作 LDTADD / LDTCLR / LDTSET / SWPT 对用户内存做原子加、位清除、位置位、交换
比较交换 CAST 对用户内存做 CAS
独占加载/存储 LDTXR / STTXR / LDATXR / STLTXR 对用户内存做独占访问(类似 ldxr/stxr 但带 t)
非时态加载/存储对 LDTNP / STTNP 64-bit GPR 或 128-bit NEON 的非时态用户内存访问(部分接近拷⻉场景)

其中 LDTNPQ/STTNPQ(128-bit NEON 变体)可用于小粒度非时态用户内存搬运,但这不是 copy_to_user/copy_from_user 意义上的 bulk copy。

LSUI 与 MOPS 的分工

特性 FEAT_LSUI FEAT_MOPS
场景 内核态访问用户空间单个/少量元素 大块内存拷贝
目标对象 futex、KVM 描述符交换、SWP 替代 copy_to_user / copy_from_user / copy_page / memcpy
核心指令 LDTADD, CAST, LDTNP, LDTXR CPYP, CPYM, CPYE
ARMv8 兼容 ❌ 仅 ARMv9.6+ ✅ ARMv8.8+
内核已采用 ✅ v6.15 合入 ✅ v6.5 合入

内核实际使用场景(commit 级)

所有 patch 来自 Yeoreum Yun,ARM 工程师,由 Catalin Marinas 审核:

Commit 用途
44adf2bf40ef ARM64 futex 改用 LSUI 原子指令,消除 futex 路径的 PAN toggling
16dbe77a5be2 KVM 中 ARM 页表描述符交换使用 CAST 指令
e223258ed8a6 LSUI 存在时禁用 SWP 指令模拟(直接硬件支持)

跟 copy_to_user 无关 — copy_to_user 的加速方案是 FEAT_MOPS。

总结

LSUI 解决的是小粒度高频 uaccess 原子操作的 PAN toggling 开销问题(futex、SWP、KVM 等场景),不是 bulk memory copy 的加速方案。如果你关心 copy_to_user/copy_from_user 的硬件加速,应该看 FEAT_MOPS (ARMv8.8+),它在 v6.5 主线已合入,且在 ARMv9 平台上也兼容。


⚠️ 免责声明

本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。