当包含 <linux/time.h> 时,‘getnstimeofday’ 是系统调用中的隐式声明

‘getnstimeofday' is an implicit declaration in system call when <linux/time.h> is included

回答者

解决!!感谢@IanAbbott

header 应该是:

#include <linux/ktime.h>
#include <linux/timekeeping.h>

而不是 <linux/time.h>.

更多细节见讨论。


原问题

我正在编写系统调用名称 sys_my_time.c,它将使用 getnstimeofday()。我已经导入了 <linux/time.h>。代码如下:

#include <linux/kernel.h>
#include <linux/linkage.h>
#include <linux/time.h>

asmlinkage int sys_my_time() {
  struct timespec t;
  getnstimeofday(&t);
  // ...
  return 0;
}

但是编译的时候报错:

CC      kernel/sys_my_time.o
kernel/sys_my_time.c: In function ‘sys_my_time’:
kernel/sys_my_time.c:8:3: error: implicit declaration of function ‘getnstimeofday’ [-Werror=implicit-function-declaration]
getnstimeofday(&t);
^
cc1: some warnings being treated as errors
scripts/Makefile.build:320: recipe for target 'kernel/sys_my_time.o' failed
make[1]: *** [kernel/sys_my_time.o] Error 1
Makefile:1029: recipe for target 'kernel' failed
make: *** [kernel] Error 2

我不知道为什么会发生错误。

P.S。在 Ubuntu 16.04

中编译内核 V4.14.25

自内核版本 3.17.x 起,getnstimeofday 不再由 #include <linux/time.h> 声明。解决方法是添加:

#include <linux/ktime.h>

根据内核版本,#include <linux/ktime.h> 将从 <linux/time.h>(3.17.x 之前)或 [=16] 中提取 getnstimeofday 的声明=](从 3.17.x 开始)。不需要直接包含<linux/timekeeping.h>

请注意 <linux/ktime.h> 从 Linux 内核 2.6.16 开始可用。

如果里面没有其他您需要使用的东西,您可以删除 #include <linux/time.h>。通过删除该行并为任何内核 3.17.x 或更高版本构建代码来测试。