在内核中使用Printk for Floating Values

时间:2013-10-29 09:40:31

标签: linux floating-point kernel printk

有没有办法在内核中记录/打印浮点值。它取决于内核运行的FPU吗?

在编译printk(KERN_DEBUG "error = %f " ,floatvalue)时,我收到错误:

对__aeabi_f2d的未定义引用

2 个答案:

答案 0 :(得分:2)

在Linux内核中使用任何类型的浮点运算都是一个错误。

如果您运行的处理器没有FPU,则没有任何东西可以执行您尝试进行的计算(软件FPU是从内核驱动的,并且在内部不起作用)。

如果您运行的处理器确实有FPU,情况就更糟了 - 因为内核在需要保存每个任务的上下文(寄存器集)所需的任务之间切换上下文。 conetxt switch所需的时间取决于需要保存多少上下文。作为优化,内核仅在调度和调出使用PFU的任务时保存和恢复FPU的上下文,而不是在系统调用或中断触发上下文切换到内核并且同一任务保持当前状态时任务。

这意味着如果您编写在内核中使用FPU的代码,则可能会损坏当前正在运行的用户空间任务的FPU状态。

答案 1 :(得分:1)

我曾经这么认为。但实际上,有时候支持浮点 。它取决于CPU架构和内核版本。例如,Linus's answer。我不是说你应该使用FP,但它是可能的。它可能已经进入2.6.32左右的内核,请参阅lxr.free-electrons

Raulp,您未定义的引用错误看起来好像在尝试使用lib例程。这不起作用,Linus指向gcc in-line。我不太熟悉,但可能会看到thisthis