1

我已经编译了内核 3.19.1,但time_t. 只是一个简单的程序,cout << sizeof (time_t);大小为 4 个字节,而不是我的意图是 8 个字节。

我应该在 make menuconfig 期间打开特定选项吗?

4

2 回答 2

2

目前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

[3] time_t typedef 最终是什么?


更新

关于__divdi3更改time_tlong long.

现在您已将time_t大小更改为 64 位,任何使用的代码都time_t将尝试使用 64 位操作。__divdi3意思是:对双整数进行除法运算3代表操作数的数量(如)。有关详细信息,请参阅。所以这个操作显然没有为你的平台实现。您应该自己实现它(在内核代码中)或以某种方式使用实现。下一个链接应该可以帮助您:1 = 2 / 3gcc

[1] __udivdi3 未定义。如何找到代码?

[2] x86 上 gcc 长期使用的 divdi3 除法

[3] udivdi3和umoddi3在gcc哪里找?

于 2015-03-16T19:55:04.180 回答
2

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 或更高版本的内核头文件将支持该版本。

  • 直接使用系统调用接口的应用程序需要移植以使用time64linux-5.1 中添加的系统调用来代替现有的系统调用。这会影响大多数用户futex()以及seccomp()拥有自己的运行时环境而不基于 libc 的编程语言。

https://lkml.org/lkml/2020/1/29/355?anz=web

欲了解更多信息,请阅读

于 2020-11-09T08:15:58.627 回答