我尝试在ko模块中添加一些汇编代码,简单来说:
asm volatile("vpush {d8}")
编译时发生错误:
Error: selected processor does not support ARM mode `vpush {d8}'
这是预期的吗?谢谢。
我尝试在ko模块中添加一些汇编代码,简单来说:
asm volatile("vpush {d8}")
编译时发生错误:
Error: selected processor does not support ARM mode `vpush {d8}'
mfpu
指令,所以你会收到该错误消息。Kernel mode NEON (或vfp) 的主要缺点是寄存器状态必须保存/恢复,因为上下文切换可能随时发生。即使使用协处理器,挑战在于使任何用户可见的状态在其运行时看起来都相同。这就是这个问题的指导思想。
更近期的内核中,在浮点模拟里有一个 Kconfig KERNEL_MODE_NEON。支持 kernel mode NEON 受到限制,并且文档可以在 Documentation/arm/kernel_mode_neon.txt 找到。为了使 kernel_neon_begin()
和 kernel_neon_end()
的寄存器保存/恢复工作,同时它们在使用时也禁用了抢占;否则调度程序必须知道某些内核模式已经改变了NEON/VFP状态并将其记录在某个地方。
你可以查看 KERNEL_MODE_NEON 提交,它对不同的GCC版本有限制,当使用-mpfu=neon
编译时,可以在任何地方发出NEON代码;因此,任何对NEON编译单元的外部调用都应该用kernel_neon_begin()
和kernel_neon_end()
包装起来。它应该存在于3.11内核中。
kernel_neon_begin()
和kernel_neon_end()
中(这可能非常昂贵)。 - Notlikethatvpush {d8}
看起来更像是一种通用的FP操作,而不是一些内核维护。 - auselen.fpu...
指令即可让它编译通过,然后欣赏机器在内核模式下发生未定义指令异常时的熊熊大火 - 请确保你的文件系统已同步(或可替换);) - Notlikethat