这与 这个问题有关。
我不是 Linux 设备驱动程序或内核模块方面的专家,但我一直在阅读 Rubini & Corbet 的“Linux 设备驱动程序”[O'Reilly] 和一些在线资源,但我一直无法找到关于这个具体问题的任何事情。
何时允许内核或驱动程序模块使用浮点寄存器?
如果是这样,谁负责保存和恢复其内容?
(假设 x86-64 架构)
如果我理解正确,每当 KM 运行时,它都在使用已从某个应用程序线程抢占的硬件上下文(或硬件线程或寄存器集——无论您想调用什么)。如果您在 c 中编写 KM,编译器将正确确保通用寄存器正确保存和恢复(就像在应用程序中一样),但浮点寄存器不会自动发生这种情况。就此而言,许多 KM 甚至不能假设处理器具有任何浮点能力。
我猜想使用浮点的KM必须小心保存和恢复浮点状态是否正确?是否有这样做的标准内核函数?
是否在任何地方都说明了此编码约定?
对于非 SMP 驱动程序,它们是否不同?
对于较旧的非抢占式内核和较新的抢占式内核,它们是否不同?