我可以在内核代码中使用 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 内核开始就存在。
我试图在 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 内核开始就存在。