我已经编译了内核 3.19.1,但time_t
. 只是一个简单的程序,cout << sizeof (time_t);
大小为 4 个字节,而不是我的意图是 8 个字节。
我应该在 make menuconfig 期间打开特定选项吗?
目前time_t
只是long
在内核中:参见__kernel_time_t类型定义。因此,如果long
您的 CPU 上的类型是 32 位长,那么time_t
也是 32 位长。基本上,如果你有 32 位 CPU——long
你的系统上的类型也是 32 位长的。如果您有 64 位 CPU -long
类型将是 64 位长。
如果您需要自己的 64 位类型 - 只需使用long long
. 如果您希望内核时间 API 与 64 位长类型一起工作,time_t
那就有点困难(意味着更改内核源代码)。例如看看这里。您也可能有兴趣阅读下一个链接:
[1]补丁集:“将 time_t 和 clock_t 更改为 64 位”
[2]有什么办法可以在Linux的32位程序中得到64位time_t
关于__divdi3
更改time_t
为long long
.
现在您已将time_t
大小更改为 64 位,任何使用的代码都time_t
将尝试使用 64 位操作。__divdi3
意思是:对双整数进行除法运算。3代表操作数的数量(如)。有关详细信息,请参阅此。所以这个操作显然没有为你的平台实现。您应该自己实现它(在内核代码中)或以某种方式使用实现。下一个链接应该可以帮助您:1 = 2 / 3
gcc
32 位 Linux 上的 64 位时间支持最初是在5.1 内核中引入的,所以如果您比这更老,对不起。因为更改旧系统调用的返回类型会破坏旧应用程序,所以必须添加新的*time64
系统调用。检查此表,您会发现这些系统调用仅在 32 位平台上可用。
现在,如果您正在为 32 位系统编写代码,您可以clock_gettime64
直接调用(从内联汇编,或从 Csyscall()
函数中)来获取当前时间。然而,在那之后你就完全靠自己了。要获得完整的用户空间支持,您必须使用Linux 5.6 或更高版本以及 musl 1.2+ 或 glibc 2.32+。只需重建您的代码,time_t
将变成 64 位长
所有用户空间都必须使用 64 位编译,
time_t
即将到来的 musl-1.2 和 glibc-2.32 版本以及已安装的 linux-5.6 或更高版本的内核头文件将支持该版本。直接使用系统调用接口的应用程序需要移植以使用
time64
linux-5.1 中添加的系统调用来代替现有的系统调用。这会影响大多数用户futex()
以及seccomp()
拥有自己的运行时环境而不基于 libc 的编程语言。
欲了解更多信息,请阅读