我正在阅读Robert Love的“Linux内核开发”,并且遇到了以下段落:
我从未听说过这些“整数”和“浮点”模式。它们到底是什么?为什么需要它们?这种区别是否存在于主流硬件体系结构(例如x86)上,还是特定于某些更特殊的环境?从进程和内核的 Angular 来看,从整数模式到浮点模式的转换到底需要什么?
最佳答案
因为...
...一个OS内核可能只是关闭了FPU。 Presto,无状态可保存和恢复,因此上下文切换速度更快。 (这就是该模式的含义,仅表示已启用FPU。)
如果程序尝试FPU op,则程序将捕获到内核中,内核将打开FPU,恢复可能已经存在的所有保存状态,然后返回以重新执行FPU op。
在上下文切换时,它知道实际上要经过状态保存逻辑。 (然后它可能会再次关闭FPU。)
顺便说一句,我相信本书对内核(而不仅仅是Linux)避免FPU操作的解释并不十分准确。1
内核可以陷入自身,并在很多方面做到这一点。 (计时器,页面错误,设备中断等)。真正的原因是内核特别不需要FPU操作,并且还需要在完全没有FPU的体系结构上运行。因此,它通过不执行总是有其他软件解决方案的操作,从而避免了管理自己的FPU上下文所需的复杂性和运行时间。
有趣的是,如果内核要使用FP ,则必须多久保存一次FPU状态。 。 。 每个系统调用,每个中断,内核线程之间的每个切换。即使偶尔需要内核FP2,也可能会更快地在软件中完成。
1.那是完全错误的。
2.在某些情况下,我知道内核软件在哪里包含浮点算术实现。一些体系结构在硬件中实现传统的FPU操作,但将一些复杂的IEEE FP操作留给软件。 (认为:反常算术。)当发生某些奇怪的IEEE极端情况时,它们会陷入软件中,该软件包含对可能陷入困境的操作进行正确的模拟。
关于linux - 在Linux内核中使用浮点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13886338/