在Linux内核中使用浮点
我正在阅读罗伯特·洛夫(Robert Love)的“Linux内核开发”(Linux Kernel Development),我遇到了以下的一段话:
没有(简单)使用浮点
当用户空间进程使用浮点指令时,内核pipe理从整数到浮点模式的转换。 当使用浮点指令时,内核必须做的事情因体系结构而异,但内核通常会捕获一个陷阱,然后启动从整数到浮点模式的转换。
与用户空间不同的是,内核并不具备对浮点的无缝支持,因为它不能轻易陷入自身。 在内核中使用浮点需要手动保存和恢复浮点寄存器以及其他可能的杂项。 简短的回答是: 不要这样做! 除less数情况外,内核中没有浮点运算。
我从来没有听说过这些“整数”和“浮点”模式。 他们究竟是什么,为什么他们需要? 主stream硬件体系结构(如x86)上是否存在这种差别,还是特定于某些更具异国情调的环境? 从进程和内核的angular度来看,从整数到浮点模式的转换到底是什么?
因为…
- 许多程序不使用浮点或不在任何给定的时间片上使用它; 和
- 保存FPU寄存器和其他FPU状态需要时间; 因此
… OS内核可以简单地closuresFPU。 Presto,没有状态保存和恢复,因此更快的上下文切换。 (这是什么模式意味着,它只是意味着FPU被启用。)
如果程序试图执行FPU操作,程序将陷入内核,内核将打开FPU,恢复任何已经存在的已保存状态,然后返回重新执行FPU操作。
在上下文切换时,它知道实际上要经过状态保存逻辑。 (然后它可能会再次closuresFPU。)
顺便说一句,我相信这本书的内核(而不仅仅是Linux),以避免FPU操作的原因的说明是不完全准确的。 1
内核可以陷入自己,并为许多事情做到这一点。 (定时器,页面错误,设备中断,其他)。真正的原因是内核不需要 FPU操作,也需要在没有FPU的架构上运行。 因此,它避免了pipe理自己的FPU上下文所需的复杂性和运行时间,因为它没有经常使用其他软件解决scheme。
有趣的是,如果内核想要使用FP,FPU状态将不得不被保存多久。 。 。 每个系统调用,每个中断,每个内核线程之间的切换。 即使偶尔需要内核FP, 2在软件中也可能会更快。
那是错的。
2.我知道有些情况下,内核软件包含了一个浮点运算实现。 一些体系结构在硬件上实现传统的FPU操作,但将一些复杂的IEEE FP操作留给软件。 (想想: 非正常运算)当一些奇怪的IEEEangular落案件发生时,他们陷入软件,其中包含一个可以捕捉的操作的迂回正确的模拟。
对于某些内核devise,当“内核”或“系统”任务被任务切换出时,浮点寄存器不会被保存。 (这是因为FP寄存器很大,同时需要时间和空间来保存。)所以,如果你尝试使用FP,那么这个值将随机地变成“poof”。
此外,一些硬件浮点机制依靠内核通过陷阱来处理“古怪”的情况(例如,零分割),并且所需的陷阱机制可能处于比内核任务当前运行更高的“水平”。
由于这些原因(以及更多),当您在任务中首次使用FP指令时,某些硬件FPscheme将陷入困境。 如果你被允许使用FP,那么在任务中打开一个浮点标志,如果没有的话,你被射击队击中。