在上下文切换时,Android将所有ARM通用寄存器保存在堆栈上,并在之后恢复。
安卓操作系统是否在堆栈上存储NEON注册?
如果没有,如何在多线程和多任务环境中安全使用NEON?
如果内核是在支持NEON/VFP的情况下构建的,那么它确实会保留任务的NEON状态,以及作为上下文切换的一部分的其他状态(前提是该任务实际上事先已经接触过NEON/VPP,因此需要保留一些状态)。
如果内核不支持NEON/VFP,那么正如你所猜测的,根本没有安全的使用方法——任何任务都可能自由破坏任何其他任务,因为它们都共享相同的寄存器。幸运的是,这个问题在实践中并不存在,因为一个不知道NEON的内核一开始也无法访问硬件。在这种情况下,任何近地天体指令都将被视为未定义指令,并视情况将信号发回任务。
事实上,有很多安卓应用程序中都有NEON代码,这应该是一个提示,说明其中哪些配置与此相关;)
如果你能够在Android中使用Neon指令,那意味着你的内核已经启用了VFP,并将负责切换部分(如果内核没有启用Neon/VFP,你会得到一个指令中止)。此外,ARM VFP和NEON共享同一组寄存器。因此,很可能您的上下文正在被保存和恢复。一些操作系统具有通过使用延迟切换技术来减少切换时间的智能,但寄存器将保持无损坏