【问题标题】:Inline functions in Linux device driverLinux 设备驱动程序中的内联函数
【发布时间】:2014-03-01 20:39:17
【问题描述】:

我正在编写设备驱动程序。我有一个问题要问:

在 .c 文件中声明内联函数是否正确?

我说的是用于 linux 内核的设备驱动程序。我有一个函数,它的函数体很短,它从一个模块导出到另一个模块。你认为,我可以在 .c 文件中将其声明为内联,或者我需要将此函数声明与 EXPORT_SYMBOL 行一起移动到 .h 文件中,因为它是内联的?什么是标准的 Linux 内核实践?

For ex -> something like this?
inline void hello_world( )
{............
return;
}
EXPORT_SYMBOL(hello_world);

谢谢!

【问题讨论】:

  • 更多的是编码约定问题。询问kernelnewbies.org。您的代码将导出 非内联 函数。
  • 在设备驱动程序编程的情况下,如果你有一个/许多函数会被多个模块调用或使用,那么你可以做的就是创建一个“.c”文件并导出所有使用 EXPORT_SYMBOL_GPL 向内核传递函数。然后这些导出的函数被识别为“内核符号”。在使用或调用这些导出函数时,您不需要包含任何文件,也不需要定义它们的原型。只需导出它,然后从任何其他模块调用它。但请确保您出口的“许可证”。

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

只要不将函数声明为static,即使声明为inline,非内联版本也会包含在编译代码中,正是为了让其他编译单元的代码能够调用功能。

显然,当从编译单元外部调用时,函数调用之间不会有任何优化,除非启用了全程序优化/链接时优化。

【讨论】:

  • 如果 static inline 函数出现在内联调用之外,它也将包含在编译代码中,例如作为函数指针。
  • @BasileStarynkevitch 是的,我想说的是,如果你想让编译器忽略内联函数(或从未调用的函数),你实际上必须为此工作。但是如果函数定义为static,即使没有优化,你也不应该从编译单元外部调用它。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
相关资源
最近更新 更多