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

时间:2015-04-16 08:24:43

标签: linux linux-kernel arm

我试图在ko模块中添加一些asm代码,只需:

asm volatile("vpush {d8}")

编译时出错:

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

这是预期的吗?感谢。

2 个答案:

答案 0 :(得分:3)

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

Robert Love的“Linux内核开发”

  

否(轻松)使用浮点

     

...在内核中使用浮点需要手动保存和恢复浮点寄存器以及其他可能的杂务。简短的回答是:不要这样做!除了极少数情况外,内核中没有浮点运算。

还有更多...... https://stackoverflow.com/a/13886805/1163019

您的编译器调用并未指定符合上述条件的任何mfpu指令,因此您会收到该错误消息。

答案 1 :(得分:1)

内核模式NEON(或vfp)的主要缺点是必须保存/恢复寄存器状态,因为上下文切换可以随时进行。因此,即使使用协处理器,挑战在于使任何用户可见状态在运行时看起来都一样。这就是这个问题的时代精神。

更新的内核在Floating Point Emulation内有Kconfig KERNEL_MODE_NEON 内核模式NEON 支持有限,文档可在Documentation/arm/kernel_mode_neon.txt中找到。为了使kernel_neon_begin()kernel_neon_end()寄存器保存/恢复正常工作,抢占也会在使用时被禁用;否则调度程序必须知道某些内核模式已经改变了NEON / VFP状态并将其送到某个地方。

可以看到KERNEL_MODE_NEON commit,并且它对不同的GCC版本有限制,这些版本在使用-mpfu=neon编译时可以在任何地方发出NEON代码;因此,任何对 NEON 编译单元的外部调用都应该包含kernel_neon_begin()kernel_neon_end()。它应该存在于3.11内核之后。