【发布时间】:2013-10-29 09:40:30
【问题描述】:
有没有办法记录/打印内核中的浮点值。它是否取决于内核运行的 FPU?
在编译 printk(KERN_DEBUG "error = %f " ,floatvalue) 时,我得到了错误:
对 __aeabi_f2d 的未定义引用
【问题讨论】:
标签: linux floating-point kernel printk
有没有办法记录/打印内核中的浮点值。它是否取决于内核运行的 FPU?
在编译 printk(KERN_DEBUG "error = %f " ,floatvalue) 时,我得到了错误:
对 __aeabi_f2d 的未定义引用
【问题讨论】:
标签: linux floating-point kernel printk
在 Linux 内核中使用任何类型的浮点运算都是一个错误。
如果您正在运行的处理器没有 FPU,那么您将无法执行您正在尝试执行的计算(软件 FPU 由内核驱动,无法在内核内部工作)。
如果您正在运行的处理器确实有 FPU,情况会更糟——因为内核在任务之间切换上下文,它需要保存每个任务的上下文(寄存器集)。 conetxt 切换所需的时间取决于需要保存多少上下文。作为一种优化,内核仅在调度进出使用 PFU 的任务时才保存和恢复 FPU 的上下文,而不是在系统调用或中断触发上下文切换到内核并且同一任务保持当前状态时才保存和恢复 FPU 的上下文任务。
这意味着,如果您在内核中编写使用 FPU 的代码,您可能会破坏当前运行的用户空间任务的 FPU 状态。
【讨论】:
我曾经这么认为。但实际上,有时支持浮点 。它取决于 CPU 架构和内核版本。例如,Linus's answer。我并不是说您应该使用 FP,但这是可能的。它可能在 2.6.32 左右进入内核,请参阅 lxr.free-electrons。
Raulp,您的未定义引用错误看起来像是在尝试使用 lib 例程。那行不通,Linus 指向 gcc in-line。我不太熟悉,但可能会看到this 或this。
【讨论】: