【问题标题】:What are coding conventions for using floating-point in Linux device drivers?在 Linux 设备驱动程序中使用浮点的编码约定是什么?
【发布时间】:2010-09-30 16:08:41
【问题描述】:

这与 this question.

我不是 Linux 设备驱动程序或内核模块方面的专家,但我一直在阅读 Rubini & Corbet 的“Linux 设备驱动程序”[O'Reilly] 以及一些在线资源,但我没有能够找到有关此特定问题的任何信息。

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

如果我理解正确,每当 KM 运行时,它使用的硬件上下文(或硬件线程或寄存器集——无论您想调用什么)已被某个应用程序线程抢占。如果您在 c 中编写 KM,编译器将正确确保通用寄存器正确保存和恢复(就像在应用程序中一样),但浮点寄存器不会自动发生这种情况。就此而言,许多 KM 甚至不能假设处理器具有任何浮点能力。

我猜想使用浮点的 KM 必须小心保存和恢复浮点状态,这是否正确?是否有执行此操作的标准内核函数?

是否在任何地方都详细说明了此的编码约定?
对于非 SMP 驱动程序,它们是否不同?
对于较旧的非抢占式内核和较新的抢占式内核,它们有何不同?

【问题讨论】:

    标签: linux floating-point linux-device-driver fxsave


    【解决方案1】:

    Linus's answer 提供了这个非常清晰的引用作为指导:

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

    【讨论】:

      【解决方案2】:

      简短回答:如果此用法被kernel_fpu_begin()/kernel_fpu_end() 包围,内核代码可以使用浮点。这些函数处理保存和恢复 fpu 上下文。此外,他们调用preempt_disable()/preempt_enable(),这意味着这些函数之间的代码中没有休眠、页面错误等。谷歌函数名称以获取更多信息。

      如果我理解正确的话,无论何时 KM 正在运行,它正在使用硬件 上下文(或硬件线程或 注册集——任何你想要的 调用它)已被抢占 一些应用程序线程。

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

      如果您用 c 编写 KM,则 编译器将正确确保 通用寄存器是 正确保存和恢复(例如 在应用程序中),但事实并非如此 自动发生 浮点寄存器。

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

      【讨论】:

      • 虽然这在技术上可能是正确的,但简短的回答应该是:不要这样做。如果需要浮点数,请改用定点数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多