Android 上下文切换时保存 ARM NEON 寄存器

Saving ARM NEON registers while context switching in Android

在上下文切换时Android将所有ARM通用寄存器保存在堆栈上并在之后恢复它。

Android OS 是否将 NEON 寄存器存储在堆栈上?

如果没有,如何在多线程和多任务环境中安全使用 NEON?

如果内核是用 NEON/VFP 支持构建的,那么它确实会保留任务的 NEON 状态以及其余部分作为上下文切换的一部分(前提是任务实际上已经触及 NEON/VFP 之前,所以有一些状态要保留)。

如果内核没有 NEON/VFP 支持,那么正如您猜测的那样,根本没有安全的使用方法 - 任何任务都可以随意破坏任何其他任务,因为它们都共享相同的寄存器。幸运的是,这个问题在实践中并不存在,因为不知道 NEON 的内核也不会首先启用对硬件的访问。在那种情况下,任何 NEON 指令都将被视为未定义,并且信号将适当地发送回任务。

事实上,有大量 Android 应用程序在其中包含 NEON 代码,这应该是一个提示,说明哪些配置在这里是相关的 ;)

如果您能够在 Android 中使用 Neon 指令,则意味着您的内核已启用 VFP 并将负责切换部分(如果内核未启用,您将获得指令中止' t 启用 Neon/VFP)。此外,ARM VFP 和 NEON 共享同一组寄存器。所以很可能你的上下文正在被保存恢复。一些 OS 可以通过采用惰性切换技术来减少切换时间,但寄存器将保持无损坏