当前位置:  开发笔记 > 运维 > 正文

在Linux设备驱动程序中使用浮点的编码约定是什么?

如何解决《在Linux设备驱动程序中使用浮点的编码约定是什么?》经验,为你挑选了2个好方法。

这与 这个问题有关.

我不是Linux设备驱动程序或内核模块的专家,但我一直在阅读Rubini&Corbet的"Linux设备驱动程序"[O'Reilly]以及一些在线资源,但我一直无法找到关于这个具体问题的任何事情.

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

如果我理解正确的话,每当KM运行时,它就会使用硬件上下文(或硬件线程或寄存器集 - 无论你想调用它),它已被某些应用程序线程抢占.如果用c编写KM,编译器将正确地确保通用寄存器被正确保存和恢复(就像在应用程序中一样),但浮点寄存器不会自动发生.就此而言,许多知识管理员甚至不能假设处理器具有任何浮点功能.

我是否正确地猜测想要使用浮点的KM必须小心保存并恢复浮点状态?这样做有标准的内核函数吗?

这个拼写的编码约定是否在任何地方拼写出来?
它们与SMP-non SMP驱动程序不同吗?
对于较旧的非抢占式内核和较新的抢占式内核,它们是不同的吗?



1> tonylo..:

Linus的回答提供了这个非常明确的引用作为指导:

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



2> jpalecek..:

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

如果我理解正确的话,每当KM运行时,它就会使用硬件上下文(或硬件线程或寄存器集 - 无论你想调用它),它已被某些应用程序线程抢占.

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

如果用c编写KM,编译器将正确地确保通用寄存器被正确保存和恢复(就像在应用程序中一样),但浮点寄存器不会自动发生.

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

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有