2009-01-10 26 views
11

这与 this question有关。我不是Linux设备驱动程序或内核模块的专家,但我一直在阅读Rubini的“Linux设备驱动程序”[O'Reilly] & Corbet和一些在线资源,但我没有能够在这个特定问题上找到任何东西。在Linux设备驱动程序中使用浮点的编码约定是什么?

什么时候允许内核或驱动程序模块使用浮点寄存器?
如果是这样,谁负责保存和恢复其内容?
(假设x86-64架构)

如果我理解正确,每当KM运行时,它使用的是硬件方面(或硬件线程或注册设置 - 无论你怎么称呼它)已经被抢占从一些应用程序线程。如果你用c编写你的KM,编译器将正确地确保通用寄存器被正确地保存和恢复(很像在应用程序中),但这不会在浮点寄存器中自动发生。就此而言,许多KM甚至无法假定处理器具有任何浮点功能。

我在猜测一个想要使用浮点的知识管理必须谨慎地保存并恢复浮点状态吗?有没有标准的内核函数来做到这一点?

这是什么编码规范拼写出来的任何地方?
它们对于SMP非SMP驱动程序是不同的吗?
对于较早的非抢占式内核和较新的抢占式内核,它们有何不同?

回答

8

简答:如果此用途被kernel_fpu_begin()/kernel_fpu_end()包围,则内核代码可以使用浮点。这些函数处理保存和恢复fpu上下文。此外,他们呼吁preempt_disable()/preempt_enable(),这意味着在这些函数之间的代码中没有睡眠,页面错误等。谷歌功能名称了解更多信息。

如果我理解正确,每当 KM运行时,它使用的是硬件 上下文(或硬件线程或 寄存器组 - 无论你想 称呼它)已经从 一些抢占应用线程。

不,内核模块也可以在用户上下文中运行(例如,当用户空间调用KM提供的设备上的系统调用时)。但它与浮动问题没有关系。

如果你写你的知识在C中, 编译器会正确地确保 通用寄存器 妥善保存和恢复(就像 在一个应用程序),但也不至于 自动发生与 浮点寄存器。

这不是因为编译器,而是因为内核上下文切换代码。

10

Linus's answer提供这个很清楚的报价为指针,使用方法:

换句话说:规则是,你真的不应该在内核中使用FP。

相关问题