我可以在内核代码中使用 vpush/vpop 吗?

Can I use vpush/vpop in kernel code?

我试图在 ko 模块中添加一些 asm 代码,简单地说:

asm volatile("vpush {d8}")

编译时出现错误:

Error: selected processor does not support ARM mode `vpush {d8}'

这是预期的吗?谢谢

内核开发一般不使用浮点数。并非每个硬件都支持 FP,某些平台可能具有高级电源功能,有时可以打开和关闭 FP 单元。处理所有这些非常麻烦,您总能找到其他方法来解决您的问题。

Robert Love 的“Linux 内核开发”

No (Easy) Use of Floating Point

... Using a floating point inside the kernel requires manually saving and restoring the floating point registers, among other possible chores. The short answer is: Don’t do it! Except in the rare cases, no floating-point operations are in the kernel.

还有更多...

这是因为您的编译器调用未指定任何符合上述要求的 mfpu 指令,因此您收到了该错误消息。

内核模式 NEON(或 vfp)的主要缺点是寄存器状态必须是 saved/restored,因为上下文切换可能随时发生。因此,即使使用 协处理器 ,挑战在于让任何用户可见状态在运行时看起来都一样。这就是本期的时代精神。

更新的内核在 Floating Point Emulation. The kernel mode NEON support is limited and documentation is found in Documentation/arm/kernel_mode_neon.txt 中有 Kconfig KERNEL_MODE_NEON。为了使 kernel_neon_begin()kernel_neon_end() 寄存器 save/restores 工作,抢占在使用时也被禁用;否则调度程序必须知道某些内核模式已经更改了 NEON/VFP 状态并将其获取到某个地方。

可以看到KERNEL_MODE_NEON commit,它对不同的GCC版本有限制,用-mpfu=neon编译时可以在任何地方发出NEON代码;所以任何对 NEON 编译单元的外部调用都应该用 kernel_neon_begin()kernel_neon_end() 包裹起来。它应该从 3.11 内核开始就存在。