NX 位不只是安全的事:一场 ARM64 超管理器「灵异」崩溃的逐层调试
来源: purplesyringa.moe — 2026-09-04
概述
一篇由 Sonya 撰写、发在 purplesyringa 博客上的「友稿」,记录了一场长达数月、几乎逼疯人的 ARM64 裸机超管理器调试。开发者在为 postmarketOS 编写拦截 CTR_EL0 等特殊功能寄存器访问的超管理器时,只要开启拦截,手机就会随机锁死、被看门狗复位。作者依次排除 MRS/MSR 模拟错误、异常处理蹦床、寄存器保存等问题,甚至怀疑是「超出规范的 ARM 硬件」或 /dev/urandom 在捣乱。真正的元凶出奇地平凡:他们把一串指向可执行指令的处理函数数组在运行时做了排序,而 ARM 不像 x86 那样保证指令缓存与数据缓存一致性——修改可执行内存后若不显式刷新 icache,CPU 拿到的仍是旧缓存里的指令。最终用二进制二分法定位到这条「搬运可执行代码」的排序,并在构建阶段完成排序以绕开问题。标题里「NX 位不只是安全」点出:执行权限相关的内存处理,在缓存一致性这一更底层问题上还有一层容易被忽视的坑。
核心要点
ARM64 超管理器只要开启对 CTR_EL0 的拦截,手机就随机锁死并被看门狗复位,历经数月排查
逐一排除 MRS 模拟、异常蹦床与寄存器保存后,连「硬件超规」和 /dev/urandom 都曾被怀疑
元凶是运行时排序一串指向可执行指令的处理函数数组——ARM 无指令/数据缓存一致性
修改可执行内存后若不显式刷新 icache,CPU 仍会取到旧缓存里的指令
最终靠对汇编级代码做「二进制二分」定位问题,并把排序挪到构建阶段解决
金句
As you may know, ARM is not Icache/Dcache-coherent, which means that modifications to the data do not automatically propagate to the instruction fetches.(你可能知道,ARM 并不保证指令缓存与数据缓存一致——对数据的修改并不会自动传导到取指。)
👍 0
点赞
👎 0
沉底
返回 Lobsters 首页