【发布时间】:2012-12-02 21:45:32
【问题描述】:
我正在阅读 Robert Love 的“Linux Kernel Development”,我偶然发现了以下段落:
不(容易)使用浮点数
当用户空间进程使用浮点指令时,内核管理从整数到浮点模式的转换。内核在使用浮点指令时必须做的事情因架构而异,但内核通常会捕获一个陷阱,然后启动从整数模式到浮点模式的转换。
与用户空间不同,内核没有对浮点的无缝支持,因为它不能轻易地陷入困境。在内核中使用浮点需要手动保存和恢复浮点寄存器,以及其他可能的琐事。简短的回答是:不要这样做! 除了在极少数情况下,内核中没有浮点运算。
我从未听说过这些“整数”和“浮点”模式。它们到底是什么,为什么需要它们?这种区别是否存在于主流硬件架构(例如 x86)上,还是特定于一些更奇特的环境?从进程和内核的角度来看,从整数模式到浮点模式的转换究竟需要什么?
【问题讨论】:
-
这本书通过谈论“模式”来混淆这个问题。整数指令始终可用,但 FPU 可以完全或部分禁用。从来没有一个有用的函数完全由 FP ops 组成,例如,所有的控制指令都被认为是“整数”。更多信息请参见下文。
-
@DigitalRoss:我同意这个术语。顺便说一句,感谢您的回答,这让事情变得一清二楚。
-
了解在内核中进行浮点运算的愿望是从何而来的会很有趣。从试图在内核中做一些应该在内核之外做的事情的意义上说“糟糕的设计”是很诱人的,但也许内核真正应该做的事情是利用 FPU 是一种创新的解决方案?跨度>
-
由于没有人提到它,如果你在内核中使用 FP(或 SIMD),你需要在你的代码之前/之后调用
kernel_fpu_begin()/kernel_fpu_end()确保用户空间 FPU 状态没有损坏。这就是 Linux 的md代码对 RAID5 / RAID6 所做的。
标签: linux floating-point linux-kernel