【问题标题】:How to convert a macro caller function into an in-kernel function?如何将宏调用函数转换为内核函数?
【发布时间】:2019-03-30 23:35:12
【问题描述】:

我需要删除内核模块中使用的 CEIL 宏,并在内核中使用 ceil 函数来替换宏的调用者。

我尝试参考 Linux 手册页替换 ceil 函数

http://man7.org/linux/man-pages/man3/ceil.3.html#DESCRIPTION

我的问题是是否可以将此宏转换为内核函数,即 ceil?此外,在代码中,变量 'o' 和 'rsz' 被声明为 unsigned int,其中 ceil 函数的返回类型为 double。如果可以的话,怎么改?

#define CEIL(a, b)     (((a) + (b-1)) / (b))
o += (((CEIL(rsz, 1024)) << 1) << n);

将上面的代码编辑成

o += ((ceil(rsz) << 1) << n)

另外,我尝试在 .c 文件中包含数学头,即

# include <math.h>

在执行时,它给出了编译错误

fatal error: math.h: No such file or directory

【问题讨论】:

  • 内核中一般不能使用浮点数。
  • (a) 代码导致什么编译错误? (b) &lt;math.h&gt; 中的 ceil 函数用于浮点 double,但您显示的 CEIL 宏用于整数。您需要浮点上限函数还是整数上限函数?您当然没有理由不能在内核代码中使用整数上限函数。无论您遇到什么编译错误,都是因为代码有问题,而不是因为试图计算比率的上限。 (c) 你应该展示足够多的代码,以便其他人可以编译它并自己查看错误。
  • 如果我使用上面的宏,没有编译错误。由于内核考虑使用内联函数,我试图删除宏并直接在内核 ceil 函数中使用。因此,我试图实现它。
  • 你写了“上面的代码给出了编译错误”,上面的代码显示了一个宏定义和使用它的代码。现在您写道,如果您“使用上述宏”,则不会出现编译错误。这令人困惑;我们不知道什么代码给出了错误。编辑您的问题以准确地显示产生编译错误的代码,并准确地显示错误消息。
  • 抱歉,我刚刚编辑了问题。

标签: c kernel


【解决方案1】:

不,不能将上述宏转换为内核中的 ceil 函数,因为内核中没有这样的函数。虽然如果仔细看上面的宏,它是

#define CEIL(a, b)     (((a) + (b-1)) / (b))

上述函数是 DIV_ROUND_UP 内核函数的替代方法。因此,可以在内核中删除宏并在调用函数中使用 DIV_ROUND_UP。

这是真的,如果 a 和 b 都是整数。

【讨论】:

    【解决方案2】:

    CEIL(a, b) 内核宏与ceil() C 库函数完全不同。它甚至不需要相同数量的参数!

    此外,内核中不提供浮点函数(以及一般的浮点数学)。 &lt;math.h&gt; 标头不能在此环境中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2010-11-22
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      相关资源
      最近更新 更多