ARMv9 是否支持 LSUI 特性
</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 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。